On Wednesday 30 January 2008, Rafal Jaworowski wrote: > Hi Mike, > > > It isn't generally save to execute applications outside of U-Boot with > > caches enabled due to the way the Blackfin processor handles caches > > (requires software assistance). This patch disables caches before > > booting an ELF or just booting raw code. The previous discussion on the > > patch was that we wanted to use weaks instead, but that proved to not be > > feasible when multiple symbols are involved, which puts us back at the > > ifdef solution. I've minimized the ugliness by moving the setup step > > outside of the main function. > > > > Signed-off-by: Mike Frysinger <[EMAIL PROTECTED]> > > --- > > diff --git a/common/cmd_boot.c b/common/cmd_boot.c > > index e68f16f..9d4f026 100644 > > --- a/common/cmd_boot.c > > +++ b/common/cmd_boot.c > > @@ -32,6 +32,23 @@ > > DECLARE_GLOBAL_DATA_PTR; > > #endif > > > > +static inline void go_setup(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 > > +} > > + > > int do_go (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) > > { > > ulong addr, rc; > > @@ -46,25 +63,20 @@ 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) > > /* > > - * pass address parameter as argv[0] (aka command name), > > - * and all remaining args > > - */ > > -#if defined(CONFIG_I386) > > - /* > > - * x86 does not use a dedicated register to pass the pointer > > - * to the global_data > > + * Nios function pointers are address >> 1 > > */ > > - argv[0] = (char *)gd; > > + addr >>= 1; > > #endif > > -#if !defined(CONFIG_NIOS) > > - rc = ((ulong (*)(int, char *[]))addr) (--argc, &argv[1]); > > -#else > > + > > /* > > - * Nios function pointers are address >> 1 > > + * pass address parameter as argv[0] (aka command name), > > + * and all remaining args > > */ > > - rc = ((ulong (*)(int, char *[]))(addr>>1)) (--argc, &argv[1]); > > -#endif > > + rc = ((ulong (*)(int, char *[]))addr) (--argc, &argv[1]); > > if (rc != 0) rcode = 1; > > > > printf ("## Application terminated, rc = 0x%lX\n", rc); > > diff --git a/common/cmd_elf.c b/common/cmd_elf.c > > index 2eb7453..4683554 100644 > > --- a/common/cmd_elf.c > > +++ b/common/cmd_elf.c > > @@ -27,6 +27,21 @@ DECLARE_GLOBAL_DATA_PTR; > > #define MAX(a,b) ((a) > (b) ? (a) : (b)) > > #endif > > > > +static inline void bootelf_setup(int argc, char *argv[]) > > +{ > > + /* > > + * QNX images require the data cache is disabled. > > + * Data cache is already flushed, so just turn it off. > > + */ > > + if (dcache_status ()) > > + dcache_disable (); > > + > > Please re-formulate the comment, so it doesn't only refer to QNX, as per > our recent discussion disabling d-cache before running an external app is > considered a generic U-Boot operation, not platform specific, see this > thread:
i dont know anything about the topic. feel free to submit a follow up patch. i merely relocated the existing comment. > Also, I'm wondering if we shouldn't re-enable the cache after returning > from an external app (as they are allowed to do so)? Without doing it we > end up with degraded performance without any notice, require explicit reset > to return to previous state etc. i did see that deficiency in the code ... that'd require the code to stay inline in the function :/ -mike
signature.asc
Description: This is a digitally signed message part.
------------------------------------------------------------------------- This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2008. http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________ U-Boot-Users mailing list U-Boot-Users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/u-boot-users