public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
* [U-Boot-Users] [PATCH] Functions added to extern for stand alone programs
@ 2007-05-09 19:00 Jeff Mann
  2007-05-09 22:30 ` Wolfgang Denk
  0 siblings, 1 reply; 10+ messages in thread
From: Jeff Mann @ 2007-05-09 19:00 UTC (permalink / raw)
  To: u-boot

[PATCH] Functions added to extern for stand alone programs
 
This patch contains updated to the extern files for stand alone
programs:
-Functions have been added to the extern list
-Function order has been modified to group related function together. 
-XF_VERSION  increased to 4
-Function netboot_common changed from static to extern

The patch file is attached

This is the second patch

This feature does not seem to fall into any category in the list of
U-Boot Custodians, so I guess it goes to you, Wolfgang. 

The patch file is attached. 

-Jeffrey Mann
-------------- next part --------------
A non-text attachment was scrubbed...
Name: add_extern_func.patch
Type: application/octet-stream
Size: 7086 bytes
Desc: add_extern_func.patch
Url : http://lists.denx.de/pipermail/u-boot/attachments/20070509/e5310660/attachment.obj 

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [U-Boot-Users] [PATCH] Functions added to extern for stand alone programs
  2007-05-09 19:00 [U-Boot-Users] [PATCH] Functions added to extern for stand alone programs Jeff Mann
@ 2007-05-09 22:30 ` Wolfgang Denk
  2007-05-10  9:48   ` Amnon Cohen
  2007-05-18 22:32   ` Håvard Skinnemoen
  0 siblings, 2 replies; 10+ messages in thread
From: Wolfgang Denk @ 2007-05-09 22:30 UTC (permalink / raw)
  To: u-boot

In message <1628E43D99629C46988BE46087A3FBB997B7A9@ep-01.EmbeddedPlanet.local> you wrote:
> 
> [PATCH] Functions added to extern for stand alone programs
...
> Content-Transfer-Encoding: base64
> Content-Description: add_extern_func.patch
> Content-Disposition: attachment;
> 	filename=add_extern_func.patch"
> 
> RnJvbSAyMDBhZWNiZjJiM2NlYzA0ZDA5M2RkZGRlMWViNWQxNDA1YmE1ZGVhIE1vbiBTZXAgMTcg
> MDA6MDA6MDAgMjAwMQpGcm9tOiByb290IDxyb290QHVidW50dS4obm9uZSk+CkRhdGU6IFdlZCwg
> OSBNYXkgMjAwNyAxMjo1NjozNSAtMDQwMApTdWJqZWN0OiBbUEFUQ0hdIEZ1bmN0aW9ucyBhZGRl
...

Please post plain text.

...
+#if defined (CONFIG_4xx)	|| defined (CONFIG_MPC5xxx) || defined (CONFIG_74xx_7xx) || \
+    defined (CONFIG_74x)	|| defined (CONFIG_75x)	    || defined (CONFIG_74xx)	 || \
+    defined (CONFIG_MPC8220)|| defined (CONFIG_MPC85xx)	|| defined (CONFIG_MPC86xx)	 || \
+    defined (CONFIG_MPC83XX)
+	gd->jt[XF_out8] = (void *) out8;
+	gd->jt[XF_in8] = (void *) in8;
+	gd->jt[XF_in16] = (void *) in16;
+	gd->jt[XF_out16] = (void *) out16;
+	gd->jt[XF_in32] = (void *) in32;
+	gd->jt[XF_out32] = (void *) out32;
+#endif
+#if (CONFIG_COMMANDS & CFG_CMD_NET)
+	gd->jt[XF_netboot_common] = (void *) netboot_common;
+#endif
+	gd->jt[XF_strcmp] = (void *) strcmp;
+#if (CONFIG_COMMANDS & CFG_CMD_NAND)
+	gd->jt[XF_do_nand] = (void *) do_nand;
+#endif
+#if (CONFIG_COMMANDS & CFG_CMD_DATE)
+	gd->jt[XF_rtc_get] = (void *) rtc_get;
+	gd->jt[XF_do_date] = (void *) do_date;
+#endif
 #if (CONFIG_COMMANDS & CFG_CMD_I2C)
 	gd->jt[XF_i2c_write] = (void *) i2c_write;
 	gd->jt[XF_i2c_read] = (void *) i2c_read;
+	gd->jt[XF_i2c_probe] = (void *) i2c_probe;
 #endif	/* CFG_CMD_I2C */
