diff options
Diffstat (limited to 'libgloss/msp430/crt0.S')
-rw-r--r-- | libgloss/msp430/crt0.S | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/libgloss/msp430/crt0.S b/libgloss/msp430/crt0.S new file mode 100644 index 000000000..388b67829 --- /dev/null +++ b/libgloss/msp430/crt0.S @@ -0,0 +1,106 @@ +/* Copyright (c) 2012-2013 Red Hat, Inc. All rights reserved. + + This copyrighted material is made available to anyone wishing to use, modify, + copy, or redistribute it subject to the terms and conditions of the BSD + License. This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY expressed or implied, including the implied warranties + of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. A copy of this license + is available at http://www.opensource.org/licenses. Any Red Hat trademarks that + are incorporated in the source code or documentation are not subject to the BSD + License and may only be used or replicated with the express permission of + Red Hat, Inc. +*/ + +#include "memmodel.h" + + .section ".resetvec", "a" +__msp430_resetvec_hook: + .word __start + + .section ".lowtext", "ax", @progbits + .global __start +__start: + mov_ #__stack, R1 + + ;; Disable watchdog timer. + MOV #0x5a80, &0x15C + + mov_ #__bssstart, R12 + clr.w R13 + mov.w #__bsssize, R14 +#ifdef __MSP430X_LARGE__ + clr.w R15 ; We assume that __bsssize is never > 64M +#endif + call_ #memset + + mov_ #__datastart, R12 + mov_ #__romdatastart, R13 + + ;; memmove and memcpy do not currently work when src == dst + cmp_ R12, R13 + jeq 1f + + mov.w #__romdatacopysize, R14 +#ifdef __MSP430X_LARGE__ + clr.w R15 ; We assume that __romdatacopysize is never > 64M +#endif + call_ #memmove +1: + call_ #__msp430_init + + clr.w R12 ; Set argc == 0 + call_ #main + + call_ #_exit + + .word __msp430_resetvec_hook + +;---------------------------------------- + + .global _msp430_run_init_array + .type _msp430_run_init_array,@function +_msp430_run_init_array: + mov_ #__init_array_start, R4 + mov_ #__init_array_end, R5 + mov_ #PTRsz, R6 + br_ #_msp430_run_array + + .global _msp430_run_preinit_array + .type _msp430_run_preinit_array,@function +_msp430_run_preinit_array: + mov_ #__preinit_array_start, R4 + mov_ #__preinit_array_end, R5 + mov_ #PTRsz, R6 + br_ #_msp430_run_array + + .global _msp430_run_fini_array + .type _msp430_run_fini_array,@function +_msp430_run_fini_array: + mov_ #__fini_array_start, R4 + mov_ #__fini_array_end, R5 + mov_ #-PTRsz, R6 + br_ #_msp430_run_array + +_msp430_run_array: + cmp_ R4, R5 + jeq _msp430_run_done + mov_ @R4, R7 + add_ R6, R4 + call_ @R7 + br_ _msp430_run_array + +_msp430_run_done: + ret_ + +;---------------------------------------- + + .section .init,"ax" + + .global __msp430_init +__msp430_init: + + .section .fini,"ax" + + .global __msp430_fini +__msp430_fini: + call_ #_msp430_run_fini_array |