allow ports to override bootelf behavior
PATCH 1/1 allow ports to override bootelf behavior
Change the bootelf setup function into a dedicated weak function called do_bootelf_exec. This way ports can control the behavior however they like before/after calling the ELF entry point.
--- common/cmd_elf.c | 33 +++++++++++++++++++++------------ 1 files changed, 21 insertions(+), 12 deletions(-)
common/cmd_elf.c +21 -12
@@ -27,23 +27,34 @@ DECLARE_GLOBAL_DATA_PTR;#define MAX (a,b) ((a) > (b) ? (a) : (b))#endif -static inline void bootelf_setup (int argc,char *argv[]) +int valid_elf_image (unsigned long addr); +unsigned long load_elf_image (unsigned long addr); + +/* Allow ports to override the default behavior */ +__attribute__((weak)) +unsigned long do_bootelf_exec (ulong (*entry)(int ,char *[]),int argc,char *argv[]) { +unsigned long ret; +/* * QNX images require the data cache is disabled. * Data cache is already flushed, so just turn it off. */ -if (dcache_status ()) +int dcache =dcache_status (); +if (dcache)dcache_disable (); -#ifdef CONFIG_BLACKFIN -if (icache_status ()) -icache_disable (); -#endif -} +/* +* pass address parameter as argv[0] (aka command name), +* and all remaining args +*/ + ret =entry (argc, argv); -int valid_elf_image (unsigned long addr); -unsigned long load_elf_image (unsigned long addr); +if (dcache) +dcache_enable (); + +return ret; +}/* ====================================================================== * Interpreter command to boot an arbitrary ELF image from memory.
@@ -68,13 +79,11 @@ int do_bootelf (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])printf ("## Starting application at 0x%08lx ...\n" , addr); -bootelf_setup (argc, argv); -/* * pass address parameter as argv[0] (aka command name), * and all remaining args */ - rc = ((ulong (*)(int ,char *[])) addr) (--argc, &argv[1 ]); + rc =do_bootelf_exec ((void *)addr, argc -1 , argv +1 );if (rc !=0 ) rcode =1 ;
Signature · 1 line
1.5.5
PATCH 1/1 allow ports to override go behavior
Split the arch-specific logic out of the common go code and into a dedicated weak function called do_go_exec() that lives in cpu directories. This will need review from i386/nios people to make sure I didn't break them.
--- common/cmd_boot.c | 33 +++++---------------------------- lib_i386/board.c | 8 ++++++++ lib_nios/board.c | 10 ++++++++++ 3 files changed, 23 insertions(+), 28 deletions(-)
common/cmd_boot.c +5 -28
@@ -28,25 +28,11 @@#include <command.h> #include <net.h> -#if defined(CONFIG_I386 ) -DECLARE_GLOBAL_DATA_PTR ; -#endif - -static inline void go_setup (int argc,char *argv[]) +/* Allow ports to override the default behavior */ +__attribute__((weak)) +unsigned long do_go_exec (ulong (*entry)(int ,char *[]),int argc,char *argv[]) { -#if defined(CONFIG_I386 ) -/* -* x86 does not use a dedicated register to pass the pointer -* to the global_data -*/ - argv[0 ] = (char *)gd; - -#elif defined(CONFIG_BLACKFIN ) -if (dcache_status ()) -dcache_disable (); -if (icache_status ()) -icache_disable (); -#endif +return entry (argc, argv); }int do_go (cmd_tbl_t *cmdtp,int flag,int argc,char *argv[])
@@ -63,20 +49,11 @@ int do_go (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])printf ("## Starting application at 0x%08lX ...\n" , addr); -go_setup (argc, argv); - -#if defined(CONFIG_NIOS ) -/* -* Nios function pointers are address >> 1 -*/ - addr >>=1 ; -#endif -/* * pass address parameter as argv[0] (aka command name), * and all remaining args */ - rc = ((ulong (*)(int ,char *[]))addr) (--argc, &argv[1 ]); + rc =do_go_exec ((void *)addr, argc -1 , argv +1 );if (rc !=0 ) rcode =1 ;printf ("## Application terminated, rc = 0x%lX\n" , rc);
lib_i386/board.c +8 -0
@@ -421,3 +421,11 @@ void hang (void)puts ("### ERROR ### Please RESET the board ###\n" );for (;;); } + +unsigned long do_go_exec (ulong (*entry)(int ,char *[]),int argc,char *argv[]) +{ +/* +* Nios function pointers are address >> 1 +*/ +return (entry >>1 ) (argc, argv); +}
lib_nios/board.c +10 -0
@@ -190,3 +190,13 @@ void hang (void)puts ("### ERROR ### Please reset board ###\n" );for (;;); } + +unsigned long do_go_exec (ulong (*entry)(int ,char *[]),int argc,char *argv[]) +{ +/* +* x86 does not use a dedicated register to pass the pointer +* to the global_data +*/ + argv[-1 ] = (char *)gd; +return entry (argc, argv); +}
Signature · 1 line
1.5.5
Wolfgang Denk
AppliedPATCH 1/1 allow ports to override go behavior
Quoted 8 lines · In message <[email protected]> you wrote:
Split the arch-specific logic out of the common go code and into a dedicated weak function called
do_go_exec()that lives in cpu directories. This will need review from i386/nios people to make sure I didn't break them.--- common/cmd_boot.c | 33 +++++---------------------------- lib_i386/board.c | 8 ++++++++ lib_nios/board.c | 10 ++++++++++ 3 files changed, 23 insertions(+), 28 deletions(-)
Applied, thanks.
Best regards,
Wolfgang Denk
Signature · 5 lines
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 In the bathtub of history the truth is harder to hold than the soap, and much more difficult to find ... - Terry Pratchett, _Sourcery_
Wolfgang Denk
AppliedPATCH 1/1 allow ports to override bootelf behavior
In reply to Mike FrysingerQuoted 6 lines · In message <[email protected]> you wrote:
Change the bootelf setup function into a dedicated weak function called
do_bootelf_exec. This way ports can control the behavior however they like before/after calling the ELF entry point.--- common/cmd_elf.c | 33 +++++++++++++++++++++------------ 1 files changed, 21 insertions(+), 12 deletions(-)
Applied, thanks.
Best regards,
Wolfgang Denk
Signature · 5 lines
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 Question: How does one get fresh air into a Russian church? Answer: One clicks on an icon, and a window opens!
PATCH 1/1 allow ports to override bootelf behavior
Quoted 9 lines · Wolfgang Denk
Quoted 6 lines · In message <[email protected]> you wrote:
Change the bootelf setup function into a dedicated weak function called
do_bootelf_exec. This way ports can control the behavior however they like before/after calling the ELF entry point.--- common/cmd_elf.c | 33 +++++++++++++++++++++------------ 1 files changed, 21 insertions(+), 12 deletions(-)Applied, thanks.
Unfortunately this breaks all 440 ports using elf:
Configuring for sequoia board...
common/libcommon.a(cmd_elf.o): In function `do_bootelf_exec':/home/stefan/git/u-boot/u-boot/common/cmd_elf.c:54: undefined reference to `dcache_enable'
make: *** [u-boot] Error 1
ppc_4xx-size: './u-boot': No such file
No dcache_enble() here currently. I'll send a patch to add dcache_enable() to 440 in a short while. But this could affect other platforms as well.
Best regards,
Stefan
=====================================================================
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-0 Fax: +49-8142-66989-80 Email: office at denx.de
=====================================================================