Skip to content

Commit

Permalink
ARM: linker script: factor out TCM bits
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Nicolas Pitre committed Mar 10, 2018
1 parent 9147095 commit c3146c4
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 108 deletions.
55 changes: 1 addition & 54 deletions arch/arm/kernel/vmlinux-xip.lds.S
Original file line number Diff line number Diff line change
Expand Up @@ -144,60 +144,7 @@ SECTIONS
__init_end = .;

#ifdef CONFIG_HAVE_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 = .;
}
ARM_TCM
#endif

BSS_SECTION(0, 0, 8)
Expand Down
55 changes: 1 addition & 54 deletions arch/arm/kernel/vmlinux.lds.S
Original file line number Diff line number Diff line change
Expand Up @@ -139,60 +139,7 @@ SECTIONS
_edata = .;

#ifdef CONFIG_HAVE_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 = .;
}
ARM_TCM
#endif

BSS_SECTION(0, 0, 0)
Expand Down
60 changes: 60 additions & 0 deletions arch/arm/kernel/vmlinux.lds.h
Original file line number Diff line number Diff line change
Expand Up @@ -113,3 +113,63 @@
__stubs_end = .; \
\
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 = .; \
}

0 comments on commit c3146c4

Please sign in to comment.