diff options
Diffstat (limited to 'apps/codecs/codec_crt0.c')
| -rw-r--r-- | apps/codecs/codec_crt0.c | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/apps/codecs/codec_crt0.c b/apps/codecs/codec_crt0.c index fdb7909..c845f79 100644 --- a/apps/codecs/codec_crt0.c +++ b/apps/codecs/codec_crt0.c @@ -20,15 +20,10 @@ ****************************************************************************/ #include "config.h" -#include "codeclib.h" +#include "codecs.h" struct codec_api *ci DATA_ATTR; -extern unsigned char iramcopy[]; -extern unsigned char iramstart[]; -extern unsigned char iramend[]; -extern unsigned char iedata[]; -extern unsigned char iend[]; extern unsigned char plugin_bss_start[]; extern unsigned char plugin_end_addr[]; @@ -42,14 +37,23 @@ enum codec_status codec_start(void) { #if (CONFIG_PLATFORM & PLATFORM_NATIVE) #ifdef USE_IRAM - ci->memcpy(iramstart, iramcopy, iramend - iramstart); - ci->memset(iedata, 0, iend - iedata); -#endif + extern char iramcopy[], iramstart[], iramend[], iedata[], iend[]; + size_t iram_size = iramend - iramstart; + size_t ibss_size = iend - iedata; + if (iram_size > 0 || ibss_size > 0) + { + ci->memcpy(iramstart, iramcopy, iram_size); + ci->memset(iedata, 0, ibss_size); + /* make the icache (if it exists) up to date with the new code */ + ci->cpucache_invalidate(); + /* barrier to prevent reordering iram copy and BSS clearing, + * because the BSS segment alias the IRAM copy. + */ + asm volatile ("" ::: "memory"); + } +#endif /* PLUGIN_USE_IRAM */ ci->memset(plugin_bss_start, 0, plugin_end_addr - plugin_bss_start); #endif - /* writeback cleared iedata and bss areas, invalidate icache for - * copied code */ - ci->cpucache_invalidate(); return codec_main(); } |