+#if (CONFIG_COMMANDS & CFG_CMD_USB)
+	gd->jt[XF_usb_init] = (void *) usb_init;
+	gd->jt[XF_usb_stop] = (void *) usb_stop;
+#endif
+#if !defined(CFG_NO_FLASH)
+	gd->jt[XF_flash_write] = (void *) flash_write;
+#endif
+#if (CONFIG_COMMANDS & CFG_CMD_FLASH)
+	gd->jt[XF_do_protect] = (void *) do_protect;
+	gd->jt[XF_do_flerase] = (void *) do_flerase;
+#endif
 }

This #ifdef maze is too much even for my  standards.  And  that  does
mean something.

Is there anybody out there with an idea how to avoid that?

Best regards,

Wolfgang Denk

-- 
DENX Software Engineering GmbH,    CEO: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
If something is different, it's either better or worse,  and  usually
both.                                                    - Larry Wall

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [U-Boot-Users] [PATCH] Functions added to extern for stand alone programs
  2007-05-09 22:30 ` Wolfgang Denk
@ 2007-05-10  9:48   ` Amnon Cohen
  2007-05-10 13:52     ` Jeff Mann
  2007-05-18 22:32   ` Håvard Skinnemoen
  1 sibling, 1 reply; 10+ messages in thread
From: Amnon Cohen @ 2007-05-10  9:48 UTC (permalink / raw)
  To: u-boot

my gut feeling is that

        gd->jt[XF_foo]  = foo;

should happen at the end of the file which defines foo.
This would remove the need for external definitions and ifdef mazes.
But it would require some sort of jt_init function to be called in each file.
This could be done using some linker magic (like module initialization
in the kernel, or cli functions in u-boot)...

- Amnon


On 5/9/07, Wolfgang Denk <wd@denx.de> wrote:
> In message <1628E43D99629C46988BE46087A3FBB997B7A9@ep-01.EmbeddedPlanet.local> you wrote:
> >
> > [PATCH] Functions added to extern for stand alone programs
> ...
> > Content-Transfer-Encoding: base64
> > Content-Description: add_extern_func.patch
> > Content-Disposition: attachment;
> >       filename=add_extern_func.patch"
> >
> > RnJvbSAyMDBhZWNiZjJiM2NlYzA0ZDA5M2RkZGRlMWViNWQxNDA1YmE1ZGVhIE1vbiBTZXAgMTcg
> > MDA6MDA6MDAgMjAwMQpGcm9tOiByb290IDxyb290QHVidW50dS4obm9uZSk+CkRhdGU6IFdlZCwg
> > OSBNYXkgMjAwNyAxMjo1NjozNSAtMDQwMApTdWJqZWN0OiBbUEFUQ0hdIEZ1bmN0aW9ucyBhZGRl
> ...
>
> Please post plain text.
>
> ...
> +#if defined (CONFIG_4xx)       || defined (CONFIG_MPC5xxx) || defined (CONFIG_74xx_7xx) || \
> +    defined (CONFIG_74x)       || defined (CONFIG_75x)     || defined (CONFIG_74xx)     || \
> +    defined (CONFIG_MPC8220)|| defined (CONFIG_MPC85xx)        || defined (CONFIG_MPC86xx)      || \
> +    defined (CONFIG_MPC83XX)
> +       gd->jt[XF_out8] = (void *) out8;
> +       gd->jt[XF_in8] = (void *) in8;
> +       gd->jt[XF_in16] = (void *) in16;
> +       gd->jt[XF_out16] = (void *) out16;
> +       gd->jt[XF_in32] = (void *) in32;
> +       gd->jt[XF_out32] = (void *) out32;
> +#endif
> +#if (CONFIG_COMMANDS & CFG_CMD_NET)
> +       gd->jt[XF_netboot_common] = (void *) netboot_common;
> +#endif
> +       gd->jt[XF_strcmp] = (void *) strcmp;
> +#if (CONFIG_COMMANDS & CFG_CMD_NAND)
> +       gd->jt[XF_do_nand] = (void *) do_nand;
> +#endif
> +#if (CONFIG_COMMANDS & CFG_CMD_DATE)
> +       gd->jt[XF_rtc_get] = (void *) rtc_get;
> +       gd->jt[XF_do_date] = (void *) do_date;
> +#endif
>  #if (CONFIG_COMMANDS & CFG_CMD_I2C)
>         gd->jt[XF_i2c_write] = (void *) i2c_write;
>         gd->jt[XF_i2c_read] = (void *) i2c_read;
> +       gd->jt[XF_i2c_probe] = (void *) i2c_probe;
>  #endif /* CFG_CMD_I2C */
> +#if (CONFIG_COMMANDS & CFG_CMD_USB)
> +       gd->jt[XF_usb_init] = (void *) usb_init;
> +       gd->jt[XF_usb_stop] = (void *) usb_stop;
> +#endif
> +#if !defined(CFG_NO_FLASH)
> +       gd->jt[XF_flash_write] = (void *) flash_write;
> +#endif
> +#if (CONFIG_COMMANDS & CFG_CMD_FLASH)
> +       gd->jt[XF_do_protect] = (void *) do_protect;
> +       gd->jt[XF_do_flerase] = (void *) do_flerase;
> +#endif
>  }
>
> This #ifdef maze is too much even for my  standards.  And  that  does
> mean something.
>
> Is there anybody out there with an idea how to avoid that?
>
> Best regards,
>
> Wolfgang Denk
>
> --
> DENX Software Engineering GmbH,    CEO: Wolfgang Denk & Detlev Zundel
> HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
> Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
> If something is different, it's either better or worse,  and  usually
> both.                                                    - Larry Wall
>
> -------------------------------------------------------------------------
> This SF.net email is sponsored by DB2 Express
> Download DB2 Express C - the FREE version of DB2 express and take
> control of your XML. No limits. Just data. Click to get it now.
> http://sourceforge.net/powerbar/db2/
> _______________________________________________
> U-Boot-Users mailing list
> U-Boot-Users at lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/u-boot-users
>

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [U-Boot-Users] [PATCH] Functions added to extern for stand alone programs
  2007-05-10  9:48   ` Amnon Cohen
@ 2007-05-10 13:52     ` Jeff Mann
  0 siblings, 0 replies; 10+ messages in thread
