mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2026-09-24 03:15:00 +08:00
bsp/virtex: Replace low-level BSP start code
Use linkcmds.base. Use EABI with small-data area.
This commit is contained in:
@@ -15,12 +15,17 @@ endif
|
||||
|
||||
nodist_include_HEADERS = include/bspopts.h
|
||||
nodist_include_bsp_HEADERS = ../../shared/include/bootcard.h
|
||||
|
||||
include_bsp_HEADERS =
|
||||
|
||||
DISTCLEANFILES = include/bspopts.h
|
||||
|
||||
noinst_PROGRAMS =
|
||||
|
||||
include_HEADERS += include/coverhd.h
|
||||
|
||||
include_bsp_HEADERS += ../shared/include/linker-symbols.h
|
||||
|
||||
noinst_LIBRARIES = libbspstart.a
|
||||
libbspstart_a_SOURCES = start/start.S
|
||||
project_lib_DATA = start.$(OBJEXT)
|
||||
@@ -28,6 +33,10 @@ project_lib_DATA = start.$(OBJEXT)
|
||||
libbspstart_a_SOURCES += ../../powerpc/shared/start/rtems_crti.S
|
||||
project_lib_DATA += rtems_crti.$(OBJEXT)
|
||||
|
||||
# Link commands
|
||||
project_lib_DATA += startup/linkcmds
|
||||
dist_project_lib_DATA += ../shared/startup/linkcmds.base
|
||||
|
||||
noinst_LIBRARIES += libbsp.a
|
||||
libbsp_a_SOURCES =
|
||||
|
||||
@@ -37,11 +46,13 @@ libbsp_a_SOURCES += ../../shared/bspclean.c ../../shared/bspgetworkarea.c \
|
||||
../../shared/bsppost.c startup/bspstart.c ../../shared/bootcard.c \
|
||||
../../shared/bsppredriverhook.c ../../shared/bsppretaskinghook.c \
|
||||
../../shared/sbrk.c ../../shared/gnatinstallhandler.c
|
||||
libbsp_a_SOURCES += ../shared/src/bsp-start-zero.S
|
||||
|
||||
# bspconsole
|
||||
libbsp_a_SOURCES += console/consolelite.c ../../shared/console.c \
|
||||
../../shared/console_select.c ../../shared/console_control.c \
|
||||
../../shared/console_read.c ../../shared/console_write.c
|
||||
include_bsp_HEADERS = include/opbintctrl.h
|
||||
include_bsp_HEADERS += include/opbintctrl.h
|
||||
# opbintctrl
|
||||
libbsp_a_SOURCES += opbintctrl/opbintctrl.c
|
||||
|
||||
|
||||
@@ -46,41 +46,36 @@ clock rate: 234 MHz
|
||||
ROM: 16MByte FLASH
|
||||
RAM: 64MByte DRAM
|
||||
|
||||
virtex only supports single processor operations.
|
||||
Virtex only supports single processor operations.
|
||||
|
||||
Configuration
|
||||
-------------
|
||||
|
||||
Porting
|
||||
-------
|
||||
This board support package is written for a typical virtex/PPC FPGA
|
||||
system. The rough features of such a board are described above.
|
||||
|
||||
When a new virtex FPGA system is created (using the Xilinx design
|
||||
software), a parameter file "xparameters.h" is also created, which
|
||||
describes the basic features of the hardware (like peripherals
|
||||
inculded, interrupt routing etc).
|
||||
included, interrupt routing etc.).
|
||||
|
||||
This BSP normally takes its basic HW description for the file
|
||||
"xparameters_dflt.h", which describes my FPGA system. When this BSP
|
||||
should run on a different hardware, a path to the proper
|
||||
"xparameters.h" can be provided on the "configure" command line.
|
||||
|
||||
For adapting this BSP to other boards,
|
||||
|
||||
the following files should be
|
||||
modified:
|
||||
|
||||
- c/src/lib/libbsp/powerpc/virtex/startup/linkcmds
|
||||
for the memory layout required
|
||||
|
||||
- c/src/lib/libbsp/powerpc/virtex/startup/bspstart.c
|
||||
Here you can select the clock source for the timers and the
|
||||
serial interface (system clock or external clock pin), the clock
|
||||
rates, initial baud rate and other stuff
|
||||
|
||||
- c/src/lib/libbsp/powerpc/virtex/include/bsp.h
|
||||
some BSP-related constants
|
||||
|
||||
- c/src/lib/libbsp/powerpc/virtex/*
|
||||
well, they should be generic, so there _should_ be no reason
|
||||
to mess around there (but who knows...)
|
||||
|
||||
For adapting this BSP to other boards, you can specify several configuration
|
||||
options at the configure command line (use "./configure --help" in this
|
||||
directory). Here is an example for the top-level configure invocation:
|
||||
|
||||
/path/to/rtems/sources/configure \
|
||||
--target=powerpc-rtems4.11 \
|
||||
--enable-rtemsbsp=virtex \
|
||||
--enable-maintainer-mode \
|
||||
--enable-posix \
|
||||
--enable-tests \
|
||||
--disable-networking \
|
||||
'RTEMS_XPARAMETERS_H="/path/to/xparameters.h"' \
|
||||
VIRTEX_RAM_ORIGIN=0xfffc0000 \
|
||||
VIRTEX_RAM_LENGTH=0x3ffec \
|
||||
VIRTEX_RESET_ORIGIN=0xffffffec
|
||||
|
||||
@@ -17,6 +17,9 @@ RTEMS_CHECK_NETWORKING
|
||||
|
||||
AM_CONDITIONAL(HAS_NETWORKING,test "$HAS_NETWORKING" = "yes")
|
||||
|
||||
RTEMS_BSPOPTS_SET([BSP_START_STACK_SIZE],[*],[4096])
|
||||
RTEMS_BSPOPTS_HELP([BSP_START_STACK_SIZE],[size of low-level start stack])
|
||||
|
||||
RTEMS_BSPOPTS_SET([PPC_USE_SPRG],[*],[1])
|
||||
RTEMS_BSPOPTS_HELP([PPC_USE_SPRG],
|
||||
[If defined, then the PowerPC specific code in RTEMS will use some
|
||||
@@ -32,17 +35,32 @@ RTEMS_BSPOPTS_HELP([PPC_VECTOR_FILE_BASE],
|
||||
RTEMS_BSPOPTS_SET([RTEMS_XPARAMETERS_H],[*],[\<xparameters_dflt.h\>])
|
||||
RTEMS_BSPOPTS_HELP([RTEMS_XPARAMETERS_H],
|
||||
[This defines the location of the hardware specific "xparameters.h" file.
|
||||
in the file system. Specify an absolute path. Don't forget the double quotes])
|
||||
in the file system. Specify an absolute path. Do not forget the double quotes])
|
||||
|
||||
#RSG Start - Actually, I think this is wrong
|
||||
RTEMS_BSPOPTS_SET([RTEMS_XPPC_BASE],[*],[.])
|
||||
RTEMS_BSPOPTS_HELP([RTEMS_XPPC_BASE],[Defines path to Xilinx XPS PPC libraries.])
|
||||
#RSG End
|
||||
|
||||
AC_DEFUN([VIRTEX_REGION],[
|
||||
AC_ARG_VAR([$1],[$2; default $3])dnl
|
||||
[$1]=[$]{[$1]:-[$3]}
|
||||
])
|
||||
|
||||
VIRTEX_REGION([VIRTEX_RAM_ORIGIN],[normal RAM region origin],[0x0])
|
||||
VIRTEX_REGION([VIRTEX_RAM_LENGTH],[normal RAM region length],[0x7ffffec])
|
||||
VIRTEX_REGION([VIRTEX_FAST_RAM_ORIGIN],[fast RAM region origin],[0x0])
|
||||
VIRTEX_REGION([VIRTEX_FAST_RAM_LENGTH],[fast RAM region length],[0x0])
|
||||
VIRTEX_REGION([VIRTEX_RESET_ORIGIN],[reset region origin],[0x7ffffec])
|
||||
VIRTEX_REGION([VIRTEX_RESET_LENGTH],[reset region length],[0x14])
|
||||
|
||||
RTEMS_BSP_CLEANUP_OPTIONS(0, 1)
|
||||
|
||||
# Explicitly list all Makefiles here
|
||||
AC_CONFIG_FILES([Makefile])
|
||||
AC_CONFIG_FILES([
|
||||
Makefile
|
||||
startup/linkcmds
|
||||
])
|
||||
|
||||
RTEMS_PPC_EXCEPTIONS
|
||||
|
||||
|
||||
@@ -61,6 +61,8 @@ extern "C" {
|
||||
#include <bsp/vectors.h>
|
||||
#include <bsp/default-initial-extension.h>
|
||||
|
||||
#define BSP_INTERRUPT_STACK_AT_WORK_AREA_BEGIN
|
||||
|
||||
/* miscellaneous stuff assumed to exist */
|
||||
extern bool bsp_timer_internal_clock; /* TRUE, when timer runs with CPU clk */
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ RTEMS_CPU_MODEL=ppc405
|
||||
# This contains the compiler options necessary to select the CPU model
|
||||
# and (hopefully) optimize for it.
|
||||
#
|
||||
CPU_CFLAGS = -mcpu=403 -Dppc405
|
||||
CPU_CFLAGS = -mcpu=403 -Dppc405 -meabi -msdata -fno-common
|
||||
|
||||
# optimize flag: typically -0, could use -O4 or -fast
|
||||
# -O4 is ok for RTEMS
|
||||
|
||||
@@ -66,6 +66,10 @@ $(PROJECT_INCLUDE)/coverhd.h: include/coverhd.h $(PROJECT_INCLUDE)/$(dirstamp)
|
||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/coverhd.h
|
||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/coverhd.h
|
||||
|
||||
$(PROJECT_INCLUDE)/bsp/linker-symbols.h: ../shared/include/linker-symbols.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
|
||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/linker-symbols.h
|
||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/linker-symbols.h
|
||||
|
||||
$(PROJECT_LIB)/start.$(OBJEXT): start.$(OBJEXT) $(PROJECT_LIB)/$(dirstamp)
|
||||
$(INSTALL_DATA) $< $(PROJECT_LIB)/start.$(OBJEXT)
|
||||
TMPINSTALL_FILES += $(PROJECT_LIB)/start.$(OBJEXT)
|
||||
@@ -76,7 +80,11 @@ TMPINSTALL_FILES += $(PROJECT_LIB)/rtems_crti.$(OBJEXT)
|
||||
|
||||
$(PROJECT_LIB)/linkcmds: startup/linkcmds $(PROJECT_LIB)/$(dirstamp)
|
||||
$(INSTALL_DATA) $< $(PROJECT_LIB)/linkcmds
|
||||
PREINSTALL_FILES += $(PROJECT_LIB)/linkcmds
|
||||
TMPINSTALL_FILES += $(PROJECT_LIB)/linkcmds
|
||||
|
||||
$(PROJECT_LIB)/linkcmds.base: ../shared/startup/linkcmds.base $(PROJECT_LIB)/$(dirstamp)
|
||||
$(INSTALL_DATA) $< $(PROJECT_LIB)/linkcmds.base
|
||||
PREINSTALL_FILES += $(PROJECT_LIB)/linkcmds.base
|
||||
|
||||
$(PROJECT_INCLUDE)/bsp/opbintctrl.h: include/opbintctrl.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
|
||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/opbintctrl.h
|
||||
|
||||
@@ -1,156 +1,116 @@
|
||||
/*
|
||||
* This file contains the entry code for RTEMS programs starting
|
||||
* after download to RAM
|
||||
* Copyright (c) 2010-2013 embedded brains GmbH. All rights reserved.
|
||||
*
|
||||
* Author: Thomas Doerfler <td@imd.m.isar.de>
|
||||
* IMD Ingenieurbuero fuer Microcomputertechnik
|
||||
* embedded brains GmbH
|
||||
* Dornierstr. 4
|
||||
* 82178 Puchheim
|
||||
* Germany
|
||||
* <rtems@embedded-brains.de>
|
||||
*
|
||||
* COPYRIGHT (c) 1998 by IMD
|
||||
*
|
||||
* Changes from IMD are covered by the original distributions terms.
|
||||
* This file has been derived from the papyrus BSP:
|
||||
*
|
||||
* This file contains the entry veneer for RTEMS programs
|
||||
* downloaded to Papyrus.
|
||||
*
|
||||
* Author: Andrew Bray <andy@i-cubed.co.uk>
|
||||
*
|
||||
* COPYRIGHT (c) 1995 by i-cubed ltd.
|
||||
*
|
||||
* To anyone who acknowledges that this file is provided "AS IS"
|
||||
* without any express or implied warranty:
|
||||
* permission to use, copy, modify, and distribute this file
|
||||
* for any purpose is hereby granted without fee, provided that
|
||||
* the above copyright notice and this notice appears in all
|
||||
* copies, and that the name of i-cubed limited not be used in
|
||||
* advertising or publicity pertaining to distribution of the
|
||||
* software without specific, written prior permission.
|
||||
* i-cubed limited makes no representations about the suitability
|
||||
* of this software for any purpose.
|
||||
*
|
||||
* derived from "helas403/dlentry.S":
|
||||
* Id: dlentry.S,v 1.2 2000/08/02 16:30:57 joel Exp
|
||||
* The license and distribution terms for this file may be
|
||||
* found in the file LICENSE in this distribution or at
|
||||
* http://www.rtems.com/license/LICENSE.
|
||||
*/
|
||||
|
||||
#include <rtems/asm.h>
|
||||
|
||||
/*
|
||||
* The virtex ELF link scripts support three special sections:
|
||||
* .entry The actual entry point
|
||||
* .vectors The section containing the interrupt entry veneers.
|
||||
*/
|
||||
#include <bspopts.h>
|
||||
|
||||
/*
|
||||
* Downloaded code loads the vectors separately to 0x00000100,
|
||||
* so .entry can be over 256 bytes.
|
||||
*
|
||||
* The other sections are linked in the following order:
|
||||
* .entry
|
||||
* .text
|
||||
* .data
|
||||
* .bss
|
||||
* see linker command file for section placement
|
||||
*
|
||||
* The initial stack is set to stack.end
|
||||
*
|
||||
* All the entry veneer has to do is to clear the BSS.
|
||||
*/
|
||||
#include <libcpu/powerpc-utility.h>
|
||||
|
||||
/*
|
||||
* GDB likes to have debugging information for the entry veneer.
|
||||
* Here was some DWARF information. IMD removed it, because we
|
||||
* could not check, whether it was still correct. Sorry.
|
||||
.globl _start
|
||||
.globl virtex_exc_vector_base
|
||||
|
||||
*/
|
||||
.section ".bsp_start_text", "ax"
|
||||
|
||||
.section .entry
|
||||
virtex_exc_vector_base:
|
||||
|
||||
PUBLIC_VAR (start)
|
||||
PUBLIC_VAR (download_entry)
|
||||
PUBLIC_VAR (__rtems_entry_point)
|
||||
SYM(start):
|
||||
SYM(download_entry):
|
||||
SYM(__rtems_entry_point):
|
||||
bl .startup
|
||||
base_addr:
|
||||
b _start
|
||||
|
||||
/*---------------------------------------------------------------------------
|
||||
* Parameters from linker
|
||||
*--------------------------------------------------------------------------*/
|
||||
toc_pointer:
|
||||
.long s.got
|
||||
bss_length:
|
||||
.long bss.size
|
||||
bss_addr:
|
||||
.long bss.start
|
||||
stack_top:
|
||||
.long stack.end
|
||||
PUBLIC_VAR (text_addr)
|
||||
text_addr:
|
||||
.long text.start
|
||||
/* Critical Input 0x0100 */
|
||||
/* Machine Check 0x0200 */
|
||||
/* Data Storage 0x0300 */
|
||||
/* Instruction Storage 0x0400 */
|
||||
/* External 0x0500 */
|
||||
/* Alignment 0x0600 */
|
||||
/* Program 0x0700 */
|
||||
/* FPU Unavailable 0x0800 */
|
||||
/* System Call 0x0C00 */
|
||||
/* APU Unavailable 0x0F20 */
|
||||
/* Programmable-Interval Timer 0x1000 */
|
||||
/* Fixed-Interval Timer 0x1010 */
|
||||
/* Watchdog Timer 0x1020 */
|
||||
/* Data TLB Miss 0x1100 */
|
||||
/* Instruction TLB Miss 0x1200 */
|
||||
/* Debug 0x2000 */
|
||||
.rept 0x2000 / 4 - 1
|
||||
b twiddle
|
||||
.endr
|
||||
|
||||
PUBLIC_VAR (text_length)
|
||||
text_length:
|
||||
.long text.size
|
||||
/*---------------------------------------------------------------------------
|
||||
* Reset_entry.
|
||||
*--------------------------------------------------------------------------*/
|
||||
.startup:
|
||||
/* Get start address, stack grows down from here... */
|
||||
mflr r1
|
||||
/* Start stack area */
|
||||
.rept BSP_START_STACK_SIZE / 4
|
||||
b twiddle
|
||||
.endr
|
||||
|
||||
/* Assume Bank regs set up..., cache etc. */
|
||||
bl bssclr
|
||||
_start:
|
||||
|
||||
#if 0
|
||||
.extern SYM(__vectors)
|
||||
/* Reset time base */
|
||||
li r0, 0
|
||||
mtspr TBWU, r0
|
||||
mtspr TBWL, r0
|
||||
|
||||
lis r2,__vectors@h /* set EVPR exc. vector prefix */
|
||||
#else
|
||||
lis r2,0
|
||||
#endif
|
||||
mtspr evpr,r2
|
||||
/* Initialize start stack */
|
||||
LWI r1, _start
|
||||
stwu r0, -4(r1)
|
||||
stwu r0, -4(r1)
|
||||
|
||||
/*-------------------------------------------------------------------
|
||||
* C_setup.
|
||||
*------------------------------------------------------------------*/
|
||||
lwz r2,toc_pointer-base_addr(r1) /* set r2 to toc */
|
||||
lwz r1,stack_top-base_addr(r1) /* set r1 to stack_top */
|
||||
/* Copy fast text */
|
||||
LWI r3, bsp_section_fast_text_begin
|
||||
LWI r4, bsp_section_fast_text_load_begin
|
||||
LWI r5, bsp_section_fast_text_size
|
||||
bl copy
|
||||
|
||||
addi r1,r1,-56-4 /* start stack at text_addr - 56 */
|
||||
addi r3,r0,0x0 /* clear r3 */
|
||||
stw r3, 0(r1) /* Clear stack chain */
|
||||
stw r3, 4(r1)
|
||||
stw r3, 8(r1)
|
||||
stw r3, 12(r1)
|
||||
lis r5,environ@ha
|
||||
la r5,environ@l(r5) /* environp */
|
||||
li r4, 0 /* argv */
|
||||
li r3, 0 /* argc */
|
||||
.extern SYM(_SDA_BASE_)
|
||||
lis r13,SYM(_SDA_BASE_)@h
|
||||
ori r13,r13,SYM(_SDA_BASE_)@l
|
||||
.extern SYM (boot_card)
|
||||
b SYM (boot_card) /* call the first C routine */
|
||||
/* Copy fast data */
|
||||
LWI r3, bsp_section_fast_data_begin
|
||||
LWI r4, bsp_section_fast_data_load_begin
|
||||
LWI r5, bsp_section_fast_data_size
|
||||
bl copy
|
||||
|
||||
/*---------------------------------------------------------------------------
|
||||
* bssclr.
|
||||
*--------------------------------------------------------------------------*/
|
||||
bssclr:
|
||||
/*-------------------------------------------------------------------
|
||||
* Data move finished, zero out bss.
|
||||
*------------------------------------------------------------------*/
|
||||
lwz r2,bss_addr-base_addr(r1) /* start of bss set by loader */
|
||||
lwz r3,bss_length-base_addr(r1) /* bss length */
|
||||
rlwinm. r3,r3,30,0x3FFFFFFF /* form length/4 */
|
||||
beqlr /* no bss */
|
||||
mtctr r3 /* set ctr reg */
|
||||
xor r6,r6,r6 /* r6 = 0 */
|
||||
clear_bss:
|
||||
stswi r6,r2,0x4 /* store r6 */
|
||||
addi r2,r2,0x4 /* update r2 */
|
||||
bdnz clear_bss /* decrement counter and loop */
|
||||
blr /* return */
|
||||
.L_text_e:
|
||||
/* Clear SBSS */
|
||||
LWI r3, bsp_section_sbss_begin
|
||||
LWI r4, bsp_section_sbss_size
|
||||
bl bsp_start_zero
|
||||
|
||||
.comm environ,4,4
|
||||
/* Clear BSS */
|
||||
LWI r3, bsp_section_bss_begin
|
||||
LWI r4, bsp_section_bss_size
|
||||
bl bsp_start_zero
|
||||
|
||||
/* Set up EABI and SYSV environment */
|
||||
bl __eabi
|
||||
|
||||
/* Clear command line */
|
||||
li r3, 0
|
||||
|
||||
bl boot_card
|
||||
|
||||
twiddle:
|
||||
|
||||
bl bsp_reset
|
||||
b twiddle
|
||||
|
||||
copy:
|
||||
|
||||
cmpw r3, r4
|
||||
beqlr
|
||||
b memcpy
|
||||
|
||||
/* Reset entry */
|
||||
.section ".virtex_reset", "ax"
|
||||
|
||||
jump_to_start:
|
||||
|
||||
LWI r3, _start
|
||||
mtctr r3
|
||||
bctr
|
||||
b jump_to_start
|
||||
|
||||
@@ -59,6 +59,7 @@
|
||||
|
||||
#include <bsp.h>
|
||||
#include <bsp/irq.h>
|
||||
#include <bsp/linker-symbols.h>
|
||||
#include <rtems/bspIo.h>
|
||||
#include <libcpu/cpuIdent.h>
|
||||
#include <libcpu/spr.h>
|
||||
@@ -71,6 +72,9 @@ uint32_t _heap_start;
|
||||
uint32_t _heap_end;
|
||||
uint32_t _top_of_ram;
|
||||
|
||||
/* Symbols defined in linker command file */
|
||||
LINKER_SYMBOL(virtex_exc_vector_base);
|
||||
|
||||
/*
|
||||
* Driver configuration parameters
|
||||
*/
|
||||
@@ -84,9 +88,6 @@ uint32_t bsp_timer_average_overhead; /* Average overhead of timer in ticks */
|
||||
uint32_t bsp_timer_least_valid; /* Least valid number from timer */
|
||||
bool bsp_timer_internal_clock; /* TRUE, when timer runs with CPU clk */
|
||||
|
||||
extern unsigned char IntrStack_start[];
|
||||
extern unsigned char IntrStack_end[];
|
||||
|
||||
/* Initialize whatever libc we are using
|
||||
* called from postdriver hook
|
||||
*/
|
||||
@@ -104,9 +105,6 @@ void bsp_XAssertHandler(const char* file, int line) {
|
||||
*/
|
||||
void bsp_start( void )
|
||||
{
|
||||
ppc_cpu_id_t myCpu;
|
||||
ppc_cpu_revision_t myCpuRevision;
|
||||
|
||||
/*
|
||||
* Get CPU identification dynamically. Note that the get_ppc_cpu_type()
|
||||
* function store the result in global variables
|
||||
@@ -133,11 +131,13 @@ void bsp_start( void )
|
||||
/*
|
||||
* Initialize default raw exception handlers.
|
||||
*/
|
||||
ppc_exc_initialize(
|
||||
ppc_exc_initialize_with_vector_base(
|
||||
PPC_INTERRUPT_DISABLE_MASK_DEFAULT,
|
||||
(uint32_t)IntrStack_start,
|
||||
IntrStack_end - IntrStack_start
|
||||
(uintptr_t) bsp_section_work_begin,
|
||||
rtems_configuration_get_interrupt_stack_size(),
|
||||
virtex_exc_vector_base
|
||||
);
|
||||
__asm__ volatile ("mtevpr %0" : : "r" (virtex_exc_vector_base));
|
||||
|
||||
/*
|
||||
* Install our own set of exception vectors
|
||||
|
||||
@@ -1,288 +0,0 @@
|
||||
/*
|
||||
* This file contains directives for the GNU linker which are specific
|
||||
* to the virtex
|
||||
* This file is intended to be used together with dlentry.s
|
||||
* it will generate downloadable code
|
||||
*
|
||||
* Modifications for gen405 by Dennis Ehlin
|
||||
* Modifications for virtex by Keith, Greg, and Bob
|
||||
*/
|
||||
|
||||
OUTPUT_FORMAT("elf32-powerpc", "elf32-powerpc",
|
||||
"elf32-powerpc")
|
||||
OUTPUT_ARCH(powerpc)
|
||||
|
||||
ENTRY(download_entry)
|
||||
|
||||
|
||||
RamBase = DEFINED(RamBase) ? RamBase : 0x0;
|
||||
RamSize = DEFINED(RamSize) ? RamSize : 128M;
|
||||
HeapSize = DEFINED(HeapSize) ? HeapSize : 0x0;
|
||||
|
||||
MEMORY
|
||||
{
|
||||
RAM : ORIGIN = 0, LENGTH = 128M
|
||||
/*FLASH : ORIGIN = 0xFFE00000, LENGTH = 16M*/
|
||||
}
|
||||
SECTIONS
|
||||
{
|
||||
.text 0x10000:
|
||||
{
|
||||
text.start = . ;
|
||||
*(.entry)
|
||||
*(.entry2)
|
||||
*(.text*)
|
||||
*(.rodata*)
|
||||
*(.rodata1)
|
||||
|
||||
/*
|
||||
* Special FreeBSD sysctl sections.
|
||||
*/
|
||||
. = ALIGN (16);
|
||||
__start_set_sysctl_set = .;
|
||||
*(set_sysctl_*);
|
||||
__stop_set_sysctl_set = ABSOLUTE(.);
|
||||
*(set_domain_*);
|
||||
*(set_pseudo_*);
|
||||
|
||||
/* C++ constructors/destructors */
|
||||
*(.gnu.linkonce.t*)
|
||||
|
||||
/* Initialization and finalization code.
|
||||
*
|
||||
* Various files can provide initialization and finalization functions.
|
||||
* The bodies of these functions are in .init and .fini sections. We
|
||||
* accumulate the bodies here, and prepend function prologues from
|
||||
* ecrti.o and function epilogues from ecrtn.o. ecrti.o must be linked
|
||||
* first; ecrtn.o must be linked last. Because these are wildcards, it
|
||||
* doesn't matter if the user does not actually link against ecrti.o and
|
||||
* ecrtn.o; the linker won't look for a file to match a wildcard. The
|
||||
* wildcard also means that it doesn't matter which directory ecrti.o
|
||||
* and ecrtn.o are in.
|
||||
*/
|
||||
PROVIDE (_init = .);
|
||||
*ecrti.o(.init)
|
||||
*(.init)
|
||||
*ecrtn.o(.init)
|
||||
|
||||
PROVIDE (_fini = .);
|
||||
*ecrti.o(.fini)
|
||||
*(.fini)
|
||||
*ecrtn.o(.init)
|
||||
|
||||
/*
|
||||
* C++ constructors and destructors for static objects.
|
||||
* PowerPC EABI does not use crtstuff yet, so we build "old-style"
|
||||
* constructor and destructor lists that begin with the list lenght
|
||||
* end terminate with a NULL entry.
|
||||
*/
|
||||
|
||||
PROVIDE (__CTOR_LIST__ = .);
|
||||
*crtbegin.o(.ctors)
|
||||
*(.ctors)
|
||||
*crtend.o(.ctors)
|
||||
LONG(0)
|
||||
PROVIDE (__CTOR_END__ = .);
|
||||
|
||||
PROVIDE (__DTOR_LIST__ = .);
|
||||
*crtbegin.o(.dtors)
|
||||
*(.dtors)
|
||||
*crtend.o(.dtors)
|
||||
LONG(0)
|
||||
PROVIDE (__DTOR_END__ = .);
|
||||
|
||||
/* Exception frame info */
|
||||
*(.eh_frame)
|
||||
/* Miscellaneous read-only data */
|
||||
_rodata_start = . ;
|
||||
*(.gnu.linkonce.r*)
|
||||
*(.lit)
|
||||
*(.shdata)
|
||||
*(.rodata)
|
||||
*(.rodata1)
|
||||
*(.descriptors)
|
||||
*(rom_ver)
|
||||
_erodata = .;
|
||||
|
||||
PROVIDE (__EXCEPT_START__ = .);
|
||||
*(.gcc_except_table*)
|
||||
PROVIDE (__EXCEPT_END__ = .);
|
||||
__GOT_START__ = .;
|
||||
s.got = .;
|
||||
*(.got.plt)
|
||||
*(.got)
|
||||
*(.got1)
|
||||
PROVIDE (__GOT2_START__ = .);
|
||||
PROVIDE (_GOT2_START_ = .);
|
||||
*(.got2)
|
||||
PROVIDE (__GOT2_END__ = .);
|
||||
PROVIDE (_GOT2_END_ = .);
|
||||
|
||||
PROVIDE (__FIXUP_START__ = .);
|
||||
PROVIDE (_FIXUP_START_ = .);
|
||||
*(.fixup)
|
||||
PROVIDE (_FIXUP_END_ = .);
|
||||
PROVIDE (__FIXUP_END__ = .);
|
||||
|
||||
|
||||
/* Various possible names for the end of the .text section */
|
||||
etext = ALIGN(0x10);
|
||||
_etext = .;
|
||||
|
||||
*(.lit)
|
||||
*(.shdata)
|
||||
_endtext = ALIGN(0x10);
|
||||
text.end = .;
|
||||
text.size = text.end - text.start;
|
||||
} >RAM
|
||||
|
||||
text.size = text.end - text.start;
|
||||
|
||||
.jcr : { KEEP (*(.jcr)) } >RAM
|
||||
|
||||
.rel.dyn : {
|
||||
*(.rel.init)
|
||||
*(.rel.text .rel.text.* .rel.gnu.linkonce.t.*)
|
||||
*(.rel.fini)
|
||||
*(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*)
|
||||
*(.rel.data.rel.ro* .rel.gnu.linkonce.d.rel.ro.*)
|
||||
*(.rel.data .rel.data.* .rel.gnu.linkonce.d.*)
|
||||
*(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*)
|
||||
*(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*)
|
||||
*(.rel.ctors)
|
||||
*(.rel.dtors)
|
||||
*(.rel.got)
|
||||
*(.rel.sdata .rel.sdata.* .rel.gnu.linkonce.s.*)
|
||||
*(.rel.sbss .rel.sbss.* .rel.gnu.linkonce.sb.*)
|
||||
*(.rel.sdata2 .rel.sdata2.* .rel.gnu.linkonce.s2.*)
|
||||
*(.rel.sbss2 .rel.sbss2.* .rel.gnu.linkonce.sb2.*)
|
||||
*(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*)
|
||||
} >RAM
|
||||
.rela.dyn : {
|
||||
*(.rela.init)
|
||||
*(.rela.text .rela.text.* .rela.gnu.linkonce.t.*)
|
||||
*(.rela.fini)
|
||||
*(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*)
|
||||
*(.rela.data .rela.data.* .rela.gnu.linkonce.d.*)
|
||||
*(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*)
|
||||
*(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*)
|
||||
*(.rela.ctors)
|
||||
*(.rela.dtors)
|
||||
*(.rela.got)
|
||||
*(.rela.got1)
|
||||
*(.rela.got2)
|
||||
*(.rela.sdata .rela.sdata.* .rela.gnu.linkonce.s.*)
|
||||
*(.rela.sbss .rela.sbss.* .rela.gnu.linkonce.sb.*)
|
||||
*(.rela.sdata2 .rela.sdata2.* .rela.gnu.linkonce.s2.*)
|
||||
*(.rela.sbss2 .rela.sbss2.* .rela.gnu.linkonce.sb2.*)
|
||||
*(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*)
|
||||
} >RAM
|
||||
|
||||
|
||||
/* R/W Data */
|
||||
.data ( . ) :
|
||||
{
|
||||
. = ALIGN (4);
|
||||
|
||||
data.start = .;
|
||||
|
||||
*(.data)
|
||||
*(.data1)
|
||||
*(.data.* .gnu.linkonce.d.*)
|
||||
data.end = .;
|
||||
data.size = data.end - data.start;
|
||||
} >RAM
|
||||
|
||||
/* Arrange as follows:
|
||||
* sdata
|
||||
* sbss
|
||||
* bss
|
||||
* sbss2
|
||||
* sdata2
|
||||
* so that we have a contiguous 'bss' area
|
||||
* which can be zeroed in one sweep.
|
||||
* (sdata/sbss and sdata2/sbss2 must also be
|
||||
* contiguous).
|
||||
*/
|
||||
|
||||
_SDA_BASE_ = __SDATA_START__ + 0x8000;
|
||||
.sdata : {
|
||||
*(.sdata .sdata.*)
|
||||
*(.gnu.linkonce.s.*)
|
||||
} > RAM
|
||||
_edata = .;
|
||||
.sbss : {
|
||||
PROVIDE (__sbss_start = .); PROVIDE (___sbss_start = .);
|
||||
*(.dynsbss)
|
||||
*(.sbss .sbss.* .gnu.linkonce.sb.*)
|
||||
*(.scommon)
|
||||
PROVIDE (__sbss_end = .); PROVIDE (___sbss_end = .);
|
||||
} > RAM
|
||||
.bss : {
|
||||
*(.dynbss)
|
||||
*(.bss .bss* .gnu.linkonce.b*)
|
||||
*(COMMON)
|
||||
} >RAM
|
||||
_SDA2_BASE_ = __SBSS2_START__ + 0x8000;
|
||||
.sbss2 : {
|
||||
*(.sbss2 .sbss2.* .gnu.linkonce.sb2.*)
|
||||
} > RAM
|
||||
.sdata2 : {
|
||||
*(.sdata2 .sdata2.* .gnu.linkonce.s2.*)
|
||||
} > RAM
|
||||
|
||||
PROVIDE(bss.start = __SBSS_START__);
|
||||
PROVIDE(bss.size = __SBSS2_END__ - __SBSS_START__);
|
||||
|
||||
/* align bottom of 32k init stack at a 32k boundary */
|
||||
. = . + 0x4000;
|
||||
. = ALIGN( 0x8000 );
|
||||
stack.start = .;
|
||||
. = . + 0x8000;
|
||||
stack.end = .;
|
||||
/*
|
||||
* Interrupt stack setup
|
||||
*/
|
||||
IntrStack_start = ALIGN(0x10);
|
||||
. += 0x4000;
|
||||
IntrStack_end = .;
|
||||
|
||||
PROVIDE(_end = . );
|
||||
WorkAreaBase = .;
|
||||
|
||||
.gzipmalloc : {
|
||||
. = ALIGN (16);
|
||||
_startmalloc = .;
|
||||
} >RAM
|
||||
|
||||
|
||||
/* Sections for compressed .text and .data */
|
||||
/* after the .datarom section is an int specifying */
|
||||
/* the length of the following compressed image */
|
||||
/* Executes once then could get overwritten */
|
||||
.textrom 0x100000 :
|
||||
{
|
||||
*(.textrom)
|
||||
_endloader = .;
|
||||
} >RAM
|
||||
|
||||
.datarom :
|
||||
{
|
||||
_dr_start = .;
|
||||
*(.datarom)
|
||||
_dr_end = .;
|
||||
} >RAM
|
||||
dr_len = _dr_end - _dr_start;
|
||||
|
||||
|
||||
.line 0 : { *(.line) }
|
||||
.debug 0 : { *(.debug) }
|
||||
.debug_sfnames 0 : { *(.debug_sfnames) }
|
||||
.debug_srcinfo 0 : { *(.debug_srcinfo) }
|
||||
.debug_pubnames 0 : { *(.debug_pubnames) }
|
||||
.debug_aranges 0 : { *(.debug_aranges) }
|
||||
.debug_aregion 0 : { *(.debug_aregion) }
|
||||
.debug_macinfo 0 : { *(.debug_macinfo) }
|
||||
.stab 0 : { *(.stab) }
|
||||
.stabstr 0 : { *(.stabstr) }
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
MEMORY {
|
||||
RAM : ORIGIN = @VIRTEX_RAM_ORIGIN@, LENGTH = @VIRTEX_RAM_LENGTH@
|
||||
FAST_RAM : ORIGIN = @VIRTEX_FAST_RAM_ORIGIN@, LENGTH = @VIRTEX_FAST_RAM_LENGTH@
|
||||
RESET : ORIGIN = @VIRTEX_RESET_ORIGIN@, LENGTH = @VIRTEX_RESET_LENGTH@
|
||||
EMPTY : ORIGIN = 0x0, LENGTH = 0x0
|
||||
}
|
||||
|
||||
REGION_ALIAS ("REGION_START", RAM);
|
||||
REGION_ALIAS ("REGION_FAST_TEXT", FAST_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", FAST_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 {
|
||||
.virtex_reset : {
|
||||
KEEP (*(.virtex_reset))
|
||||
} > RESET AT > RESET
|
||||
}
|
||||
|
||||
INCLUDE linkcmds.base
|
||||
Reference in New Issue
Block a user