source: trunk/libs/newlib/src/newlib/libc/sys/rtems/crt0.c

Last change on this file was 444, checked in by satin@…, 6 years ago

add newlib,libalmos-mkh, restructure shared_syscalls.h and mini-libc

File size: 10.8 KB
Line 
1/*
2 *  RTEMS Fake crt0
3 *
4 *  Each RTEMS BSP provides its own crt0 and linker script.  Unfortunately
5 *  this means that crt0 and the linker script are not available as
6 *  each tool is configured.  Without a crt0 and linker script, some
7 *  targets do not successfully link "conftest.c" during the configuration
8 *  process.  So this fake crt0.c provides all the symbols required to
9 *  successfully link a program.  The resulting program will not run
10 *  but this is enough to satisfy the autoconf macro AC_PROG_CC.
11 */
12
13#include <sys/lock.h>
14#include <sys/stat.h>
15#include <sys/uio.h>
16#include <reent.h>
17#include <signal.h>
18#include <time.h>
19#include <unistd.h>
20#include <machine/_arc4random.h>
21#include <machine/_libatomic.h>
22
23void rtems_provides_crt0( void ) {}  /* dummy symbol so file always has one */
24
25#define RTEMS_STUB(ret, func, body) \
26ret rtems_stub_##func body; \
27ret func body
28
29/* RTEMS provides some of its own routines including a Malloc family */
30RTEMS_STUB(void *,malloc(size_t s), { return 0; })
31RTEMS_STUB(void *,realloc(void* p, size_t s), { return 0; })
32RTEMS_STUB(void, free(void* ptr), { })
33RTEMS_STUB(void *, calloc(size_t s1, size_t s2), { return 0; })
34RTEMS_STUB(int, posix_memalign(void **p, size_t si, size_t s2), { return -1; })
35
36/* Stubs for routines from RTEMS <sys/lock.h> */
37RTEMS_STUB(void, _Mutex_Acquire(struct _Mutex_Control *p), { })
38RTEMS_STUB(int,  _Mutex_Acquire_timed(struct _Mutex_Control *p1, const struct timespec *p2), { return -1; })
39RTEMS_STUB(int,  _Mutex_Try_Acquire(struct _Mutex_Control *p), { return -1; })
40RTEMS_STUB(void, _Mutex_Release(struct _Mutex_Control *p), { })
41
42RTEMS_STUB(void, _Mutex_recursive_Acquire(struct _Mutex_recursive_Control *p), { })
43RTEMS_STUB(int,  _Mutex_recursive_Acquire_timed(struct _Mutex_recursive_Control *p1, const struct timespec *p2), { return -1; })
44RTEMS_STUB(int,  _Mutex_recursive_Try_acquire(struct _Mutex_recursive_Control *p), { return -1; })
45RTEMS_STUB(void, _Mutex_recursive_Release(struct _Mutex_recursive_Control *p), { })
46
47RTEMS_STUB(void, _Condition_Wait(struct _Condition_Control *p1, struct _Mutex_Control *p2), { })
48RTEMS_STUB(int,  _Condition_Wait_timed(struct _Condition_Control *p1, struct _Mutex_Control *p2, const struct timespec *p3), { return -1; })
49RTEMS_STUB(void, _Condition_Wait_recursive(struct _Condition_Control *p1, struct _Mutex_recursive_Control *p2), { })
50RTEMS_STUB(int,  _Condition_Wait_recursive_timed(struct _Condition_Control *p1, struct _Mutex_recursive_Control *p2, const struct timespec *p3), { return -1; })
51RTEMS_STUB(void, _Condition_Signal(struct _Condition_Control *p), { })
52RTEMS_STUB(void, _Condition_Broadcast(struct _Condition_Control *p), { })
53
54RTEMS_STUB(void, _Semaphore_Wait(struct _Semaphore_Control *p), { })
55RTEMS_STUB(void, _Semaphore_Post(struct _Semaphore_Control *p), { })
56
57RTEMS_STUB(int, _Futex_Wait(struct _Futex_Control *p1, int *p2, int i), { return -1; })
58RTEMS_STUB(int, _Futex_Wake(struct _Futex_Control *p, int i), { return -1; })
59
60RTEMS_STUB(int, _Sched_Count(void), { return -1; })
61RTEMS_STUB(int, _Sched_Index(void), { return -1; })
62RTEMS_STUB(int, _Sched_Name_to_index(const char *p, size_t s), { return -1; })
63RTEMS_STUB(int, _Sched_Processor_count(int i), { return 1; })
64
65/* Stubs for routines from RTEMS <machine/_libatomic.h> */
66RTEMS_STUB(__uint32_t, _Libatomic_Protect_start(void *ptr), { return 0; });
67RTEMS_STUB(void, _Libatomic_Protect_end(void *ptr, __uint32_t isr_level), { });
68RTEMS_STUB(void, _Libatomic_Lock_n(void *ptr, __size_t n), { });
69RTEMS_STUB(void, _Libatomic_Unlock_n(void *ptr, __size_t n), { });
70
71/* Stubs for routines for arc4random (from <unistd.h> and <machine/_arc4random.h> */
72RTEMS_STUB(int,  getentropy(void *ptr, __size_t n), { return -1; });
73RTEMS_STUB(void, _arc4random_getentropy_fail(void), { });
74
75#if defined(__GNUC__)
76/*
77 * stubs for libstdc++ rtems-threads support functions from gcc/gthr-rtems.h
78 */
79int rtems_gxx_once() { return -1; }
80int rtems_gxx_key_create() { return -1; }
81int rtems_gxx_key_delete() { return -1; }
82void *rtems_gxx_getspecific() { return 0; }
83int rtems_gxx_setspecific() { return -1; }
84
85void rtems_gxx_mutex_init() { }
86int rtems_gxx_mutex_lock() { return -1; }
87int rtems_gxx_mutex_trylock() { return -1; }
88int rtems_gxx_mutex_unlock() { return -1; }
89
90void rtems_gxx_recursive_mutex_init() { }
91int rtems_gxx_recursive_mutex_lock() { return -1; }
92int rtems_gxx_recursive_mutex_trylock() { return -1; }
93int rtems_gxx_recursive_mutex_unlock() { return -1; }
94#endif
95
96/* stubs for functions RTEMS provides */
97RTEMS_STUB(int, access(const char *pathname, int mode), { return -1; })
98RTEMS_STUB(int, clock_gettime(clockid_t clk_id, struct timespec *tp), { return -1; })
99RTEMS_STUB(int, close (int fd), { return -1; })
100RTEMS_STUB(int, dup2(int oldfd, int newfd), { return -1; })
101RTEMS_STUB(int, fchmod(int fd, mode_t mode ), { return -1; })
102RTEMS_STUB(int, fcntl( int fd, int cmd, ... /* arg */ ), { return -1; })
103RTEMS_STUB(pid_t, fork(void), { return -1; })
104RTEMS_STUB(int, fstat(int fd, struct stat *buf), { return -1; })
105RTEMS_STUB(int, getdents(int fd, void *dp, int count), { return -1; })
106RTEMS_STUB(char *, getlogin(void), { return 0; })
107RTEMS_STUB(int, gettimeofday(struct timeval *__restrict tv, struct timezone *__restrict tz), { return -1; })
108RTEMS_STUB(struct passwd *, getpwnam(const char *name), { return 0; })
109RTEMS_STUB(struct passwd *, getpwuid(uid_t uid), { return 0; })
110RTEMS_STUB(uid_t, getuid(void), { return 0; })
111RTEMS_STUB(int, nanosleep(const struct timespec *req, struct timespec *rem), { return -1; })
112RTEMS_STUB(int, ftruncate(int fd, off_t length), { return -1; })
113RTEMS_STUB(_off_t, lseek(int fd, _off_t offset, int whence), { return -1; })
114RTEMS_STUB(int, lstat(const char *path, struct stat *buf), { return -1; })
115RTEMS_STUB(int, open(const char *pathname, int flags, int mode), { return -1; })
116RTEMS_STUB(int, pipe(int pipefd[2]), { return -1; })
117RTEMS_STUB(_ssize_t, read(int fd, void *buf, size_t count), { return -1; })
118RTEMS_STUB(ssize_t, readv (int fd, const struct iovec *iov, int iovcnt), { return -1; })
119RTEMS_STUB(int, sched_yield(void), { return -1; })
120RTEMS_STUB(int, sigfillset(sigset_t *set), { return -1; })
121RTEMS_STUB(int, sigprocmask(int how, const sigset_t *set, sigset_t *oldset), { return -1; })
122RTEMS_STUB(int, stat(const char *path, struct stat *buf), { return -1; })
123RTEMS_STUB(long, sysconf(int name), { return -1; })
124RTEMS_STUB(int, unlink(const char *pathname), { return -1; })
125RTEMS_STUB(pid_t, vfork(void), { return -1; })
126#if !defined(_NO_POPEN) && !defined(_NO_WORDEXP)
127/* pulled in by libc/sys/posix/popen.c and libc/sys/posix/word*.c */
128RTEMS_STUB(int, waitpid (pid_t pid, int *status, int options), { return -1; })
129#endif
130RTEMS_STUB(_ssize_t, write (int fd, const void *buf, size_t nbytes), { return -1; })
131RTEMS_STUB(ssize_t, writev (int fd, const struct iovec *iov, int iovcnt), { return -1; })
132
133/* stubs for functions from reent.h */
134RTEMS_STUB(int, _close_r (struct _reent *r, int fd), { return -1; })
135#if defined(_NO_EXECVE)
136RTEMS_STUB(int, _execve_r (struct _reent *r, char *, char **, char **), { return -1; })
137#endif
138RTEMS_STUB(int, _fcntl_r (struct _reent *ptr, int fd, int cmd, int arg ), { return -1; })
139#if !(defined (REENTRANT_SYSCALLS_PROVIDED) || defined (NO_EXEC))
140#ifndef NO_FORK
141/* cf. newlib/libc/reent/execr.c */
142RTEMS_STUB(int, _fork_r (struct _reent *r), { return -1; })
143#endif
144#endif
145RTEMS_STUB(int, _fstat_r (struct _reent *r, int fd, struct stat *buf), { return -1; })
146RTEMS_STUB(uid_t, geteuid (), { return -1; })
147RTEMS_STUB(gid_t, getgid (), { return -1; })
148RTEMS_STUB(gid_t, _getgid_r (struct _reent *r), { return -1; })
149RTEMS_STUB(struct _reent *, __getreent (void), { return 0; })
150RTEMS_STUB(pid_t, getpid (), { return -1; })
151RTEMS_STUB(pid_t, getppid (), { return -1; })
152RTEMS_STUB(pid_t, _getpid_r (struct _reent *r), { return -1; })
153RTEMS_STUB(int, _gettimeofday_r(struct _reent *r, struct timeval *tp, void *tzp), { return 0; })
154RTEMS_STUB(int, _isatty_r (struct _reent *r, int fd), { return isatty( fd ); })
155RTEMS_STUB(int, _kill_r (struct _reent *r, int pid, int sig ), { return -1; })
156#if !defined(REENTRANT_SYSCALLS_PROVIDED)
157/* cf. newlib/libc/reent/linkr.c */
158RTEMS_STUB(int, _link_r (struct _reent *r, const char *oldpath, const char *newpath), { return -1; })
159#endif
160RTEMS_STUB(_off_t, _lseek_r ( struct _reent *ptr, int fd, _off_t offset, int whence ), { return -1; })
161RTEMS_STUB(int, _open_r (struct _reent *r, const char *buf, int flags, int mode), { return -1; })
162RTEMS_STUB(_ssize_t, _read_r (struct _reent *r, int fd, void *buf, size_t nbytes), { return -1; })
163RTEMS_STUB(int, _rename_r (struct _reent *r, const char *a, const char *b), { return -1; })
164#if !(defined (REENTRANT_SYSCALLS_PROVIDED) || defined (MALLOC_PROVIDED))
165/* cf. newlib/libc/reent/sbrkr.c */
166RTEMS_STUB(void *,_sbrk_r (struct _reent *r, ptrdiff_t addr), { return 0; })
167#endif
168RTEMS_STUB(int, _stat_r (struct _reent *r, const char *path, struct stat *buf), { return -1; })
169RTEMS_STUB(_CLOCK_T_, _times_r (struct _reent *r, struct tms *ptms), { return -1; })
170RTEMS_STUB(int, _unlink_r (struct _reent *r, const char *path), { return -1; })
171#if !(defined (REENTRANT_SYSCALLS_PROVIDED) || defined (NO_EXEC))
172/* cf. newlib/libc/reent/execr.c */
173RTEMS_STUB(int, _wait_r (struct _reent *r, int *status), { return -1; })
174#endif
175RTEMS_STUB(_ssize_t, _write_r (struct _reent *r, int fd, const void *buf, size_t nbytes), { return -1; })
176
177
178RTEMS_STUB(int, _execve(const char *path, char * const *argv, char * const *envp), { return -1; })
179RTEMS_STUB(void, _exit(int status), { while(1); })
180
181/* Pulled in by newlib/libc/posix/glob.c */
182#ifndef _NO_GLOB
183#ifndef __NETBSD_SYSCALLS
184RTEMS_STUB(int, issetugid (void), { return 0; })
185#endif
186#endif
187
188/* stdlib.h */
189RTEMS_STUB(void *, _realloc_r(struct _reent *r, void *p, size_t s), { return 0; })
190RTEMS_STUB(void *, _calloc_r(struct _reent *r, size_t s1, size_t s2), { return 0; })
191RTEMS_STUB(void *, _malloc_r(struct _reent * r, size_t s), { return 0; })
192RTEMS_STUB(void, _free_r(struct _reent *r, void **p), { })
193
194/* stubs for functions required by libc/stdlib */
195RTEMS_STUB(void, __assert_func(const char *file, int line, const char *failedexpr), { })
196
197#if defined(__arm__)
198RTEMS_STUB(void, __aeabi_read_tp(void), { })
199RTEMS_STUB(void *, __tls_get_addr(const void *ti), { })
200#endif
201
202/* The PowerPC expects certain symbols to be defined in the linker script. */
203
204#if defined(__PPC__)
205  int __SDATA_START__;  int __SDATA2_START__;
206  int __GOT_START__;    int __GOT_END__;
207  int __GOT2_START__;   int __GOT2_END__;
208  int __SBSS_END__;     int __SBSS2_END__;
209  int __FIXUP_START__;  int __FIXUP_END__;
210  int __EXCEPT_START__; int __EXCEPT_END__;
211  int __init;           int __fini;
212  int __CTOR_LIST__;    int __CTOR_END__;
213  int __DTOR_LIST__;    int __DTOR_END__;
214#endif
215
216/* The SH expects certain symbols to be defined in the linker script. */
217
218#if defined(__sh__)
219int __EH_FRAME_BEGIN__;
220#endif
221
222#if defined(__AVR__)
223/*
224 * Initial stack pointer address "__stack"
225 *  hard coded into GCC instead of providing it through ldscripts
226 */
227const char* __stack ;
228#endif
Note: See TracBrowser for help on using the repository browser.