From 9cfae56f922ee209ab1147a95cdefbbc7abc43c2 Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Tue, 26 Aug 2014 14:53:19 -0600 Subject: Add up_addrenv_coherent which will be called before address environment switches --- nuttx/binfmt/libelf/libelf_bind.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) (limited to 'nuttx/binfmt') diff --git a/nuttx/binfmt/libelf/libelf_bind.c b/nuttx/binfmt/libelf/libelf_bind.c index da2dcd4ce..608f65ef7 100644 --- a/nuttx/binfmt/libelf/libelf_bind.c +++ b/nuttx/binfmt/libelf/libelf_bind.c @@ -312,16 +312,19 @@ int elf_bind(FAR struct elf_loadinfo_s *loadinfo, } } -#ifdef CONFIG_ARCH_HAVE_COHERENT_DCACHE +#if defined(CONFIG_ARCH_ADDRENV) /* Ensure that the I and D caches are coherent before starting the newly * loaded module by cleaning the D cache (i.e., flushing the D cache * contents to memory and invalidating the I cache). */ +#if 0 /* REVISIT... has some problems */ + (void)up_addrenv_coherent(&loadinfo->addrenv); +#else up_coherent_dcache(loadinfo->textalloc, loadinfo->textsize); + up_coherent_dcache(loadinfo->dataalloc, loadinfo->datasize); #endif -#ifdef CONFIG_ARCH_ADDRENV /* Restore the original address environment */ status = elf_addrenv_restore(loadinfo); @@ -333,6 +336,16 @@ int elf_bind(FAR struct elf_loadinfo_s *loadinfo, ret = status; } } + +#elif defined(CONFIG_ARCH_HAVE_COHERENT_DCACHE) + /* Ensure that the I and D caches are coherent before starting the newly + * loaded module by cleaning the D cache (i.e., flushing the D cache + * contents to memory and invalidating the I cache). + */ + + up_coherent_dcache(loadinfo->textalloc, loadinfo->textsize); + up_coherent_dcache(loadinfo->dataalloc, loadinfo->datasize); + #endif return ret; -- cgit v1.2.3