From: Jeff Mann @ 2007-05-10 13:52 UTC (permalink / raw)
  To: u-boot

> > Content-Transfer-Encoding: base64
I apologize, I KNOW I selected 'plain text'. 

> my gut feeling is that
> 
>         gd->jt[XF_foo]  = foo;
> 
>should happen at the end of the file which defines foo.
> This would remove the need for external definitions and ifdef mazes.
> But it would require some sort of jt_init function to be 
> called in each file.
> This could be done using some linker magic (like module 
> initialization in the kernel, or cli functions in u-boot)...

I suppose that is one solution. "Linker magic" is beyond me, but would
be very clean.

> > This #ifdef maze is too much even for my  standards.  And  
> that  does 
> > mean something.

I didn't think it was that maze-like. The ifdefs are NOT nested, and I
gouped all of the functions with the same ifdefs together in a reaonable
order. Also, the ifdefs were removed from _exports.h and exports.h
because they are not needed there, only when initializing the jump table
in exports.c. But yes, that leads to a lot of them. I was just thinking
about this and I was going to propose something else, but I think that
by splitting up the jump table initialization, it gets even messier. 

-JM

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [U-Boot-Users] [PATCH] Functions added to extern for stand alone programs
  2007-05-09 22:30 ` Wolfgang Denk
  2007-05-10  9:48   ` Amnon Cohen
@ 2007-05-18 22:32   ` Håvard Skinnemoen
  2007-05-23 19:51     ` Jeffrey Mann
  1 sibling, 1 reply; 10+ messages in thread
From: Håvard Skinnemoen @ 2007-05-18 22:32 UTC (permalink / raw)
  To: u-boot

On 5/10/07, Wolfgang Denk <wd@denx.de> wrote:
> +#if (CONFIG_COMMANDS & CFG_CMD_FLASH)
> +       gd->jt[XF_do_protect] = (void *) do_protect;
> +       gd->jt[XF_do_flerase] = (void *) do_flerase;
> +#endif
>  }
>
> This #ifdef maze is too much even for my  standards.  And  that  does
> mean something.
>
> Is there anybody out there with an idea how to avoid that?

The cond_syscall() macro in the Linux kernel might be worth stealing.
How about something like this?

#define cond_extern(name) asm(".weak\t" #name "\n\t.set\t" #name ",
unimpl_extern")

static int unimpl_extern(void)
{
        return -ENOSYS; /* or something more appropriate */
}

cond_extern(do_protect);
cond_extern(do_flerase);

