8927df4205
Original fix by Marcin: it had a problem because crt0 on imx233 is more complicated than many targets: since we use virtual memory, we first disable the MMU, then move the entire image (including init and itext stuff), then setup a temporary stack to setup the MMU. Only when the MMU is enabled, can we move the init and itext stuff to its right location and finally boot. This requires some trickery because: - the initial move copies everything, including init and itext - the stack overlaps with init and itext to reclaim space - the temporary stack cannot be the same as the main stack to avoid trashing the init and itext code, also it needs to be a physical address Change-Id: Ibaf331c7d90b61f99225d93c9e621eb0f3f8f2dc
139 lines
3 KiB
Text
139 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
|
|
*(.vectors)
|
|
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 (NOLOAD) :
|
|
{
|
|
_audiobuffer = .;
|
|
audiobuffer = .;
|
|
} > DRAM
|
|
|
|
.codec ENDAUDIOADDR (NOLOAD) :
|
|
{
|
|
audiobufend = .;
|
|
_audiobufend = .;
|
|
codecbuf = .;
|
|
_codecbuf = .;
|
|
} > DRAM
|
|
|
|
.plugin ENDADDR (NOLOAD) :
|
|
{
|
|
_pluginbuf = .;
|
|
pluginbuf = .;
|
|
} > DRAM
|
|
}
|