2 * \file bootstrap/server/src/libc_support.c
3 * \brief Support for C library
6 * \author Adam Lackorzynski <adam@os.inf.tu-dresden.de>,
7 * Frank Mehnert <fm3@os.inf.tu-dresden.de> */
10 * (c) 2005-2009 Author(s)
11 * economic rights: Technische Universität Dresden (Germany)
13 * This file is part of TUD:OS and distributed under the terms of the
14 * GNU General Public License 2.
15 * Please see the COPYING-GPL-2 file for details.
25 #include <sys/types.h>
28 #include <l4/cxx/basic_ostream>
32 Platform_base *Platform_base::platform;
34 static L4::Uart *stdio_uart;
37 { return stdio_uart; }
39 void set_stdio_uart(L4::Uart *uart)
40 { stdio_uart = uart; }
43 inline void *operator new (size_t, void *p) { return p; }
47 class BootstrapIOBackend : public L4::IOBackend
50 void write(char const *str, unsigned len);
53 void BootstrapIOBackend::write(char const *str, unsigned len)
55 ::write(STDOUT_FILENO, str, len);
61 typedef char Fake_iobackend[sizeof(BootstrapIOBackend)]
62 __attribute__((aligned(__alignof__(BootstrapIOBackend))));
63 typedef char Fake_ostream[sizeof(BasicOStream)]
64 __attribute__((aligned(__alignof__(BasicOStream))));
69 static Fake_iobackend _iob;
73 static int _initialized;
77 BootstrapIOBackend *iob = new (&_iob) BootstrapIOBackend();
78 new (&cerr) BasicOStream(iob);
79 new (&cout) BasicOStream(iob);
86 static void call_ctors(Ctor **start, Ctor **end)
88 for (; start < end; ++start)
96 extern Ctor *__CTORS_BEGIN[];
97 extern Ctor *__CTORS_END[];
98 extern Ctor *__init_array_start[];
99 extern Ctor *__init_array_end[];
100 extern Ctor *__preinit_array_start[];
101 extern Ctor *__preinit_array_end[];
103 call_ctors(__preinit_array_start, __preinit_array_end);
104 call_ctors(__CTORS_BEGIN, __CTORS_END);
105 call_ctors(__init_array_start, __init_array_end);
108 extern char _bss_start[], _bss_end[];
111 void startup(unsigned long p1, unsigned long p2,
112 unsigned long p3, unsigned long p4);
116 extern "C" int __aeabi_unwind_cpp_pr0(void);
117 extern "C" int __aeabi_unwind_cpp_pr1(void);
118 enum { _URC_FAILURE = 9 };
119 extern "C" int __aeabi_unwind_cpp_pr0(void) { return _URC_FAILURE; }
120 extern "C" int __aeabi_unwind_cpp_pr1(void) { return _URC_FAILURE; }
122 extern "C" void __main(int, const char **);
123 void __main(int, const char **)
125 extern int crt0_stack_low, crt0_stack_high;
128 asm volatile("mrc p15, 0, %0, c1, c0, 0" : "=r" (r) : : "memory");
129 r |= 2; // alignment check on
130 asm volatile("mcr p15, 0, %0, c1, c0, 0" : : "r" (r) : "memory");
132 memset(_bss_start, 0, (char *)&crt0_stack_low - _bss_start);
133 memset((char *)&crt0_stack_high, 0, _bss_end - (char *)&crt0_stack_high);
136 Platform_base::iterate_platforms();
145 #include <l4/drivers/of.h>
146 extern "C" void __main(unsigned long p1, unsigned long p2,
148 void __main(unsigned long /*p1*/, unsigned long /*p2*/, unsigned long p3)
150 extern int crt0_stack_low, crt0_stack_high;
151 memset(_bss_start, 0, (char *)&crt0_stack_low - _bss_start);
152 memset((char *)&crt0_stack_high, 0, _bss_end - (char *)&crt0_stack_high);
155 L4_drivers::Of::set_prom(p3); //p3 is OF prom pointer
156 Platform_base::iterate_platforms();
158 printf("PPC platform initialized\n");
165 #if defined(ARCH_x86) || defined(ARCH_amd64)
166 extern "C" void __main(unsigned long p1, unsigned long p2, unsigned long p3, unsigned long p4);
167 void __main(unsigned long p1, unsigned long p2, unsigned long p3, unsigned long p4)
170 Platform_base::iterate_platforms();
171 startup(p1, p2, p3, p4);
176 #if defined(ARCH_sparc)
177 extern "C" void __main(unsigned long p1, unsigned long p2, unsigned long p3);
178 void __main(unsigned long p1, unsigned long p2, unsigned long p3)
184 Platform_base::iterate_platforms();
189 void exit(int c) throw()
194 void (*__exit_cleanup) (int) = 0;
196 extern "C" void __attribute__((noreturn))
197 __assert(const char *assertion, const char * filename,
198 int linenumber, register const char * function)
200 printf("%s:%d: %s: Assertion `%s' failed.\n",
203 ((function == NULL) ? "?function?" : function),
212 write(int fd, const void *buf, size_t count)
216 // just accept write to stdout and stderr
217 if (fd == STDOUT_FILENO || fd == STDERR_FILENO)
219 uart()->write((const char*)buf, count);
223 // writes to other fds shall fail fast
237 c = uart()->get_char(0);
243 off_t lseek(int /*fd*/, off_t /*offset*/, int /*whence*/)
248 void *__dso_handle = &__dso_handle;
250 extern "C" void reboot(void) __attribute__((noreturn));
253 void reboot_arch() __attribute__((noreturn));
257 extern "C" void __attribute__((noreturn))
260 printf("\n\033[1mKey press reboots...\033[m\n");
262 printf("Rebooting.\n\n");
274 panic(const char *fmt, ...)