[U-Boot] [PATCH v2 3/4] api: FreeBSD: flush cache before starting loader/kernel

Alexander Graf agraf at suse.de
Tue Jan 17 21:13:51 CET 2017



On 17/01/2017 16:50, Emmanuel Vadot wrote:
> From: Warner Losh <imp at freebsd.org>
>
> FreeBSD loader(8) just loaded code to some random location that may
> contain stale icache entries.
> FreeBSD Kernel needs the icache and dcache flushed.
> Before running either one of them, flush the icache and dcache.
>
> Signed-off-by: Emmanuel Vadot <manu at bidouilliste.com>

Is there any downside to doing the flush always? I would prefer to not 
conditionalize it on CONFIG_FREEBSD.

> ---
>  api/api.c  | 5 +++++
>  cmd/boot.c | 5 +++++
>  cmd/elf.c  | 8 +++++++-
>  3 files changed, 17 insertions(+), 1 deletion(-)
>
> diff --git a/api/api.c b/api/api.c
> index 8a1433af78..cc25deca09 100644
> --- a/api/api.c
> +++ b/api/api.c
> @@ -290,6 +290,11 @@ static int API_dev_close(va_list ap)
>  	if (!err)
>  		di->state = DEV_STA_CLOSED;
>
> +#ifdef CONFIG_FREEBSD
> +	flush_dcache_all();
> +	invalidate_icache_all();
> +#endif
> +
>  	return err;
>  }
>
> diff --git a/cmd/boot.c b/cmd/boot.c
> index 72f2cf362d..a1a91fbf0a 100644
> --- a/cmd/boot.c
> +++ b/cmd/boot.c
> @@ -19,6 +19,11 @@ __attribute__((weak))
>  unsigned long do_go_exec(ulong (*entry)(int, char * const []), int argc,
>  				 char * const argv[])
>  {
> +#ifdef CONFIG_FREEBSD
> +	flush_dcache_all();
> +	invalidate_icache_all();
> +#endif
> +
>  	return entry (argc, argv);
>  }
>
> diff --git a/cmd/elf.c b/cmd/elf.c
> index 5190cc6c0f..b2827fa042 100644
> --- a/cmd/elf.c
> +++ b/cmd/elf.c
> @@ -109,6 +109,7 @@ static unsigned long do_bootelf_exec(ulong (*entry)(int, char * const[]),
>  {
>  	unsigned long ret;
>
> +#ifndef CONFIG_FREEBSD
>  	/*
>  	 * QNX images require the data cache is disabled.
>  	 * Data cache is already flushed, so just turn it off.
> @@ -116,15 +117,20 @@ static unsigned long do_bootelf_exec(ulong (*entry)(int, char * const[]),
>  	int dcache = dcache_status();
>  	if (dcache)
>  		dcache_disable();

Can FreeBSD boot with dcache disabled? Is there some way we can 
determine what payload we have from the elf header?


Alex


More information about the U-Boot mailing list