diff options
author | Dimitar Dimitrov <dimitar@dinux.eu> | 2018-03-11 22:23:26 +0200 |
---|---|---|
committer | Jeff Johnston <jjohnstn@redhat.com> | 2019-10-31 14:47:19 -0400 |
commit | 0c7734673a981e81a88235851be219ce23fd242b (patch) | |
tree | faa1780561efd74c106f9838d20164a5008b3b08 /libgloss/pru/crt0.S | |
parent | 0574317971f53d4471ef92aca4c57315bf777358 (diff) | |
download | newlib-0c7734673a981e81a88235851be219ce23fd242b.zip newlib-0c7734673a981e81a88235851be219ce23fd242b.tar.gz newlib-0c7734673a981e81a88235851be219ce23fd242b.tar.bz2 |
Initial PRU port for libgloss and newlib
Signed-off-by: Dimitar Dimitrov <dimitar@dinux.eu>
Diffstat (limited to 'libgloss/pru/crt0.S')
-rw-r--r-- | libgloss/pru/crt0.S | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/libgloss/pru/crt0.S b/libgloss/pru/crt0.S new file mode 100644 index 0000000..b3f0d53 --- /dev/null +++ b/libgloss/pru/crt0.S @@ -0,0 +1,97 @@ +/* SPDX-License-Identifier: BSD-2-Clause-FreeBSD + * + * crt0.S -- PRU startup code + * + * Copyright (c) 2018-2019 Dimitar Dimitrov <dimitar@dinux.eu> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "newlib.h" + + .extern main + .extern exit + + .text + .section .init0, "x" + .global _start +_start: + /* Initialize stack pointer. */ + ldi32 sp, _stack_top + + /* DATA and BSS are handled by the loader, so nothing to do here. */ + +#if !defined(MINRT) + .extern _do_global_dtors + /* Ensure destructors get called. Call is per GNU ABI (i.e. 32-bit + function pointers). But it is also compatible with the TI ABI + since GCC supports only little endian PRU. + + WARNING: Keep this compatible with both ABIs! */ + ldi r14, %pmem(_do_global_dtors) + call atexit + + /* Call constructors. Use non-call-clobbered registers. */ + ldi r5, __init_array_start + ldi r6, __init_array_end +ctors_loop: + qbeq ctors_done, r5, r6 + /* ABI dictates 16-bit IMEM pointers. */ + lbbo r7, r5, 0, 2 + call r7.w0 + add r5, r5, 2 + jmp ctors_loop +ctors_done: +#endif + + /* Just in case main() tries to access argc, argv[] and envp. */ + zero r14, 3 * 4 + +#if !defined(MINRT) + .weak __c_args__ + ldi32 r5, __c_args__ + qbeq __skip_c_args, r5, 0 + lbbo r14, r5, 0, 4 /* argc */ + add r15, r5, 4 /* argv */ +__skip_c_args: +#endif + + /* Call main */ + call main + +#if !defined(MINRT) + /* Call exit */ + call exit +#endif + + /* We should never reach here. */ +_crt_exit: + halt + jmp _crt_exit + + /* PRU obviously has no shared libraries, but dso_handle + helps to achieve better GCC test coverage. Besides, + it should be free with minrt. */ + .section .data + .global __dso_handle + .weak __dso_handle +__dso_handle: + .long 0 |