bsp/tqm8xx: Use shared linker command file

Update #3339.
This commit is contained in:
Sebastian Huber
2018-03-26 10:36:52 +02:00
parent 11a8296166
commit 1048a165e5
7 changed files with 70 additions and 382 deletions

View File

@@ -22,8 +22,7 @@ rtems_crti.$(OBJEXT): ../../powerpc/shared/start/rtems_crti.S
project_lib_DATA += rtems_crti.$(OBJEXT)
project_lib_DATA += linkcmds
dist_project_lib_DATA += startup/linkcmds.tqm8xx
dist_project_lib_DATA += startup/linkcmds.tqm8xx_base
dist_project_lib_DATA += ../shared/startup/linkcmds.base
noinst_LIBRARIES = libbsp.a
libbsp_a_SOURCES =

View File

@@ -25,9 +25,12 @@
.extern boot_card
.section ".entry"
PUBLIC_VAR (start)
start:
PUBLIC_VAR (_start)
PUBLIC_VAR (bsp_interrupt_stack_start)
PUBLIC_VAR (bsp_interrupt_stack_end)
.section ".bsp_start_text", "ax"
_start:
/*
* basic CPU setup:
@@ -59,12 +62,12 @@ start_1:
* ROM or relocatable startup: copy startup code to SDRAM
*/
/* get start address of text section in RAM */
LA r29, bsp_section_text_start
LA r29, bsp_section_text_begin
/* get start address of text section in ROM (add reloc offset) */
add r30, r20, r29
/* get size of startup code */
LA r28, end_reloc_startup
LA r31, bsp_section_text_start
LA r31, bsp_section_text_begin
sub 28,r28,r31
/* copy startup code from ROM to RAM location */
bl copy_image
@@ -85,7 +88,7 @@ copy_rest_of_text:
/* get start address of text section in ROM (add reloc offset) */
add r30, r20, r29
/* get size of rest of code */
LA r28, bsp_section_text_start
LA r28, bsp_section_text_begin
LA r31, bsp_section_text_size
add r28,r28,r31
sub r28,r28,r29
@@ -95,7 +98,7 @@ copy_rest_of_text:
* ROM or relocatable startup: copy data to SDRAM
*/
/* get start address of data section in RAM */
LA r29, bsp_section_data_start
LA r29, bsp_section_data_begin
/* get start address of data section in ROM (add reloc offset) */
add r30, r20, r29
/* get size of RAM image */
@@ -108,7 +111,7 @@ start_code_in_ram:
/*
* ROM/RAM startup: clear bss in SDRAM
*/
LA r3, bsp_section_bss_start /* get start address of bss section */
LA r3, bsp_section_bss_begin /* get start address of bss section */
LWI r4, bsp_section_bss_size /* get size of bss section */
bl mpc8xx_zero_4 /* Clear the bss section */
/*
@@ -116,7 +119,7 @@ start_code_in_ram:
*/
/* Set stack pointer (common for RAM/ROM startup) */
LA r1, bsp_section_text_start
LA r1, bsp_section_text_begin
addi r1, r1, -0x10 /* Set up stack pointer = beginning of text section - 0x10 */
/* Create NULL */
@@ -282,3 +285,10 @@ mpc8xx_zero_4_tail:
blr
end_reloc_startup:
/* Interrupt stack */
.section ".bsp_rwextra", "aw", @nobits
.align 4
bsp_interrupt_stack_start:
.space 32768
bsp_interrupt_stack_end:

View File

@@ -7,10 +7,10 @@
*/
/*
* Copyright (c) 2008-2012 embedded brains GmbH. All rights reserved.
* Copyright (c) 2008, 2018 embedded brains GmbH. All rights reserved.
*
* embedded brains GmbH
* Obere Lagerstr. 30
* Dornierstr. 4
* 82178 Puchheim
* Germany
* <rtems@embedded-brains.de>
@@ -20,16 +20,15 @@
* http://www.rtems.org/license/LICENSE.
*/
#include <libcpu/powerpc-utility.h>
#include <bsp.h>
#include <bsp/bootcard.h>
#include <bsp/linker-symbols.h>
void bsp_work_area_initialize(void)
{
char *ram_end = (char *) (TQM_BD_INFO.sdram_size - (uint32_t)TopRamReserved);
void *area_start = bsp_work_area_start;
uintptr_t area_size = (uintptr_t) ram_end - (uintptr_t) bsp_work_area_start;
void *area_start = bsp_section_work_begin;
uintptr_t area_size = (uintptr_t) ram_end - (uintptr_t) area_start;
bsp_work_area_initialize_default( area_start, area_size );
}