Haavard

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [U-Boot-Users] [PATCH] Functions added to extern for stand alone programs
  2007-05-18 22:32   ` Håvard Skinnemoen
@ 2007-05-23 19:51     ` Jeffrey Mann
  2007-05-23 19:59       ` Wolfgang Denk
  0 siblings, 1 reply; 10+ messages in thread
From: Jeffrey Mann @ 2007-05-23 19:51 UTC (permalink / raw)
  To: u-boot

> >
> > This #ifdef maze is too much even for my  standards.  And  that  does
> > mean something.
> >
> > Is there anybody out there with an idea how to avoid that?
>
> The cond_syscall() macro in the Linux kernel might be worth stealing.
> How about something like this?
>
> #define cond_extern(name) asm(".weak\t" #name "\n\t.set\t" #name ",
> unimpl_extern")

I do not understand what this does. Does it work?

> static int unimpl_extern(void)
> {
>         return -ENOSYS; /* or something more appropriate */
> }

How is this different that using the dummy function?

> cond_extern(do_protect);
> cond_extern(do_flerase);
>

-Jeff

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [U-Boot-Users] [PATCH] Functions added to extern for stand alone programs
  2007-05-23 19:51     ` Jeffrey Mann
@ 2007-05-23 19:59       ` Wolfgang Denk
       [not found]         ` <e68c55e80705231347w76d86bf8o1a1f6001e93f3f72@mail.gmail.com>
  0 siblings, 1 reply; 10+ messages in thread
From: Wolfgang Denk @ 2007-05-23 19:59 UTC (permalink / raw)
  To: u-boot

In message <e68c55e80705231251s678d3e59g2db9ed3da3fce830@mail.gmail.com> you wrote:
>
> > #define cond_extern(name) asm(".weak\t" #name "\n\t.set\t" #name ",
> > unimpl_extern")
> 
> I do not understand what this does. Does it work?

Yes, it does. See file: gcc.info,  node: Function Attributes,
section: 5.24 Declaring Attributes of Functions

> > static int unimpl_extern(void)
> > {
> >         return -ENOSYS; /* or something more appropriate */
> > }
> 
> How is this different that using the dummy function?

The main difference is that with "normal"  functions  you  must  make
sure  that the dummy function does not get compiled / linked when you
implement a real function. "Weak" are simply overwritten if any  user
provides  another  (real) function with the same name. No #ifdef mess
any more :-)

Best regards,

Wolfgang Denk

-- 
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
I'm a programmer: I don't buy software, I write it.
                                                  -- Tom Christiansen

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [U-Boot-Users] [PATCH] Functions added to extern for stand alone programs
       [not found]         ` <e68c55e80705231347w76d86bf8o1a1f6001e93f3f72@mail.gmail.com>
@ 2007-05-23 20:48           ` Jeffrey Mann
  2007-05-23 23:06           ` Wolfgang Denk
  1 sibling, 0 replies; 10+ messages in thread
From: Jeffrey Mann @ 2007-05-23 20:48 UTC (permalink / raw)
  To: u-boot

> >
> > > #define cond_extern(name) asm(".weak\t" #name "\n\t.set\t" #name ",
> > > unimpl_extern")
> >
> > I do not understand what this does. Does it work?
>
> Yes, it does. See file: gcc.info,  node: Function Attributes,
> section: 5.24 Declaring Attributes of Functions
>
> > > static int unimpl_extern(void)
> > > {
> > >         return -ENOSYS; /* or something more appropriate */
> > > }
> >
> > How is this different that using the dummy function?
>
> The main difference is that with "normal"  functions  you  must  make
> sure  that the dummy function does not get compiled / linked when you
> implement a real function. "Weak" are simply overwritten if any  user
> provides  another  (real) function with the same name. No #ifdef mess
> any more :-)



So in practice, it would look something like this?:

void jumptable_init (void)
{
        int i;

        gd->jt = (void **) malloc (XF_MAX * sizeof (void *));
        for (i = 0; i < XF_MAX; i++)
                gd->jt[i] = (void *) dummy;

#define EXPORT_FUNC(name) asm(".weak\t" #name "\n\t.set\t" #name ", dummy");
#include <_exports.h>
#undef EXPORT_FUNC

        gd->jt[XF_get_version] = (void *) get_version;
        gd->jt[XF_malloc] = (void *) malloc;
        gd->jt[XF_free] = (void *) free;
        gd->jt[XF_getenv] = (void *) getenv;
        gd->jt[XF_setenv] = (void *) setenv;
        gd->jt[XF_get_timer] = (void *) get_timer;
        gd->jt[XF_simple_strtoul] = (void *) simple_strtoul;
        gd->jt[XF_udelay] = (void *) udelay;
        gd->jt[XF_install_hdlr] = (void *) irq_install_handler;
        gd->jt[XF_free_hdlr] = (void *) irq_free_handler;
        gd->jt[XF_i2c_write] = (void *) i2c_write;
        gd->jt[XF_i2c_read] = (void *) i2c_read;
      ........

}



it could't really be that simple, could it? I bet my sintax is wrong,
and I still do not compleatly understand how the compiler intreprets
"weak" and "set". But I can see how this would work.

-Jeff

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [U-Boot-Users] [PATCH] Functions added to extern for stand alone programs
       [not found]         ` <e68c55e80705231347w76d86bf8o1a1f6001e93f3f72@mail.gmail.com>
  2007-05-23 20:48           ` Jeffrey Mann
@ 2007-05-23 23:06           ` Wolfgang Denk
  1 sibling, 0 replies; 10+ messages in thread
