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

Alexander Graf agraf at suse.de
Tue Jan 17 21:58:31 CET 2017



On 17/01/2017 21:45, Emmanuel Vadot wrote:
> On Tue, 17 Jan 2017 21:13:51 +0100
> Alexander Graf <agraf at suse.de> wrote:
>
>>
>>
>> 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.
>
>  I don't think there is any downside.
>
>>> ---
>>>  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
>
>  FreeBSD can boot with dcache disabled (our loader and kernel can)
>  I'm not sure I get your other question, sorry.

Your patch #ifdefs out the dcache_disable() if CONFIG_FREEBSD is set. So 
if you can boot just fine with dcache disabled, you can remove this hunk 
altogether FWIW.

All the other changes in this file are mere cache flushes - and they 
shouldn't hurt any u-boot api user and thus could be done unconditionally.


Alex


More information about the U-Boot mailing list