cd9906847b
For reasons that are still unclear, the 'ncbss' region was overlapping the "audiobuffer" when linked with 2.21, but okay with 2.20. Fixed it by making the audiobuffer explcitly use the current position instead of relying on it being implicit. With this change, portalplayer-based targets generate working binaries when built with binutils 2.21 or newer. This bug also theoretically affects imx233/imx31 targets as they also have NOCACHE_BASE games in their linker scripts, but I lack access to one to test with. Change-Id: Idb38ab20f03599b9ed3d4bc0eafe519f38677438
138 lines
3 KiB
Text
138 lines
3 KiB
Text
#include "config.h"
|
|
#include "cpu.h"
|
|
|
|
ENTRY(start)
|
|
OUTPUT_FORMAT(elf32-littlearm)
|
|
OUTPUT_ARCH(arm)
|
|
STARTUP(target/arm/imx233/crt0.o)
|
|
|
|
#define PLUGINSIZE PLUGIN_BUFFER_SIZE
|
|
#define CODECSIZE CODEC_SIZE
|
|
|
|
#define IRAMSIZE IRAM_SIZE
|
|
|
|
#define DRAMSIZE (DRAM_SIZE - PLUGINSIZE - CODECSIZE - FRAME_SIZE - TTB_SIZE)
|
|
|
|
/* End of the audio buffer, where the codec buffer starts */
|
|
#define ENDAUDIOADDR (CACHED_DRAM_ADDR + DRAMSIZE)
|
|
|
|
/* Where the codec buffer ends, and the plugin buffer starts */
|
|
#define ENDADDR (ENDAUDIOADDR + CODEC_SIZE)
|
|
|
|
/* INIT section is the codec buffer */
|
|
#define INITSIZE CODEC_SIZE
|
|
#define INITSTART ENDAUDIOADDR
|
|
|
|
MEMORY
|
|
{
|
|
IRAM : ORIGIN = IRAM_ORIG, LENGTH = IRAMSIZE
|
|
DRAM : ORIGIN = CACHED_DRAM_ADDR, LENGTH = DRAM_SIZE - TTB_SIZE - FRAME_SIZE
|
|
UDRAM : ORIGIN = UNCACHED_DRAM_ADDR, LENGTH = DRAM_SIZE - TTB_SIZE - FRAME_SIZE
|
|
}
|
|
|
|
SECTIONS
|
|
{
|
|
loadaddress = UNCACHED_DRAM_ADDR;
|
|
_loadaddress = UNCACHED_DRAM_ADDR;
|
|
|
|
.dramcopystart (NOLOAD) :
|
|
{
|
|
_dramcopystart = .;
|
|
} > DRAM
|
|
|
|
.text :
|
|
{
|
|
*(.text*)
|
|
*(.data*)
|
|
*(.rodata*)
|
|
} > DRAM
|
|
|
|
_dramtextend = .;
|
|
|
|
.itext :
|
|
{
|
|
_iramstart = .; // always 0
|
|
KEEP(*(.vectors));// otherwise there are no references to it and the linker strip it
|
|
*(.icode*)
|
|
*(.irodata*)
|
|
*(.idata*)
|
|
_iramend = .;
|
|
} > IRAM AT> DRAM
|
|
|
|
_iramcopy = LOADADDR(.itext);
|
|
|
|
.ibss (NOLOAD) :
|
|
{
|
|
_iedata = .;
|
|
*(.qharray)
|
|
*(.ibss*)
|
|
_iend = .;
|
|
} > IRAM
|
|
|
|
.init ENDAUDIOADDR :
|
|
{
|
|
_initstart = .;
|
|
*(.init*)
|
|
_initend = .;
|
|
} AT> DRAM
|
|
|
|
_initcopy = LOADADDR(.init);
|
|
|
|
/* crt0 needs a temporary stack which does not overlap with init and itext
|
|
* and is in physical memory: put it *after* init and itext. A small one suffices */
|
|
crt0_tmpstack_phys = _dramcopyend + 0x200 - CACHED_DRAM_ADDR + UNCACHED_DRAM_ADDR;
|
|
|
|
.dramcopyend (NOLOAD) :
|
|
{
|
|
_dramcopyend = .;
|
|
} > DRAM
|
|
|
|
/* the stack overlaps the init and itext region, to reclaim space */
|
|
.stack _dramtextend (NOLOAD) :
|
|
{
|
|
*(.stack)
|
|
stackbegin = .;
|
|
. += 0x2000;
|
|
stackend = .;
|
|
} > DRAM
|
|
|
|
/* treat .bss and .ncbss as a single section */
|
|
.bss (NOLOAD) :
|
|
{
|
|
_edata = .;
|
|
*(.bss*);
|
|
} > DRAM
|
|
|
|
/* align on cache size boundary to avoid mixing cached and noncached stuff */
|
|
.ncbss . - CACHED_DRAM_ADDR + UNCACHED_DRAM_ADDR (NOLOAD) :
|
|
{
|
|
. = ALIGN(CACHEALIGN_SIZE);
|
|
*(.ncbss*)
|
|
. = ALIGN(CACHEALIGN_SIZE);
|
|
} AT> DRAM
|
|
|
|
.bssendadr . - UNCACHED_DRAM_ADDR + CACHED_DRAM_ADDR (NOLOAD) :
|
|
{
|
|
_end = .;
|
|
} > DRAM
|
|
|
|
.audiobuf _end (NOLOAD) :
|
|
{
|
|
_audiobuffer = .;
|
|
audiobuffer = .;
|
|
} > DRAM
|
|
|
|
.codec ENDAUDIOADDR (NOLOAD) :
|
|
{
|
|
audiobufend = .;
|
|
_audiobufend = .;
|
|
codecbuf = .;
|
|
_codecbuf = .;
|
|
} > DRAM
|
|
|
|
.plugin ENDADDR (NOLOAD) :
|
|
{
|
|
_pluginbuf = .;
|
|
pluginbuf = .;
|
|
} > DRAM
|
|
}
|