[U-Boot-Users] [patch] disable caches before booting an app for Blackfin apps
Mike Frysinger
vapier at gentoo.org
Wed Jan 30 13:45:53 CET 2008
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 <vapier at gentoo.org>
> > ---
> > 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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 827 bytes
Desc: This is a digitally signed message part.
Url : http://lists.denx.de/pipermail/u-boot/attachments/20080130/f77249d4/attachment.pgp
More information about the U-Boot
mailing list