ARM: linker script: factor out TCM bits

This is a plain move with identical results, and therefore
still broken in the XIP case.

Signed-off-by: Nicolas Pitre <nico@linaro.org>
Tested-by: Chris Brandt <Chris.Brandt@renesas.com>
This commit is contained in:
Nicolas Pitre 2018-03-08 20:19:48 -05:00
parent 9147095896
commit c3146c43db
3 changed files with 62 additions and 108 deletions

View File

@ -144,60 +144,7 @@ SECTIONS
__init_end = .; __init_end = .;
#ifdef CONFIG_HAVE_TCM #ifdef CONFIG_HAVE_TCM
/* ARM_TCM
* We align everything to a page boundary so we can
* free it after init has commenced and TCM contents have
* been copied to its destination.
*/
.tcm_start : {
. = ALIGN(PAGE_SIZE);
__tcm_start = .;
__itcm_start = .;
}
/*
* Link these to the ITCM RAM
* Put VMA to the TCM address and LMA to the common RAM
* and we'll upload the contents from RAM to TCM and free
* the used RAM after that.
*/
.text_itcm ITCM_OFFSET : AT(__itcm_start)
{
__sitcm_text = .;
*(.tcm.text)
*(.tcm.rodata)
. = ALIGN(4);
__eitcm_text = .;
}
/*
* Reset the dot pointer, this is needed to create the
* relative __dtcm_start below (to be used as extern in code).
*/
. = ADDR(.tcm_start) + SIZEOF(.tcm_start) + SIZEOF(.text_itcm);
.dtcm_start : {
__dtcm_start = .;
}
/* TODO: add remainder of ITCM as well, that can be used for data! */
.data_dtcm DTCM_OFFSET : AT(__dtcm_start)
{
. = ALIGN(4);
__sdtcm_data = .;
*(.tcm.data)
. = ALIGN(4);
__edtcm_data = .;
}
/* Reset the dot pointer or the linker gets confused */
. = ADDR(.dtcm_start) + SIZEOF(.data_dtcm);
/* End marker for freeing TCM copy in linked object */
.tcm_end : AT(ADDR(.dtcm_start) + SIZEOF(.data_dtcm)){
. = ALIGN(PAGE_SIZE);
__tcm_end = .;
}
#endif #endif
BSS_SECTION(0, 0, 8) BSS_SECTION(0, 0, 8)

View File

@ -139,60 +139,7 @@ SECTIONS
_edata = .; _edata = .;
#ifdef CONFIG_HAVE_TCM #ifdef CONFIG_HAVE_TCM
/* ARM_TCM
* We align everything to a page boundary so we can
* free it after init has commenced and TCM contents have
* been copied to its destination.
*/
.tcm_start : {
. = ALIGN(PAGE_SIZE);
__tcm_start = .;
__itcm_start = .;
}
/*
* Link these to the ITCM RAM
* Put VMA to the TCM address and LMA to the common RAM
* and we'll upload the contents from RAM to TCM and free
* the used RAM after that.
*/
.text_itcm ITCM_OFFSET : AT(__itcm_start)
{
__sitcm_text = .;
*(.tcm.text)
*(.tcm.rodata)
. = ALIGN(4);
__eitcm_text = .;
}
/*
* Reset the dot pointer, this is needed to create the
* relative __dtcm_start below (to be used as extern in code).
*/
. = ADDR(.tcm_start) + SIZEOF(.tcm_start) + SIZEOF(.text_itcm);
.dtcm_start : {
__dtcm_start = .;
}
/* TODO: add remainder of ITCM as well, that can be used for data! */
.data_dtcm DTCM_OFFSET : AT(__dtcm_start)
{
. = ALIGN(4);
__sdtcm_data = .;
*(.tcm.data)
. = ALIGN(4);
__edtcm_data = .;
}
/* Reset the dot pointer or the linker gets confused */
. = ADDR(.dtcm_start) + SIZEOF(.data_dtcm);
/* End marker for freeing TCM copy in linked object */
.tcm_end : AT(ADDR(.dtcm_start) + SIZEOF(.data_dtcm)){
. = ALIGN(PAGE_SIZE);
__tcm_end = .;
}
#endif #endif
BSS_SECTION(0, 0, 0) BSS_SECTION(0, 0, 0)

View File

@ -113,3 +113,63 @@
__stubs_end = .; \ __stubs_end = .; \
\ \
PROVIDE(vector_fiq_offset = vector_fiq - ADDR(.vectors)); PROVIDE(vector_fiq_offset = vector_fiq - ADDR(.vectors));
#define ARM_TCM \
/* \
* We align everything to a page boundary so we can \
* free it after init has commenced and TCM contents have \
* been copied to its destination. \
*/ \
.tcm_start : { \
. = ALIGN(PAGE_SIZE); \
__tcm_start = .; \
__itcm_start = .; \
} \
\
/* \
* Link these to the ITCM RAM \
* \
* Put VMA to the TCM address and LMA to the common RAM \
* and we'll upload the contents from RAM to TCM and free \
* the used RAM after that. \
*/ \
.text_itcm ITCM_OFFSET : AT(__itcm_start) \
{ \
__sitcm_text = .; \
*(.tcm.text) \
*(.tcm.rodata) \
. = ALIGN(4); \
__eitcm_text = .; \
} \
\
/* \
* Reset the dot pointer, this is needed to create the \
* relative __dtcm_start below (to be used as extern in code). \
*/ \
. = ADDR(.tcm_start) + SIZEOF(.tcm_start) + SIZEOF(.text_itcm); \
\
.dtcm_start : { \
__dtcm_start = .; \
} \
\
/* \
* TODO: add remainder of ITCM as well, \
* that can be used for data! \
*/ \
.data_dtcm DTCM_OFFSET : AT(__dtcm_start) \
{ \
. = ALIGN(4); \
__sdtcm_data = .; \
*(.tcm.data) \
. = ALIGN(4); \
__edtcm_data = .; \
} \
\
/* Reset the dot pointer or the linker gets confused */ \
. = ADDR(.dtcm_start) + SIZEOF(.data_dtcm); \
\
/* End marker for freeing TCM copy in linked object */ \
.tcm_end : AT(ADDR(.dtcm_start) + SIZEOF(.data_dtcm)){ \
. = ALIGN(PAGE_SIZE); \
__tcm_end = .; \
}