mirror of
https://github.com/Rockbox/rockbox.git
synced 2026-10-10 08:03:04 -04:00
Clean up .ncdata/ncbss hackery in plugin linker script
The mess here can be reduced by paying careful attention to how the linker allocates LMAs/VMAs within MEMORY regions. Changing the way .ncdata and .ncbss are defined so that they reserve the LMA/VMA ranges they use in PLUGIN_RAM removes the need to explicitly set the VMAs of other sections, cutting down on the number of ifdefs needed and making the script a bit simpler. Change-Id: I316fc6e8dedd621537261d52c1ec7c20ec09438a
This commit is contained in:
parent
bce2c4e069
commit
92b0bf7a27
1 changed files with 47 additions and 25 deletions
|
|
@ -281,25 +281,18 @@ SECTIONS
|
||||||
} > PLUGIN_RAM
|
} > PLUGIN_RAM
|
||||||
|
|
||||||
#if NOCACHE_BASE != 0
|
#if NOCACHE_BASE != 0
|
||||||
.ncdata . + NOCACHE_BASE :
|
/*
|
||||||
|
* Allocate .ncdata based on the following constraints:
|
||||||
|
*
|
||||||
|
* 1. the LMA must be allocated at the next free LMA in
|
||||||
|
* PLUGIN_RAM and aligned to a cacheline boundary.
|
||||||
|
* 2. the VMA - LMA offset must equal NOCACHE_BASE.
|
||||||
|
*/
|
||||||
|
.ncdata ALIGN(. + NOCACHE_BASE, CACHEALIGN_SIZE) : ALIGN(CACHEALIGN_SIZE)
|
||||||
{
|
{
|
||||||
. = ALIGN(CACHEALIGN_SIZE);
|
|
||||||
*(.ncdata*)
|
*(.ncdata*)
|
||||||
. = ALIGN(CACHEALIGN_SIZE);
|
. = ALIGN(CACHEALIGN_SIZE);
|
||||||
/* EABI currently needs these defined here, otherwise .iram and .bss can
|
|
||||||
sometimes have an incorrect load address, breaking codecs and plugins. */
|
|
||||||
bssaddr = . - NOCACHE_BASE;
|
|
||||||
#if defined(IRAMSIZE) && IRAMSIZE != 0
|
|
||||||
iramcopy = . - NOCACHE_BASE;
|
|
||||||
#endif
|
|
||||||
} AT> PLUGIN_RAM
|
} AT> PLUGIN_RAM
|
||||||
/* This definition is used when NOCACHE_BASE is 0. The address offset bug only
|
|
||||||
seems to occur when the empty .ncdata is present. */
|
|
||||||
#else
|
|
||||||
bssaddr = .;
|
|
||||||
#if defined(IRAMSIZE) && IRAMSIZE != 0
|
|
||||||
iramcopy = .;
|
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/DISCARD/ :
|
/DISCARD/ :
|
||||||
|
|
@ -311,7 +304,7 @@ SECTIONS
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
.bss bssaddr (NOLOAD) :
|
.bss (NOLOAD) :
|
||||||
{
|
{
|
||||||
plugin_bss_start = .;
|
plugin_bss_start = .;
|
||||||
_plugin_bss_start = .;
|
_plugin_bss_start = .;
|
||||||
|
|
@ -324,29 +317,47 @@ SECTIONS
|
||||||
} > PLUGIN_RAM
|
} > PLUGIN_RAM
|
||||||
|
|
||||||
#if NOCACHE_BASE != 0
|
#if NOCACHE_BASE != 0
|
||||||
.ncbss . + NOCACHE_BASE (NOLOAD) :
|
/*
|
||||||
|
* .ncbss has the same constraints as the .ncdata section
|
||||||
|
* above but there is an extra complication: because it is
|
||||||
|
* a NOLOAD section, unlike .ncdata it cannot consume any
|
||||||
|
* VMAs or LMAs in PLUGIN_RAM itself.
|
||||||
|
*
|
||||||
|
* Because free VMA/LMAs in PLUGIN_RAM are unchanged, any
|
||||||
|
* subsequent sections will get placed at the end of the
|
||||||
|
* .bss section, overlapping .ncbss, which we don't want.
|
||||||
|
*
|
||||||
|
* One solution is to manually place the next sections to
|
||||||
|
* account for the size of .ncbss, but a cleaner solution
|
||||||
|
* is to define a dummy section (.ncbss_vma) allocated at
|
||||||
|
* the same VMA as .ncbss and equal in size, and placed in
|
||||||
|
* the PLUGIN_RAM region. This allocates the correct VMA
|
||||||
|
* range in plugin RAM so that the next section will not
|
||||||
|
* overlap .ncbss.
|
||||||
|
*/
|
||||||
|
.ncbss ALIGN(. + NOCACHE_BASE, CACHEALIGN_SIZE) (NOLOAD) : ALIGN(CACHEALIGN_SIZE)
|
||||||
{
|
{
|
||||||
. = ALIGN(CACHEALIGN_SIZE);
|
|
||||||
*(.ncbss*)
|
*(.ncbss*)
|
||||||
. = ALIGN(CACHEALIGN_SIZE);
|
. = ALIGN(CACHEALIGN_SIZE);
|
||||||
/* We won't trust this one any more than with .ncdata */
|
|
||||||
pluginendaddr = . - NOCACHE_BASE;
|
|
||||||
} AT> PLUGIN_RAM
|
} AT> PLUGIN_RAM
|
||||||
#else
|
|
||||||
pluginendaddr = .;
|
.ncbss_vma (NOLOAD) : ALIGN(CACHEALIGN_SIZE)
|
||||||
|
{
|
||||||
|
. += SIZEOF(.ncbss);
|
||||||
|
} > PLUGIN_RAM
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Final end of plugin after IRAM setup. The plugin or codec buffer
|
/* Final end of plugin after IRAM setup. The plugin or codec buffer
|
||||||
is considered unused by the in-RAM image at this point once IRAM
|
is considered unused by the in-RAM image at this point once IRAM
|
||||||
is copied. */
|
is copied. */
|
||||||
.pluginend pluginendaddr :
|
.pluginend (NOLOAD) :
|
||||||
{
|
{
|
||||||
_plugin_end_addr = .;
|
_plugin_end_addr = .;
|
||||||
plugin_end_addr = .;
|
plugin_end_addr = .;
|
||||||
}
|
} > PLUGIN_RAM
|
||||||
|
|
||||||
#if defined(IRAMSIZE) && IRAMSIZE != 0
|
#if defined(IRAMSIZE) && IRAMSIZE != 0
|
||||||
.iram IRAMORIG : AT (iramcopy)
|
.iram IRAMORIG : AT(LOADADDR(.bss))
|
||||||
{
|
{
|
||||||
iramstart = .;
|
iramstart = .;
|
||||||
*(.icode)
|
*(.icode)
|
||||||
|
|
@ -354,6 +365,7 @@ SECTIONS
|
||||||
*(.idata)
|
*(.idata)
|
||||||
iramend = .;
|
iramend = .;
|
||||||
} > PLUGIN_IRAM
|
} > PLUGIN_IRAM
|
||||||
|
iramcopy = LOADADDR(.iram);
|
||||||
|
|
||||||
.ibss (NOLOAD) :
|
.ibss (NOLOAD) :
|
||||||
{
|
{
|
||||||
|
|
@ -384,3 +396,13 @@ SECTIONS
|
||||||
KEEP(*(.comment))
|
KEEP(*(.comment))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if NOCACHE_BASE != 0
|
||||||
|
/* Some asserts to make sure nocache sections appear correctly defined */
|
||||||
|
ASSERT(LOADADDR(.ncdata) == ADDR(.ncdata) - NOCACHE_BASE, ".ncdata has incorrect LMA/VMA address");
|
||||||
|
ASSERT(LOADADDR(.ncdata) % CACHEALIGN_SIZE == 0, ".ncdata incorrectly aligned");
|
||||||
|
ASSERT(LOADADDR(.ncbss) == ADDR(.ncbss) - NOCACHE_BASE, ".ncbss has incorrect LMA/VMA address");
|
||||||
|
ASSERT(LOADADDR(.ncbss) % CACHEALIGN_SIZE == 0, ".ncbss incorrectly aligned");
|
||||||
|
ASSERT(ADDR(.ncbss_vma) == LOADADDR(.ncbss), ".ncbss_vma has wrong address");
|
||||||
|
ASSERT(SIZEOF(.ncbss_vma) == SIZEOF(.ncbss), ".ncbss_vma has wrong size");
|
||||||
|
#endif
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue