summaryrefslogtreecommitdiffhomepage
path: root/src/neboot-cxx-abi.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/neboot-cxx-abi.cpp')
-rw-r--r--src/neboot-cxx-abi.cpp76
1 files changed, 76 insertions, 0 deletions
diff --git a/src/neboot-cxx-abi.cpp b/src/neboot-cxx-abi.cpp
new file mode 100644
index 0000000..a630f3e
--- /dev/null
+++ b/src/neboot-cxx-abi.cpp
@@ -0,0 +1,76 @@
+// Copyright 2024-2026, Amlal El Mahrouss (amlal@nekernel.org)
+// Distributed under the Apache Software License, Version 2.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.apache.org/licenses/LICENSE-2.0)
+// Official repository: https://github.com/ne-foss-org/neboot
+
+#include <include/cxx-abi.hpp>
+
+/// BUGS: 0
+
+extern "C" __SIZE_TYPE__ nb_put_string(const char* text);
+extern "C" void nb_panic(const char* reason);
+
+extern "C" void __stack_chk_fail() {
+ nb_put_string("[stack-canary] Buffer overflow detected, halting...\n");
+ nb_panic("stack_canary_fail");
+}
+
+void* __dso_handle;
+
+extern "C" __SIZE_TYPE__ nb_put_string(const char* text);
+extern "C" void nb_panic(const char* reason);
+
+atexit_func_entry_t __atexit_funcs[DSO_MAX_OBJECTS];
+uarch_t __atexit_func_count;
+
+extern "C" void __cxa_pure_virtual() {
+ nb_put_string("[__cxa_pure_virtual] Placeholder\n");
+}
+
+extern "C" int __cxa_atexit(void (*f)(void*), void* arg, void* dso) {
+ if (__atexit_func_count >= DSO_MAX_OBJECTS) return -1;
+
+ __atexit_funcs[__atexit_func_count].destructor_func = f;
+ __atexit_funcs[__atexit_func_count].obj_ptr = arg;
+ __atexit_funcs[__atexit_func_count].dso_handle = dso;
+
+ __atexit_func_count++;
+
+ return 0;
+}
+
+extern "C" void __cxa_finalize(void* f) {
+ uarch_t i = __atexit_func_count;
+ if (!f) {
+ while (i--) {
+ if (__atexit_funcs[i].destructor_func) {
+ (*__atexit_funcs[i].destructor_func)(__atexit_funcs[i].obj_ptr);
+ };
+ }
+
+ return;
+ }
+
+ while (i--) {
+ if (__atexit_funcs[i].destructor_func) {
+ (*__atexit_funcs[i].destructor_func)(__atexit_funcs[i].obj_ptr);
+ __atexit_funcs[i].destructor_func = 0;
+ };
+ }
+}
+
+namespace cxxabiv1 {
+extern "C" int __cxa_guard_acquire(__guard* g) {
+ (void) g;
+ return 0;
+}
+
+extern "C" int __cxa_guard_release(__guard* g) {
+ *(char*) g = 1;
+ return 0;
+}
+
+extern "C" void __cxa_guard_abort(__guard* g) {
+ (void) g;
+}
+} // namespace cxxabiv1