diff options
Diffstat (limited to 'ld/scripttempl/tic4xcoff.sc')
-rw-r--r-- | ld/scripttempl/tic4xcoff.sc | 173 |
1 files changed, 116 insertions, 57 deletions
diff --git a/ld/scripttempl/tic4xcoff.sc b/ld/scripttempl/tic4xcoff.sc index 29dc400..080ac67 100644 --- a/ld/scripttempl/tic4xcoff.sc +++ b/ld/scripttempl/tic4xcoff.sc @@ -1,52 +1,102 @@ -# 32 interrupt vectors + 32 trap vectors each of 4 bytes -# The .bss and .data sections need to be contiguous for direct addressing -# The data page pointer gets loaded with the start of .bss -# TI C compiler uses .cinit to initialise variables in .bss +# In microcomputer (MC) mode, the vectors are mapped into the on-chip ROM, +# otherwise in microprocessor (MP) mode the vectors are mapped to address 0 +# on the external bus. In MC mode, the on-chip ROM contains a bootloader program +# that loads the internal RAM from the serial port or external ROM. +# +# Common configurations: +# 1. MC mode, no external memory (serial boot). +# 2. MC mode, external RAM (serial boot). +# 3. MC mode, external ROM. +# 4. MC mode, external ROM, external RAM. +# 5. MP mode, external ROM. +# 6. MP mode, external ROM, external RAM. +# 7. MP mode, external RAM (dual-port with hosting CPU or external debugger). +# +# Config TEXT DATA/BSS +# 1. INT_RAM INT_RAM (mcmode,onchip) +# 2. EXT_RAM EXT_RAM (mcmode,extram) +# 3. INT_RAM INT_RAM (mcmode,onchip) +# 4. EXT_RAM EXT_RAM (mcmode,extram) +# 5. EXT_ROM INT_RAM (mpmode,onchip,extrom) +# 6. EXT_ROM EXT_RAM (mpmode,extram,extrom) +# 7. EXT_RAM EXT_RAM (mpmode,extram) +# +# In MC mode, TEXT and DATA are copied into RAM by the bootloader. +# +# In MP mode with external ROM, DATA needs to be copied into RAM at boot time. +# +# If there is external RAM it is better to use that and reserve the internal RAM +# for data buffers. However, the address of the external RAM needs to be specified. +# +# This emulation assumes config 7. + +case $OUTPUT_ARCH in + c3x) OUTPUT_ARCHNAME="TMS320C3x" ;; + c4x) OUTPUT_ARCHNAME="TMS320C4x" ;; +esac + +case $ONCHIP in + yes) RAM=RAM; + STACK_SIZE_DEFAULT=128; + HEAP_SIZE_DEFAULT=0; + ;; + *) RAM=EXT0; + STACK_SIZE_DEFAULT=0x1000; + HEAP_SIZE_DEFAULT=0x4000; + ;; +esac + +TEXT_MEMORY=$RAM; +DATA_MEMORY=$RAM; + + +MEMORY_DEF=" +/* C30 memory space. */ +MEMORY +{ + EXT0 : org = 0x0000000, len = 0x800000 /* External address bus. */ + XBUS : org = 0x0800000, len = 0x002000 /* Expansion bus. */ + IOBUS : org = 0x0804000, len = 0x002000 /* I/O BUS. */ + RAM0 : org = 0x0809800, len = 0x000400 /* Internal RAM block 0. */ + RAM1 : org = 0x0809a00, len = 0x000400 /* Internal RAM block 1. */ + RAM : org = 0x0809800, len = 0x000800 /* Internal RAM. */ + EXT1 : org = 0x080a000, len = 0x7f6000 /* External address bus. */ +} +" test -z "$ENTRY" && ENTRY=_start -# These are substituted in as variables in order to get '}' in a shell -# conditional expansion. -INIT='.init : { *(.init) }' -FINI='.fini : { *(.fini) }' + cat <<EOF +${RELOCATING+/* Linker script for $OUTPUT_ARCHNAME executable. */} +${RELOCATING-/* Linker script for $OUTPUT_ARCHNAME object file (ld -r). */} + OUTPUT_FORMAT("${OUTPUT_FORMAT}") OUTPUT_ARCH("${OUTPUT_ARCH}") ${LIB_SEARCH_DIRS} - ENTRY(${ENTRY}) -${RELOCATING+ __SYSMEM_SIZE = DEFINED(__SYSMEM_SIZE) ? __SYSMEM_SIZE : 0x4000;} -${RELOCATING+ __STACK_SIZE = DEFINED(__STACK_SIZE) ? __STACK_SIZE : 0x1000;} + +${RELOCATING+ __HEAP_SIZE = DEFINED(__HEAP_SIZE) ? __HEAP_SIZE : ${HEAP_SIZE_DEFAULT};} +${RELOCATING+ __STACK_SIZE = DEFINED(__STACK_SIZE) ? __STACK_SIZE : ${STACK_SIZE_DEFAULT};} + +${RELOCATING+${MEMORY_DEF}} + +/* In the small memory model the .data and .bss sections must be contiguous + when loaded and fit within the same page. The DP register is loaded + with the page address. */ SECTIONS { - .comms ${RELOCATING+ 64} : { - *(.comms) - } - .bss ${RELOCATING+ SIZEOF(.comms) + ADDR(.comms)} : { - ${RELOCATING+ .bss = .;} - *(.bss) - *(COMMON) - ${RELOCATING+ end = .;} - ${RELOCATING+ _end = end;} - } - .data ${RELOCATING+ SIZEOF(.bss) + ADDR(.bss)} : - { - ${RELOCATING+ .data = .;} - *(.data) - ${RELOCATING+ edata = .;} - } - .const ${RELOCATING+ SIZEOF(.data) + ADDR(.data)} : - { + /* Reset, interrupt, and trap vectors. */ + .vectors ${RELOCATING+ 0} : { + *(.vectors) + } ${RELOCATING+ > ${TEXT_MEMORY}} + /* Constants. */ + .const : { *(.const) - } - .cinit ${RELOCATING+ SIZEOF(.const) + ADDR(.const)} : - { - ${RELOCATING+ cinit = .;} - *(.cinit) - LONG(0); - } - .text ${RELOCATING+ SIZEOF(.cinit) + ADDR(.cinit)} : { - ${RELOCATING+ .text = .;} + } ${RELOCATING+ > ${TEXT_MEMORY}} + /* Program code. */ + .text : { + ${RELOCATING+ __text = .;} ${RELOCATING+ *(.init)} *(.text) ${CONSTRUCTING+ ___CTOR_LIST__ = .;} @@ -60,33 +110,42 @@ SECTIONS ${CONSTRUCTING+ LONG(0)} ${CONSTRUCTING+ ___DTOR_END__ = .;} ${RELOCATING+ *(.fini)} - ${RELOCATING+ etext = .;} - ${RELOCATING+ _etext = etext;} - } - .stack ${RELOCATING+ SIZEOF(.text) + ADDR(.text)} : + ${RELOCATING+ __etext = .;} + } ${RELOCATING+ > ${TEXT_MEMORY}} + /* Global initialised variables. */ + .data : + { + ${RELOCATING+ __data = .;} + *(.data) + ${RELOCATING+ __edata = .;} + } ${RELOCATING+ > ${DATA_MEMORY}} + /* Global uninitialised variables. */ + .bss : { + ${RELOCATING+ __bss = .;} + *(.bss) + *(COMMON) + ${RELOCATING+ __end = .;} + } ${RELOCATING+ > ${DATA_MEMORY}} + /* Heap. */ + .heap : { + ${RELOCATING+ __heap = .;} + ${RELOCATING+ . += __HEAP_SIZE}; + } ${RELOCATING+ > ${DATA_MEMORY}} + /* Stack (grows upward). */ + .stack : + { + ${RELOCATING+ __stack = .;} *(.stack) ${RELOCATING+ . = . + __STACK_SIZE}; - } - .sysmem ${RELOCATING+ SIZEOF(.stack) + ADDR(.stack)} : - { - *(.sysmem) - } - .heap ${RELOCATING+ SIZEOF(.sysmem) + ADDR(.sysmem)} : - { - ${RELOCATING+ . += __SYSMEM_SIZE - SIZEOF(.sysmem)}; - } - ${RELOCATING- ${INIT}} - ${RELOCATING- ${FINI}} - .stab 0 ${RELOCATING+(NOLOAD)} : + } ${RELOCATING+ > ${DATA_MEMORY}} + .stab 0 ${RELOCATING+(NOLOAD)} : { [ .stab ] } - .stabstr 0 ${RELOCATING+(NOLOAD)} : + .stabstr 0 ${RELOCATING+(NOLOAD)} : { [ .stabstr ] } -/* The TI tools sets cinit to -1 if the ram model is used. */ - ${RELOCATING+ cinit = SIZEOF(.cinit) == 1 ? cinit : -1;} } EOF |