Files
bsb2/user/init.cc
Niklas Gollenstede 4245798955 fixes for A2
mostly include some things that should and remove some things that shouldn't have been included in the handout (yes this does hint at some places that need to be touched for A2)
2025-11-24 15:04:26 +01:00

74 lines
1.6 KiB
C++

#include <../libsys/stub.h>
#ifdef __cplusplus
extern "C" {
#endif
extern void _init();
extern void _fini();
extern void main();
extern void (*__preinit_array_start[])();
extern void (*__preinit_array_end[])();
extern void (*__init_array_start[])();
extern void (*__init_array_end[])();
extern void (*__fini_array_start[])();
extern void (*__fini_array_end[])();
[[gnu::used]] [[noreturn]] void start() {
const unsigned int preinit_size =
__preinit_array_end - __preinit_array_start;
for (unsigned int i = 0; i != preinit_size; ++i)
(*__preinit_array_start[i])();
const unsigned int init_size = __init_array_end - __init_array_start;
for (unsigned int i = 0; i != init_size; ++i) (*__init_array_start[i])();
main();
const unsigned int fini_size = __fini_array_end - __fini_array_start;
for (unsigned int i = 0; i != fini_size; ++i) (*__fini_array_start[i])();
sys_exit();
while (true) {
}
}
// additional C++ stuff
void __cxa_pure_virtual() {
// pure virtual error
}
// For libraries
int __cxa_atexit(void (*func)(void *), void *arg, void *dso_handle) {
(void)func;
(void)arg;
(void)dso_handle;
return 0;
}
#ifdef __cplusplus
}
#endif
void *operator new([[maybe_unused]] __SIZE_TYPE__ n) {
return reinterpret_cast<void *>(0xdeadbeef);
}
void *operator new[]([[maybe_unused]] __SIZE_TYPE__ n) {
return reinterpret_cast<void *>(0xdeadbeef);
}
void operator delete[](void *ptr) { operator delete(ptr); }
void operator delete[](void *ptr, [[maybe_unused]] __SIZE_TYPE__ size) {
operator delete(ptr);
}
void operator delete([[maybe_unused]] void *ptr) {}
void operator delete(void *ptr, [[maybe_unused]] __SIZE_TYPE__ size) {
operator delete(ptr);
}