diff options
author | DJ Delorie <dj@redhat.com> | 2014-01-30 06:46:34 +0400 |
---|---|---|
committer | DJ Delorie <dj@redhat.com> | 2014-01-30 06:46:34 +0400 |
commit | ed94d4a4aa8ee4cd5c863c6ce38ea15c64508c43 (patch) | |
tree | 1e902ae475c11464972966505a34724e2c2e7c65 /libgloss/msp430/crt0.S | |
parent | 25833f57c154d4288bbe15570a3a61f435271253 (diff) |
* msp430/Makefile.in (crt0-minrt.o, crtn-minrt.o): New. Build
from crt0.S with -DMINRT.
(CRT_OBJS): Expand.
(crt_%.o): New rule pattern. Build multiple objects from crt0.S.
* msp430/crt0.S: Further break out functionality. Support -DMINRT
that omits all init/fini logic.
* msp430/crtn.S: Likewise.
* msp430/msp430-sim.ld: Wildcard all .crt_* sections, sorted.
* msp430/msp430.ld: Likewise.
* msp430/msp430xl-sim.ld: Likewise.
Diffstat (limited to 'libgloss/msp430/crt0.S')
-rw-r--r-- | libgloss/msp430/crt0.S | 57 |
1 files changed, 54 insertions, 3 deletions
diff --git a/libgloss/msp430/crt0.S b/libgloss/msp430/crt0.S index 388b67829..9ea25c131 100644 --- a/libgloss/msp430/crt0.S +++ b/libgloss/msp430/crt0.S @@ -13,18 +13,38 @@ #include "memmodel.h" +;; The linker links all .crt_* sections in asciibetical order at the +;; same place. So, the four digits in .crt_NNNN determine the link +;; order, so, keep them in sequential order here. The first two +;; digits are set here, the second two allow users to insert code +;; between code fragments here. + +#if L0 .section ".resetvec", "a" __msp430_resetvec_hook: .word __start - .section ".lowtext", "ax", @progbits + .section ".crt_0000init", "ax", @progbits + .refsym __msp430_resetvec_hook +#ifdef MINRT + .refsym __crt0_call_just_main +#else + .refsym __crt0_call_init_then_main +#endif .global __start __start: mov_ #__stack, R1 ;; Disable watchdog timer. MOV #0x5a80, &0x15C +#endif +#if Lbss + .section ".crt_0100bss", "ax", @progbits + + .global __crt0_init_bss +__crt0_init_bss: + mov_ #__bssstart, R12 clr.w R13 mov.w #__bsssize, R14 @@ -32,7 +52,14 @@ __start: clr.w R15 ; We assume that __bsssize is never > 64M #endif call_ #memset +#endif +#if Lmovedata + .section ".crt_0200movedata", "ax", @progbits + + .global __crt0_movedata +__crt0_movedata: + mov_ #__datastart, R12 mov_ #__romdatastart, R13 @@ -46,17 +73,38 @@ __start: #endif call_ #memmove 1: +#endif + +#if Lmain_minrt + .section ".crt_0300main", "ax", @progbits + .global __crt0_call_just_main +__crt0_call_just_main: + clr.w R12 ; Set argc == 0 + call_ #main +#endif + +#if Lmain + .section ".crt_0300main", "ax", @progbits + .global __crt0_call_init_then_main +__crt0_call_init_then_main: call_ #__msp430_init clr.w R12 ; Set argc == 0 call_ #main +#endif +#if Lcallexit + .section ".crt_0400main_exit", "ax", @progbits + .global __crt0_call_exit +__crt0_call_exit: call_ #_exit - - .word __msp430_resetvec_hook +#endif ;---------------------------------------- +#ifndef MINRT +#if L0 + .section ".crt_0500main_init", "ax", @progbits .global _msp430_run_init_array .type _msp430_run_init_array,@function _msp430_run_init_array: @@ -104,3 +152,6 @@ __msp430_init: .global __msp430_fini __msp430_fini: call_ #_msp430_run_fini_array + +#endif +#endif |