Cygwin: cygwin_GetCommandLineW/A: don't rely on __argv[0] content
[newlib-cygwin.git] / libgloss / pru / crt0.S
blobad31cc9cc00f73293cec5e1a837ea7c9576d822b
1 /* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
2  *
3  * crt0.S -- PRU startup code
4  *
5  * Copyright (c) 2018-2019 Dimitar Dimitrov <dimitar@dinux.eu>
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28 #include "newlib.h"
30         .extern main
31         .extern exit
33         .text
34         .section .init0, "x"
35         .global _start
36 _start:
37         /* Initialize stack pointer. */
38         ldi32   sp, _stack_top
40         /* DATA and BSS are handled by the loader, so nothing to do here. */
42         .extern _do_global_dtors
43         /* Ensure destructors get called.  Call is per GNU ABI (i.e. 32-bit
44            function pointers).  But it is also compatible with the TI ABI
45            since GCC supports only little endian PRU.
47            WARNING:  Keep this compatible with both ABIs!  */
48         ldi     r14, %pmem(_do_global_dtors)
49         call    atexit
51         /* Call constructors. Use non-call-clobbered registers. */
52         ldi     r5, __init_array_start
53         ldi     r6, __init_array_end
54 ctors_loop:
55         qbeq    ctors_done, r5, r6
56         /* ABI dictates 16-bit IMEM pointers. */
57         lbbo    r7, r5, 0, 2
58         call    r7.w0
59         add     r5, r5, 2
60         jmp     ctors_loop
61 ctors_done:
63         /* Just in case main() tries to access argc, argv[] and envp. */
64         zero    r14, 3 * 4
66         .weak __c_args__
67         ldi32   r5, __c_args__
68         qbeq    __skip_c_args, r5, 0
69         lbbo    r14, r5, 0, 4   /* argc */
70         add     r15, r5, 4      /* argv */
71 __skip_c_args:
73         /* Call main */
74         call    main
76         /* Call exit */
77         call    exit
79         /* We should never reach here. */
80 _crt_exit:
81         halt
82         jmp     _crt_exit
84         /* PRU obviously has no shared libraries, but dso_handle
85            helps to achieve better GCC test coverage. Besides,
86            it should be free with minrt. */
87         .section .data
88         .global __dso_handle
89         .weak __dso_handle
90 __dso_handle:
91         .long   0