From 07c4254135aecc6ae0964d6d6413a40251e8f6a8 Mon Sep 17 00:00:00 2001 From: Jens Arnold Date: Sun, 8 Jan 2006 22:50:14 +0000 Subject: Don't include the .bss and .ibss sections in the binary image for codecs and plugins. Saves quite some disk space (and buffer space in case of codec changes during playback). git-svn-id: svn://svn.rockbox.org/rockbox/trunk@8308 a1c6a512-1295-4272-9138-f99709370657 --- apps/codecs/a52.c | 3 +++ apps/codecs/alac.c | 7 ++++-- apps/codecs/flac.c | 7 ++++-- apps/codecs/mpa.c | 3 +++ apps/codecs/mpc.c | 3 +++ apps/codecs/shorten.c | 7 ++++-- apps/codecs/vorbis.c | 3 +++ apps/codecs/wav.c | 3 +++ apps/codecs/wavpack.c | 3 +++ apps/plugins/plugin.lds | 48 ++++++++++++++++++++++++++++-------------- apps/plugins/rockboy/cpu.c | 2 +- apps/plugins/rockboy/lcd.c | 2 +- apps/plugins/rockboy/rockboy.c | 3 +++ 13 files changed, 70 insertions(+), 24 deletions(-) diff --git a/apps/codecs/a52.c b/apps/codecs/a52.c index ee80f66892..dd504e83fd 100644 --- a/apps/codecs/a52.c +++ b/apps/codecs/a52.c @@ -117,6 +117,8 @@ void a52_decode_data(uint8_t *start, uint8_t *end) extern char iramcopy[]; extern char iramstart[]; extern char iramend[]; +extern char iedata[]; +extern char iend[]; #endif /* this is the codec entry point */ @@ -132,6 +134,7 @@ enum codec_status codec_start(struct codec_api *api) #ifdef USE_IRAM ci->memcpy(iramstart, iramcopy, iramend - iramstart); + ci->memset(iedata, 0, iend - iedata); #endif ci->configure(CODEC_DSP_ENABLE, (bool *)true); diff --git a/apps/codecs/alac.c b/apps/codecs/alac.c index 58ab111755..30c1ada555 100644 --- a/apps/codecs/alac.c +++ b/apps/codecs/alac.c @@ -21,10 +21,12 @@ #include "libm4a/m4a.h" #include "libalac/decomp.h" -#ifndef SIMULATOR +#ifdef USE_IRAM extern char iramcopy[]; extern char iramstart[]; extern char iramend[]; +extern char iedata[]; +extern char iend[]; #endif int32_t outputbuffer[ALAC_MAX_CHANNELS][ALAC_BLOCKSIZE] IBSS_ATTR; @@ -53,8 +55,9 @@ enum codec_status codec_start(struct codec_api* api) rb = api; ci = (struct codec_api*)api; -#ifndef SIMULATOR +#ifdef USE_IRAM rb->memcpy(iramstart, iramcopy, iramend-iramstart); + rb->memset(iedata, 0, iend - iedata); #endif ci->configure(CODEC_SET_FILEBUF_WATERMARK, (int *)(1024*512)); diff --git a/apps/codecs/flac.c b/apps/codecs/flac.c index 7639b9a352..ae05b0f2aa 100644 --- a/apps/codecs/flac.c +++ b/apps/codecs/flac.c @@ -20,10 +20,12 @@ #include "codeclib.h" #include -#ifndef SIMULATOR +#ifdef USE_IRAM extern char iramcopy[]; extern char iramstart[]; extern char iramend[]; +extern char iedata[]; +extern char iend[]; #endif struct codec_api* rb; @@ -229,8 +231,9 @@ enum codec_status codec_start(struct codec_api* api) rb = api; ci = (struct codec_api*)api; -#ifndef SIMULATOR +#ifdef USE_IRAM ci->memcpy(iramstart, iramcopy, iramend-iramstart); + ci->memset(iedata, 0, iend - iedata); #endif ci->configure(CODEC_SET_FILEBUF_WATERMARK, (int *)(1024*512)); diff --git a/apps/codecs/mpa.c b/apps/codecs/mpa.c index 3e6a0455ff..3d824d9b39 100644 --- a/apps/codecs/mpa.c +++ b/apps/codecs/mpa.c @@ -43,6 +43,8 @@ int mpeg_latency[3] = { 0, 481, 529 }; extern char iramcopy[]; extern char iramstart[]; extern char iramend[]; +extern char iedata[]; +extern char iend[]; #endif struct codec_api *ci; @@ -83,6 +85,7 @@ enum codec_status codec_start(struct codec_api *api) #ifdef USE_IRAM ci->memcpy(iramstart, iramcopy, iramend - iramstart); + ci->memset(iedata, 0, iend - iedata); #endif if (codec_init(api)) diff --git a/apps/codecs/mpc.c b/apps/codecs/mpc.c index db2501525e..207a63ce97 100644 --- a/apps/codecs/mpc.c +++ b/apps/codecs/mpc.c @@ -68,6 +68,8 @@ MPC_SAMPLE_FORMAT sample_buffer[MPC_FRAME_LENGTH*2] IBSS_ATTR; extern char iramcopy[]; extern char iramstart[]; extern char iramend[]; +extern char iedata[]; +extern char iend[]; #endif /* this is the codec entry point */ @@ -83,6 +85,7 @@ enum codec_status codec_start(struct codec_api *api) TEST_CODEC_API(api); #ifdef USE_IRAM ci->memcpy(iramstart, iramcopy, iramend - iramstart); + ci->memset(iedata, 0, iend - iedata); #endif ci->configure(CODEC_DSP_ENABLE, (bool *)true); diff --git a/apps/codecs/shorten.c b/apps/codecs/shorten.c index c58b009ab1..9e679f5ea7 100644 --- a/apps/codecs/shorten.c +++ b/apps/codecs/shorten.c @@ -20,10 +20,12 @@ #include "codeclib.h" #include -#ifndef SIMULATOR +#ifdef USE_IRAM extern char iramcopy[]; extern char iramstart[]; extern char iramend[]; +extern char iedata[]; +extern char iend[]; #endif struct codec_api* rb; @@ -52,8 +54,9 @@ enum codec_status codec_start(struct codec_api* api) rb = api; ci = (struct codec_api*)api; -#ifndef SIMULATOR +#ifdef USE_IRAM ci->memcpy(iramstart, iramcopy, iramend-iramstart); + ci->memset(iedata, 0, iend - iedata); #endif ci->configure(CODEC_SET_FILEBUF_WATERMARK, (int *)(1024*512)); diff --git a/apps/codecs/vorbis.c b/apps/codecs/vorbis.c index 69eba24bb8..795e689e7d 100644 --- a/apps/codecs/vorbis.c +++ b/apps/codecs/vorbis.c @@ -101,6 +101,8 @@ bool vorbis_set_codec_parameters(OggVorbis_File *vf) extern char iramcopy[]; extern char iramstart[]; extern char iramend[]; +extern char iedata[]; +extern char iend[]; #endif /* this is the codec entry point */ @@ -125,6 +127,7 @@ enum codec_status codec_start(struct codec_api *api) #ifdef USE_IRAM rb->memcpy(iramstart, iramcopy, iramend - iramstart); + rb->memset(iedata, 0, iend - iedata); #endif rb->configure(CODEC_DSP_ENABLE, (bool *)true); diff --git a/apps/codecs/wav.c b/apps/codecs/wav.c index 85e24124ab..e86b559caa 100644 --- a/apps/codecs/wav.c +++ b/apps/codecs/wav.c @@ -94,6 +94,8 @@ enum extern char iramcopy[]; extern char iramstart[]; extern char iramend[]; +extern char iedata[]; +extern char iend[]; #endif /* Those are lookup tables, so they should be in the idata section @@ -235,6 +237,7 @@ enum codec_status codec_start(struct codec_api* api) #ifdef USE_IRAM ci->memcpy(iramstart, iramcopy, iramend-iramstart); + ci->memset(iedata, 0, iend - iedata); #endif ci->configure(CODEC_SET_FILEBUF_WATERMARK, (int *)(1024*512)); diff --git a/apps/codecs/wavpack.c b/apps/codecs/wavpack.c index 21c194773b..ff890ba805 100644 --- a/apps/codecs/wavpack.c +++ b/apps/codecs/wavpack.c @@ -40,6 +40,8 @@ static long read_callback (void *buffer, long bytes) extern char iramcopy[]; extern char iramstart[]; extern char iramend[]; +extern char iedata[]; +extern char iend[]; #endif /* this is the codec entry point */ @@ -56,6 +58,7 @@ enum codec_status codec_start(struct codec_api* api) #ifdef USE_IRAM ci->memcpy(iramstart, iramcopy, iramend-iramstart); + ci->memset(iedata, 0, iend - iedata); #endif ci->configure(CODEC_SET_FILEBUF_WATERMARK, (int *)(1024*512)); diff --git a/apps/plugins/plugin.lds b/apps/plugins/plugin.lds index 83825b9035..fc9d4d4efe 100644 --- a/apps/plugins/plugin.lds +++ b/apps/plugins/plugin.lds @@ -60,7 +60,8 @@ MEMORY SECTIONS { - .text : { + .text : + { KEEP(*(.entry)) *(.text*) #if CONFIG_CPU==PP5020 @@ -69,26 +70,25 @@ SECTIONS #endif } > PLUGIN_RAM - .data : { - *(.data*) - } > PLUGIN_RAM - - /DISCARD/ : { - *(.eh_frame) - } - - .bss : { - *(.bss*) - } > PLUGIN_RAM - - .rodata : { + .rodata : + { *(.rodata*) . = ALIGN(0x4); + } > PLUGIN_RAM + + .data : + { + *(.data*) #if defined(ARCH_IRIVER) || defined(ARCH_IPOD) iramcopy = .; #endif } > PLUGIN_RAM + /DISCARD/ : + { + *(.eh_frame) + } + #if defined(ARCH_IRIVER) || defined(ARCH_IPOD) .iram IRAMORIG : AT ( iramcopy) { @@ -96,13 +96,29 @@ SECTIONS *(.icode) *(.irodata) *(.idata) - *(.ibss) iramend = .; } > PLUGIN_IRAM + + .ibss (NOLOAD) : + { + iedata = .; + *(.ibss) + . = ALIGN(0x4); + iend = .; + } > PLUGIN_IRAM + + .bss ADDR(.data) + SIZEOF(.data) + SIZEOF(.iram): +#else + .bss : #endif + { + *(.bss*) + } > PLUGIN_RAM + /* Special trick to avoid a linker error when no other sections are left after garbage collection (plugin not for this platform) */ - .comment 0 : { + .comment 0 : + { KEEP(*(.comment)) } } diff --git a/apps/plugins/rockboy/cpu.c b/apps/plugins/rockboy/cpu.c index 6118633899..5c4abc519f 100644 --- a/apps/plugins/rockboy/cpu.c +++ b/apps/plugins/rockboy/cpu.c @@ -17,7 +17,7 @@ #endif -struct cpu cpu IDATA_ATTR; +struct cpu cpu IBSS_ATTR; diff --git a/apps/plugins/rockboy/lcd.c b/apps/plugins/rockboy/lcd.c index a8f8c695da..883c4952fc 100644 --- a/apps/plugins/rockboy/lcd.c +++ b/apps/plugins/rockboy/lcd.c @@ -15,7 +15,7 @@ struct lcd lcd; -struct scan scan IDATA_ATTR; +struct scan scan IBSS_ATTR; #define BG (scan.bg) #define WND (scan.wnd) diff --git a/apps/plugins/rockboy/rockboy.c b/apps/plugins/rockboy/rockboy.c index 90452e55d6..56773879fa 100644 --- a/apps/plugins/rockboy/rockboy.c +++ b/apps/plugins/rockboy/rockboy.c @@ -42,6 +42,8 @@ const struct { extern char iramcopy[]; extern char iramstart[]; extern char iramend[]; +extern char iedata[]; +extern char iend[]; #endif /* here is a global api struct pointer. while not strictly necessary, @@ -116,6 +118,7 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) #ifdef USE_IRAM memcpy(iramstart, iramcopy, iramend-iramstart); + memset(iedata, 0, iend - iedata); #endif shut=0; cleanshut=0; -- cgit v1.2.3