6ed00870ab
Abstracts threading from itself a bit, changes the way its queues are handled and does type hiding for that as well. Do alot here due to already required major brain surgery. Threads may now be on a run queue and a wait queue simultaneously so that the expired timer only has to wake the thread but not remove it from the wait queue which simplifies the implicit wake handling. List formats change for wait queues-- doubly-linked, not circular. Timeout queue is now singly-linked. The run queue is still circular as before. Adds a better thread slot allocator that may keep the slot marked as used regardless of the thread state. Assists in dumping special tasks that switch_thread was tasked to perform (blocking tasks). Deletes alot of code yet surprisingly, gets larger than expected. Well, I'm not not minding that for the time being-- omlettes and break a few eggs and all that. Change-Id: I0834d7bb16b2aecb2f63b58886eeda6ae4f29d59
200 lines
3.8 KiB
Text
200 lines
3.8 KiB
Text
/* Will have been included from app.lds */
|
|
ENTRY(start)
|
|
|
|
OUTPUT_FORMAT(elf32-littlearm)
|
|
OUTPUT_ARCH(arm)
|
|
STARTUP(target/arm/pp/crt0-pp.o)
|
|
|
|
#define PLUGINSIZE PLUGIN_BUFFER_SIZE
|
|
#define CODECSIZE CODEC_SIZE
|
|
|
|
#define DRAMSIZE (MEMORYSIZE * 0x100000) - PLUGINSIZE - CODECSIZE
|
|
|
|
#define DRAMORIG 0x00000000
|
|
#define IRAMORIG 0x40000000
|
|
#define IRAMSIZE 0xc000
|
|
|
|
#ifdef CPU_PP502x
|
|
#define NOCACHE_BASE 0x10000000
|
|
#else
|
|
#define NOCACHE_BASE 0x28000000
|
|
#endif
|
|
|
|
#define CACHEALIGN_SIZE 16
|
|
|
|
/* End of the audio buffer, where the codec buffer starts */
|
|
#define ENDAUDIOADDR (DRAMORIG + DRAMSIZE)
|
|
|
|
/* Where the codec buffer ends, and the plugin buffer starts */
|
|
#define ENDADDR (ENDAUDIOADDR + CODECSIZE)
|
|
|
|
MEMORY
|
|
{
|
|
DRAM : ORIGIN = DRAMORIG, LENGTH = DRAMSIZE
|
|
IRAM : ORIGIN = IRAMORIG, LENGTH = IRAMSIZE
|
|
}
|
|
|
|
SECTIONS
|
|
{
|
|
.text :
|
|
{
|
|
loadaddress = .;
|
|
_loadaddress = .;
|
|
. = ALIGN(0x200);
|
|
*(.init.text)
|
|
*(.text*)
|
|
*(.glue_7)
|
|
*(.glue_7t)
|
|
. = ALIGN(0x4);
|
|
} > DRAM
|
|
|
|
.rodata :
|
|
{
|
|
*(.rodata) /* problems without this, dunno why */
|
|
*(.rodata*)
|
|
*(.rodata.str1.1)
|
|
*(.rodata.str1.4)
|
|
. = ALIGN(0x4);
|
|
} > DRAM
|
|
|
|
.data :
|
|
{
|
|
*(.data*)
|
|
. = ALIGN(0x4);
|
|
} > DRAM
|
|
|
|
#if NOCACHE_BASE != 0
|
|
/* .ncdata section is placed at uncached physical alias address and is
|
|
* loaded at the proper cached virtual address - no copying is
|
|
* performed in the init code */
|
|
.ncdata . + NOCACHE_BASE :
|
|
{
|
|
. = ALIGN(CACHEALIGN_SIZE);
|
|
*(.ncdata*)
|
|
. = ALIGN(CACHEALIGN_SIZE);
|
|
} AT> DRAM
|
|
#endif
|
|
|
|
/DISCARD/ :
|
|
{
|
|
*(.eh_frame)
|
|
}
|
|
|
|
.vectors 0x0 :
|
|
{
|
|
_vectorsstart = .;
|
|
KEEP(*(.vectors));
|
|
_vectorsend = .;
|
|
} AT> DRAM
|
|
|
|
_vectorscopy = LOADADDR(.vectors);
|
|
_noloaddram = LOADADDR(.vectors);
|
|
|
|
.ibss IRAMORIG (NOLOAD) :
|
|
{
|
|
_iedata = .;
|
|
*(.qharray)
|
|
*(.ibss*)
|
|
. = ALIGN(0x4);
|
|
_iend = .;
|
|
} > IRAM
|
|
|
|
.iram _iend :
|
|
{
|
|
_iramstart = .;
|
|
*(.icode*)
|
|
*(.irodata*)
|
|
*(.idata*)
|
|
. = ALIGN(0x4);
|
|
_iramend = .;
|
|
} > IRAM AT> DRAM
|
|
|
|
_iramcopy = LOADADDR(.iram);
|
|
|
|
|
|
.init ENDAUDIOADDR :
|
|
{
|
|
. = ALIGN(4);
|
|
_initstart = .;
|
|
*(.init*)
|
|
_initend = .;
|
|
} AT> DRAM
|
|
|
|
_initcopy = LOADADDR(.init);
|
|
|
|
.idle_stacks (NOLOAD) :
|
|
{
|
|
*(.idle_stacks)
|
|
. = ALIGN(8);
|
|
#if NUM_CORES > 1
|
|
cpu_idlestackbegin = .;
|
|
. += IDLE_STACK_SIZE;
|
|
cpu_idlestackend = .;
|
|
#endif
|
|
cop_idlestackbegin = .;
|
|
. += IDLE_STACK_SIZE;
|
|
cop_idlestackend = .;
|
|
} > IRAM
|
|
|
|
.stack (NOLOAD) :
|
|
{
|
|
*(.stack)
|
|
stackbegin = .;
|
|
. += 0x2000;
|
|
stackend = .;
|
|
} > IRAM
|
|
|
|
/* .bss and .ncbss are treated as a single section to use one init loop to
|
|
* zero it - note "_edata" and "_end" */
|
|
.bss _noloaddram (NOLOAD) :
|
|
{
|
|
_edata = .;
|
|
*(.bss*)
|
|
*(COMMON)
|
|
. = ALIGN(0x4);
|
|
} > DRAM
|
|
|
|
#if NOCACHE_BASE != 0
|
|
.ncbss . + NOCACHE_BASE (NOLOAD):
|
|
{
|
|
. = ALIGN(CACHEALIGN_SIZE);
|
|
*(.ncbss*)
|
|
. = ALIGN(CACHEALIGN_SIZE);
|
|
} AT> DRAM
|
|
#endif
|
|
|
|
/* This will be aligned by preceding alignments */
|
|
.endaddr . - NOCACHE_BASE (NOLOAD) :
|
|
{
|
|
_end = .;
|
|
} > DRAM
|
|
|
|
.audiobuf (NOLOAD) :
|
|
{
|
|
_audiobuffer = .;
|
|
. = ALIGN(0x4);
|
|
audiobuffer = .;
|
|
} > DRAM
|
|
|
|
.audiobufend ENDAUDIOADDR (NOLOAD) :
|
|
{
|
|
#ifdef IPOD_VIDEO
|
|
audiobufend_lds = .;
|
|
#else
|
|
audiobufend = .;
|
|
#endif
|
|
_audiobufend = .;
|
|
} > DRAM
|
|
|
|
.codec ENDAUDIOADDR (NOLOAD) :
|
|
{
|
|
codecbuf = .;
|
|
_codecbuf = .;
|
|
}
|
|
|
|
.plugin ENDADDR (NOLOAD) :
|
|
{
|
|
_pluginbuf = .;
|
|
pluginbuf = .;
|
|
}
|
|
}
|