View File

@@ -96,7 +96,8 @@ void bsp_start( void)
{
uintptr_t interrupt_stack_start = (uintptr_t) bsp_interrupt_stack_start;
uintptr_t interrupt_stack_size = (uintptr_t) bsp_interrupt_stack_size;
uintptr_t interrupt_stack_size = (uintptr_t) bsp_interrupt_stack_end
- interrupt_stack_start;
/*
* Get CPU identification dynamically. Note that the get_ppc_cpu_type()

View File

@@ -0,0 +1,43 @@
/**
* @file
*
* TQM8xx
*/
TopRamReserved = DEFINED(TopRamReserved) ? TopRamReserved : 0;
MEMORY {
EMPTY : ORIGIN = 0, LENGTH = 0
RAM : ORIGIN = 0x10000, LENGTH = 128M - 64k
immr : org = 0xfa200000, l = 16K
ROM : ORIGIN = 0x40000000, LENGTH = 8M
}
REGION_ALIAS ("REGION_START", RAM);
REGION_ALIAS ("REGION_FAST_TEXT", RAM);
REGION_ALIAS ("REGION_FAST_TEXT_LOAD", RAM);
REGION_ALIAS ("REGION_TEXT", RAM);
REGION_ALIAS ("REGION_TEXT_LOAD", RAM);
REGION_ALIAS ("REGION_RODATA", RAM);
REGION_ALIAS ("REGION_RODATA_LOAD", RAM);
REGION_ALIAS ("REGION_FAST_DATA", RAM);
REGION_ALIAS ("REGION_FAST_DATA_LOAD", RAM);
REGION_ALIAS ("REGION_DATA", RAM);
REGION_ALIAS ("REGION_DATA_LOAD", RAM);
REGION_ALIAS ("REGION_BSS", RAM);
REGION_ALIAS ("REGION_RWEXTRA", RAM);
REGION_ALIAS ("REGION_WORK", RAM);
REGION_ALIAS ("REGION_STACK", RAM);
REGION_ALIAS ("REGION_NOCACHE", EMPTY);
REGION_ALIAS ("REGION_NOCACHE_LOAD", EMPTY);
REGION_ALIAS ("REGION_NVRAM", EMPTY);
SECTIONS {
dpram : {
m8xx = .;
_m8xx = .;
/* . += (16 * 1024); this makes the mbx loader crash */
} >immr
}
INCLUDE linkcmds.base

View File

@@ -1,16 +0,0 @@
/**
* @file
*
* TQM8xx
*/
EXTERN (__vectors)
TopRamReserved = DEFINED(TopRamReserved) ? TopRamReserved : 0;
MEMORY {
RAM : ORIGIN = 0x0, LENGTH = 128M
immr : org = 0xfa200000, l = 16K
ROM : ORIGIN = 0x40000000, LENGTH = 8M
}
INCLUDE linkcmds.tqm8xx_base

View File

@@ -1,348 +0,0 @@
/**
* @file
*
* Derived from internal linker script of GNU ld (GNU Binutils) 2.18 for elf32ppc emulation.
*/
OUTPUT_FORMAT ("elf32-powerpc", "elf32-powerpc", "elf32-powerpc")
OUTPUT_ARCH (powerpc)
ENTRY (start)
STARTUP (start.o)
EXTERN (__vectors)
bsp_ram_start = ORIGIN (RAM);
bsp_ram_end = ORIGIN (RAM) + LENGTH (RAM);
bsp_ram_size = LENGTH (RAM);
bsp_rom_start = ORIGIN (ROM);
bsp_rom_end = ORIGIN (ROM) + LENGTH (ROM);
bsp_rom_size = LENGTH (ROM);
bsp_section_align = 32;
MEMORY {
UNEXPECTED_SECTIONS : ORIGIN = 0xffffffff, LENGTH = 0
}
SECTIONS {
dpram :
{
m8xx = .;
_m8xx = .;
/* . += (16 * 1024); this makes the mbx loader crash */
} >immr
/*
* BSP: Exception vectors
*/
.vectors 0x100 : {
*(.vectors)
} > RAM
/*
* BSP: The initial stack will live in this area - between the vectors
* and the text section.
*/
.text 0x10000 : {
/*
* BSP: Start of text section
*/
bsp_section_text_start = .;
/*
* BSP: System startup entry
*/
KEEP (*(.entry))
/*
* BSP: Moved into .text from .init
*/
KEEP (*(.init))
*(.text .stub .text.* .gnu.linkonce.t.*)
KEEP (*(.text.*personality*))
/* .gnu.warning sections are handled specially by elf32.em. */
*(.gnu.warning)
*(.glink)
/*
* BSP: Special FreeBSD sysctl sections
*/
. = ALIGN (16);
__start_set_sysctl_set = .;
*(set_sysctl_*);
__stop_set_sysctl_set = ABSOLUTE(.);
*(set_domain_*);
*(set_pseudo_*);
/*
* BSP: Moved into .text from .*
*/
*(.rodata .rodata.* .gnu.linkonce.r.*)
*(.rodata1)
KEEP (*(SORT(.rtemsroset.*)))
*(.interp)
*(.note.gnu.build-id)
*(.hash)
*(.gnu.hash)
*(.dynsym)
*(.dynstr)
*(.gnu.version)
*(.gnu.version_d)
*(.gnu.version_r)
*(.eh_frame_hdr)
/*
* BSP: Magic PPC stuff
*/
*(.PPC.*)
/*
* BSP: Required by cpukit/score/src/threadhandler.c
*/
PROVIDE (_fini = .);
/*
* BSP: Moved into .text from .fini
*/
KEEP (*(.fini))
. = ALIGN (bsp_section_align);
PROVIDE (__etext = .);
PROVIDE (_etext = .);
PROVIDE (etext = .);
} > RAM
.tdata : {
_TLS_Data_begin = .;
*(.tdata .tdata.* .gnu.linkonce.td.*)
_TLS_Data_end = .;
} > RAM
.tbss : {
_TLS_BSS_begin = .;
*(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon)
_TLS_BSS_end = .;
} > RAM
_TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
_TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
_TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
_TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
_TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
_TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
.sdata2 : {
PROVIDE (_SDA2_BASE_ = 32768);
*(.sdata2 .sdata2.* .gnu.linkonce.s2.*)
. = ALIGN (bsp_section_align);
} > RAM
.sbss2 : {
*(.sbss2 .sbss2.* .gnu.linkonce.sb2.*)
. = ALIGN (bsp_section_align);
/*
* BSP: End and size of text section
*/
bsp_section_text_end = .;
bsp_section_text_size = bsp_section_text_end - bsp_section_text_start;
} > RAM
.data : {
/*
* BSP: Start of data section
*/
bsp_section_data_start = .;
/*
* BSP: Moved into .data from .ctors
*/
/* gcc uses crtbegin.o to find the start of
the constructors, so we make sure it is
first. Because this is a wildcard, it
doesn't matter if the user does not
actually link against crtbegin.o; the
linker won't look for a file to match a
wildcard. The wildcard also means that it
doesn't matter which directory crtbegin.o
is in. */
KEEP (*crtbegin.o(.ctors))
KEEP (*crtbegin?.o(.ctors))
/* We don't want to include the .ctor section from
the crtend.o file until after the sorted ctors.
The .ctor section from the crtend file contains the
end of ctors marker and it must be last */
KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors))
KEEP (*(SORT(.ctors.*)))
KEEP (*(.ctors))
/*
* BSP: Moved into .data from .dtors
*/
KEEP (*crtbegin.o(.dtors))
KEEP (*crtbegin?.o(.dtors))
KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors))
KEEP (*(SORT(.dtors.*)))
KEEP (*(.dtors))
/*
* BSP: Moved into .data from .*
*/
*(.tdata .tdata.* .gnu.linkonce.td.*)
*(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon)
*(.data1)
KEEP (*(.eh_frame))
*(.gcc_except_table .gcc_except_table.*)
KEEP (*(.jcr))
*(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro* .gnu.linkonce.d.rel.ro.*)
*(.fixup)
*(.got1)
*(.got2)
*(.dynamic)
*(.got)
*(.plt)
PROVIDE_HIDDEN (__preinit_array_start = .);
KEEP (*(.preinit_array))
PROVIDE_HIDDEN (__preinit_array_end = .);
PROVIDE_HIDDEN (__init_array_start = .);
KEEP (*(SORT(.init_array.*)))
KEEP (*(.init_array))
PROVIDE_HIDDEN (__init_array_end = .);
PROVIDE_HIDDEN (__fini_array_start = .);
KEEP (*(.fini_array))
KEEP (*(SORT(.fini_array.*)))
PROVIDE_HIDDEN (__fini_array_end = .);
*(.data .data.* .gnu.linkonce.d.*)
KEEP (*(SORT(.rtemsrwset.*)))
KEEP (*(.gnu.linkonce.d.*personality*))
SORT(CONSTRUCTORS)
. = ALIGN (bsp_section_align);
} > RAM
.sdata : {
PROVIDE (_SDA_BASE_ = 32768);
*(.sdata .sdata.* .gnu.linkonce.s.*)
. = ALIGN (bsp_section_align);
_edata = .;
PROVIDE (edata = .);
/*
* BSP: End and size of data section
*/
bsp_section_data_end = .;
bsp_section_data_size = bsp_section_data_end - bsp_section_data_start;
} > RAM
.sbss : {
/*
* BSP: Start of bss section
*/
bsp_section_bss_start = .;
__bss_start = .;
PROVIDE (__sbss_start = .); PROVIDE (___sbss_start = .);
*(.scommon)
*(.dynsbss)
*(.sbss .sbss.* .gnu.linkonce.sb.*)
PROVIDE (__sbss_end = .); PROVIDE (___sbss_end = .);
. = ALIGN (bsp_section_align);
} > RAM
.bss : {
*(COMMON)
*(.dynbss)
*(.bss .bss.* .gnu.linkonce.b.*)
. = ALIGN (bsp_section_align);
__end = .;
_end = .;
PROVIDE (end = .);
/*
* BSP: End and size of bss section
*/
bsp_section_bss_end = .;
bsp_section_bss_size = bsp_section_bss_end - bsp_section_bss_start;
} > RAM
/*
* BSP: Interrupt stack
*/
bsp_interrupt_stack_start = .;
bsp_interrupt_stack_end = bsp_interrupt_stack_start + 32k;
bsp_interrupt_stack_size = bsp_interrupt_stack_end - bsp_interrupt_stack_start;
. = bsp_interrupt_stack_end;
/*
* BSP: Work area start
*/
bsp_work_area_start = .;
/* Stabs debugging sections. */
.stab 0 : { *(.stab) }
.stabstr 0 : { *(.stabstr) }
.stab.excl 0 : { *(.stab.excl) }
.stab.exclstr 0 : { *(.stab.exclstr) }
.stab.index 0 : { *(.stab.index) }
.stab.indexstr 0 : { *(.stab.indexstr) }
.comment 0 : { *(.comment) }
/* DWARF debug sections.
Symbols in the DWARF debugging sections are relative to the beginning
of the section so we begin them at 0. */
/* DWARF 1 */
.debug 0 : { *(.debug) }
.line 0 : { *(.line) }
/* GNU DWARF 1 extensions */
.debug_srcinfo 0 : { *(.debug_srcinfo) }
.debug_sfnames 0 : { *(.debug_sfnames) }
/* DWARF 1.1 and DWARF 2 */
.debug_aranges 0 : { *(.debug_aranges) }
.debug_pubnames 0 : { *(.debug_pubnames) }
/* DWARF 2 */
.debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
.debug_abbrev 0 : { *(.debug_abbrev) }
.debug_line 0 : { *(.debug_line) }
.debug_frame 0 : { *(.debug_frame) }
.debug_str 0 : { *(.debug_str) }
.debug_loc 0 : { *(.debug_loc) }
.debug_macinfo 0 : { *(.debug_macinfo) }
/* SGI/MIPS DWARF 2 extensions */
.debug_weaknames 0 : { *(.debug_weaknames) }
.debug_funcnames 0 : { *(.debug_funcnames) }
.debug_typenames 0 : { *(.debug_typenames) }
.debug_varnames 0 : { *(.debug_varnames) }
/* DWARF 3 */
.debug_pubtypes 0 : { *(.debug_pubtypes) }
.debug_ranges 0 : { *(.debug_ranges) }
/* DWARF extension */
.debug_macro 0 : { *(.debug_macro) }
.gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }
/DISCARD/ : {
*(.note.GNU-stack) *(.gnu_debuglink)
}
/*
* This is a RTEMS specific section to catch all unexpected input
* sections. In case you get an error like
* "section `.unexpected_sections' will not fit in region
* `UNEXPECTED_SECTIONS'"
* you have to figure out the offending input section and add it to the
* appropriate output section definition above.
*/
.unexpected_sections : { *(*) } > UNEXPECTED_SECTIONS
}