From: Wolfgang Denk @ 2007-05-23 23:06 UTC (permalink / raw)
  To: u-boot

In message <e68c55e80705231347w76d86bf8o1a1f6001e93f3f72@mail.gmail.com> you wrote:
>
> it could't really be that simple, could it? I bet my sintax is wrong,

Maybe.

> and I still do not compleatly understand how the compiler intreprets
> "weak" and "set". But I can see how this would work.

I never used this assembler trickery before myself. So far, I only
played with the C variant of it. Like that:

-> cat foo.c
#include <stdio.h>

int func(int, int);

int main (void)
{
        int i = func (2, 7);

        printf ("i = %d\n", i);

        return 0;
}
-> cat func.c
#include <stdio.h>

int __func (int a, int b)
{
        printf ("Default func called: %d + %d\n", a, b);

        return (a + b);
}

int func(int a, int b) __attribute__ ((weak, alias ("__func")));
-> cat private.c 
#include <stdio.h>

int func (int a, int b)
{
        printf ("Private func called: %d * %d\n", a, b);

        return (a * b);
}
-> gcc -c *.c
-> gcc -o foo foo.o func.o
-> ./foo
Default func called: 2 + 7
i = 9
-> gcc -o bar foo.o func.o private.o
-> ./bar
Private func called: 2 * 7
i = 14



Best regards,

Wolfgang Denk

-- 
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
It is a human characteristic to love little  animals,  especially  if
they're attractive in some way.
	-- McCoy, "The Trouble with Tribbles", stardate 4525.6

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [U-Boot-Users] [PATCH] Functions added to extern for stand alone programs
       [not found] <1defaf580705241041l77ac1d4jd4e7cf3cb91a455d@mail.gmail.com>
@ 2007-05-24 20:04 ` Jeff Mann
  0 siblings, 0 replies; 10+ messages in thread
From: Jeff Mann @ 2007-05-24 20:04 UTC (permalink / raw)
  To: u-boot

> 
> On 5/24/07, Wolfgang Denk <wd@denx.de> wrote:
> > I never used this assembler trickery before myself. So far, I only 
> > played with the C variant of it. Like that:
> 
> I just tried to imitate the cond_syscall() macro in the Linux kernel.
> Your C variant is perhaps better than the asm trickery --
> cond_syscall() is defined in asm/unistd.h so I suppose it 
> might be arch-specific. The attribute syntax is of course 
> gcc-specific, but u-boot doesn't support other compilers 
> anyway, does it?
> 

The problem I ran into with the C variant was with type conflicts of the function declarations and argument conflicts that I could not find a clean solution to. Without these type conflicts it would have worked.

-Jeff

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2007-05-24 20:04 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-05-09 19:00 [U-Boot-Users] [PATCH] Functions added to extern for stand alone programs Jeff Mann
2007-05-09 22:30 ` Wolfgang Denk
2007-05-10  9:48   ` Amnon Cohen
2007-05-10 13:52     ` Jeff Mann
2007-05-18 22:32   ` Håvard Skinnemoen
2007-05-23 19:51     ` Jeffrey Mann
2007-05-23 19:59       ` Wolfgang Denk
     [not found]         ` <e68c55e80705231347w76d86bf8o1a1f6001e93f3f72@mail.gmail.com>
2007-05-23 20:48           ` Jeffrey Mann
2007-05-23 23:06           ` Wolfgang Denk
     [not found] <1defaf580705241041l77ac1d4jd4e7cf3cb91a455d@mail.gmail.com>
2007-05-24 20:04 ` Jeff Mann

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox