
On Tue, 17 Jan 2017 21:58:31 +0100 Alexander Graf agraf@suse.de wrote:
On 17/01/2017 21:45, Emmanuel Vadot wrote:
On Tue, 17 Jan 2017 21:13:51 +0100 Alexander Graf agraf@suse.de wrote:
On 17/01/2017 16:50, Emmanuel Vadot wrote:
From: Warner Losh imp@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@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.
Loading the kernel from our loader is much faster with dcache enabled (1 sec instead of 5/7 sec). I guess we can always flush the cache and only disable it for QNX, I'll check if there is a CONFIG_QNX or something like that.
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.
True, I can remove the #ifdefs on CONFIG_FREEBSD here.
Alex