From 0d4585b28ffcac1b62ed37cee2c34de0515df468 Mon Sep 17 00:00:00 2001 From: Thomas Martitz Date: Thu, 9 Sep 2010 16:17:21 +0000 Subject: Extend lc_open() to also being able to load overlay plugins. For this it needs to look at the plugin header. Since lc_open() doesn't know it's a plugin, the header needs to be changed slightly to include the new lc_header (which needs to be the first element in plugin_header so it can be casted savely). git-svn-id: svn://svn.rockbox.org/rockbox/trunk@28054 a1c6a512-1295-4272-9138-f99709370657 --- apps/codecs/codec_crt0.c | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) (limited to 'apps/codecs/codec_crt0.c') diff --git a/apps/codecs/codec_crt0.c b/apps/codecs/codec_crt0.c index fdb79092f4..c845f79a40 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(); } -- cgit v1.2.3