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;
74 static int _initialized;
78 BootstrapIOBackend *iob = new (&_iob) BootstrapIOBackend();
79 new (&cerr) BasicOStream(iob);
80 new (&cout) BasicOStream(iob);
87 static void call_ctors(Ctor **start, Ctor **end)
89 for (; start < end; ++start)
97 extern Ctor *__CTORS_BEGIN[];
98 extern Ctor *__CTORS_END[];
99 extern Ctor *__init_array_start[];
100 extern Ctor *__init_array_end[];
101 extern Ctor *__preinit_array_start[];
102 extern Ctor *__preinit_array_end[];
104 call_ctors(__preinit_array_start, __preinit_array_end);
105 call_ctors(__CTORS_BEGIN, __CTORS_END);
106 call_ctors(__init_array_start, __init_array_end);
110 static inline void clear_bss()
112 extern char _bss_start[], _bss_end[];
113 extern int crt0_stack_low, crt0_stack_high;
114 memset(_bss_start, 0, (char *)&crt0_stack_low - _bss_start);
115 memset((char *)&crt0_stack_high, 0, _bss_end - (char *)&crt0_stack_high);
119 void startup(unsigned long p1, unsigned long p2,
120 unsigned long p3, unsigned long p4);
124 extern "C" int __aeabi_unwind_cpp_pr0(void);
125 extern "C" int __aeabi_unwind_cpp_pr1(void);
126 enum { _URC_FAILURE = 9 };
127 extern "C" int __aeabi_unwind_cpp_pr0(void) { return _URC_FAILURE; }
128 extern "C" int __aeabi_unwind_cpp_pr1(void) { return _URC_FAILURE; }
130 extern "C" void __main();
135 asm volatile("mrc p15, 0, %0, c1, c0, 0" : "=r" (r) : : "memory");
137 r |= 2; // alignment check on
138 asm volatile("mcr p15, 0, %0, c1, c0, 0" : : "r" (r) : "memory");
142 Platform_base::iterate_platforms();
151 #include <l4/drivers/of.h>
152 extern "C" void __main(unsigned long p1, unsigned long p2, unsigned long p3);
153 void __main(unsigned long, unsigned long, unsigned long p3)
157 L4_drivers::Of::set_prom(p3); //p3 is OF prom pointer
158 Platform_base::iterate_platforms();
160 printf("PPC platform initialized\n");
167 #if defined(ARCH_x86) || defined(ARCH_amd64)
168 extern l4util_mb_info_t *x86_bootloader_mbi;
169 extern "C" void __main(unsigned long p1, unsigned long p2, unsigned long p3, unsigned long p4);
170 void __main(unsigned long p1, unsigned long p2, unsigned long p3, unsigned long p4)
173 x86_bootloader_mbi = (l4util_mb_info_t *)p1;
174 Platform_base::iterate_platforms();
175 startup(p1, p2, p3, p4);
179 #if defined(ARCH_sparc)
180 extern "C" void __main();
185 Platform_base::iterate_platforms();
190 void exit(int c) throw()
195 void (*__exit_cleanup) (int) = 0;
197 extern "C" void __attribute__((noreturn))
198 __assert(const char *, const char *, int, register const char *);
200 extern "C" void __attribute__((noreturn))
201 __assert(const char *assertion, const char * filename,
202 int linenumber, register const char * function)
204 printf("%s:%d: %s: Assertion `%s' failed.\n",
207 ((function == NULL) ? "?function?" : function),
216 write(int fd, const void *buf, size_t count)
221 if (fd == STDOUT_FILENO || fd == STDERR_FILENO)
223 char *b = (char *)buf;
229 uart()->write("\r", 1);
230 uart()->write(&c, 1);
249 c = uart()->get_char(0);
254 off_t lseek(int /*fd*/, off_t /*offset*/, int /*whence*/)
259 void *__dso_handle = &__dso_handle;
261 extern "C" void reboot(void) __attribute__((noreturn));
264 void reboot_arch() __attribute__((noreturn));
268 extern "C" void __attribute__((noreturn))
271 printf("\n\033[1mKey press reboots...\033[m\n");
273 printf("Rebooting.\n\n");
285 panic(const char *fmt, ...)