]>
Commit | Line | Data |
---|---|---|
de5c0edc | 1 | /* start, OpenRISC version. |
6d7e8eda | 2 | Copyright (C) 2022-2023 Free Software Foundation, Inc. |
de5c0edc SH |
3 | This file is part of the GNU C Library. |
4 | ||
5 | The GNU C Library is free software; you can redistribute it and/or | |
6 | modify it under the terms of the GNU Lesser General Public | |
7 | License as published by the Free Software Foundation; either | |
8 | version 2.1 of the License, or (at your option) any later version. | |
9 | ||
06d4381d SN |
10 | In addition to the permissions in the GNU Lesser General Public |
11 | License, the Free Software Foundation gives you unlimited | |
12 | permission to link the compiled version of this file with other | |
13 | programs, and to distribute those programs without any restriction | |
14 | coming from the use of this file. (The GNU Lesser General Public | |
15 | License restrictions do apply in other respects; for example, they | |
16 | cover modification of the file, and distribution when not linked | |
17 | into another program.) | |
18 | ||
19 | Note that people who make modified versions of this file are not | |
20 | obligated to grant this special exception for their modified | |
21 | versions; it is their choice whether to do so. The GNU Lesser | |
22 | General Public License gives permission to release a modified | |
23 | version without this exception; this exception also makes it | |
24 | possible to release a modified version which carries forward this | |
25 | exception. | |
26 | ||
de5c0edc SH |
27 | The GNU C Library is distributed in the hope that it will be useful, |
28 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
29 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
30 | Lesser General Public License for more details. | |
31 | ||
32 | You should have received a copy of the GNU Lesser General Public | |
06d4381d SN |
33 | License along with the GNU C Library; if not, see |
34 | <https://www.gnu.org/licenses/>. */ | |
de5c0edc SH |
35 | |
36 | /* This is the canonical entry point, usually the first thing in the text | |
37 | segment. | |
38 | ||
39 | sp The stack contains the arguments and environment: | |
40 | 0(sp) argc | |
41 | 4(sp) argv[0] | |
42 | ... | |
43 | (4*argc)(sp) NULL | |
44 | (4*(argc+1))(sp) envp[0] | |
45 | ... | |
46 | NULL | |
47 | */ | |
48 | ||
49 | #define __ASSEMBLY__ | |
50 | #include <sysdep.h> | |
51 | #include <entry.h> | |
52 | ||
53 | ENTRY (ENTRY_POINT) | |
54 | ||
55 | /* Setup Arguments to the __libc_start_main function. */ | |
56 | ||
57 | /* Take values for argc and argv off the stack. | |
58 | These will be passed as arguments two and three to main | |
59 | and thus go in registers r4 and r5, respectively. */ | |
60 | l.lwz r4, 0(r1) | |
61 | l.addi r5, r1, 4 | |
62 | ||
63 | /* Pass in rtld_fini from dl-start.S. */ | |
64 | l.or r8, r3, r3 | |
65 | ||
66 | #ifdef PIC | |
67 | /* Obtain a pointer to .got in r16 */ | |
68 | l.jal 0x8 | |
69 | l.movhi r16, gotpchi(_GLOBAL_OFFSET_TABLE_-4) | |
70 | l.ori r16, r16, gotpclo(_GLOBAL_OFFSET_TABLE_+0) | |
71 | l.add r16, r16, r9 | |
72 | ||
73 | /* Pass in the the main symbol. */ | |
74 | l.lwz r3, got(main)(r16) | |
75 | #else | |
76 | /* Pass in the the main symbol. */ | |
77 | l.movhi r3, hi(main) | |
78 | l.ori r3, r3, lo(main) | |
79 | #endif | |
80 | /* Used to be init and fini. */ | |
81 | l.movhi r6, 0x0 | |
82 | l.movhi r7, 0x0 | |
83 | ||
84 | /* Push stack limit onto the stack. | |
85 | This provides the highest stack address to user code (as stack grows | |
86 | downwards. | |
87 | This is the seventh argument to __libc_start_main and thus needs to | |
88 | be passed on the stack. */ | |
89 | l.sw -4(r1), r1 | |
90 | ||
91 | /* Adjust stack to account for a total of 7 args (i.e. the last one is | |
92 | on the stack. */ | |
93 | l.addi r1, r1, -4 | |
94 | ||
95 | /* Clear the frame pointer and link register since this is the | |
96 | outermost frame. */ | |
97 | l.movhi r2, 0x0 | |
98 | l.movhi r9, 0x0 | |
99 | ||
100 | /* Let the libc call main and exit with its return code. */ | |
101 | #ifdef PIC | |
102 | l.j plt(__libc_start_main) | |
103 | #else | |
104 | l.j __libc_start_main | |
105 | #endif | |
106 | l.nop | |
107 | END (ENTRY_POINT) | |
108 | ||
109 | /* Define a symbol for the first piece of initialized data. */ | |
110 | .data | |
111 | .globl __data_start | |
112 | __data_start: | |
113 | .long 0 | |
114 | .weak data_start | |
115 | data_start = __data_start |