diff options
Diffstat (limited to 'kernel/src/utils/cxx/cxx_stuff.cpp')
| -rw-r--r-- | kernel/src/utils/cxx/cxx_stuff.cpp | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/kernel/src/utils/cxx/cxx_stuff.cpp b/kernel/src/utils/cxx/cxx_stuff.cpp new file mode 100644 index 0000000..c12546a --- /dev/null +++ b/kernel/src/utils/cxx/cxx_stuff.cpp @@ -0,0 +1,104 @@ +#include <cstdint> + +extern "C" { + +void *memcpy(void *__restrict dest, const void *__restrict src, std::size_t n) { + std::uint8_t *__restrict pdest = static_cast<std::uint8_t *__restrict>(dest); + const std::uint8_t *__restrict psrc = static_cast<const std::uint8_t *__restrict>(src); + + for (std::size_t i = 0; i < n; i++) { + pdest[i] = psrc[i]; + } + + return dest; +} + +void *memset(void *s, int c, std::size_t n) { + std::uint8_t *p = static_cast<std::uint8_t *>(s); + + for (std::size_t i = 0; i < n; i++) { + p[i] = static_cast<uint8_t>(c); + } + + return s; +} + +void *memmove(void *dest, const void *src, std::size_t n) { + std::uint8_t *pdest = static_cast<std::uint8_t *>(dest); + const std::uint8_t *psrc = static_cast<const std::uint8_t *>(src); + + if (reinterpret_cast<std::uintptr_t>(src) > reinterpret_cast<std::uintptr_t>(dest)) { + for (std::size_t i = 0; i < n; i++) { + pdest[i] = psrc[i]; + } + } else if (reinterpret_cast<std::uintptr_t>(src) < reinterpret_cast<std::uintptr_t>(dest)) { + for (std::size_t i = n; i > 0; i--) { + pdest[i-1] = psrc[i-1]; + } + } + + return dest; +} + +int memcmp(const void *s1, const void *s2, std::size_t n) { + const std::uint8_t *p1 = static_cast<const std::uint8_t *>(s1); + const std::uint8_t *p2 = static_cast<const std::uint8_t *>(s2); + + for (std::size_t i = 0; i < n; i++) { + if (p1[i] != p2[i]) { + return p1[i] < p2[i] ? -1 : 1; + } + } + + return 0; +} + +} + +#include <generic/arch.hpp> + +extern "C" { + int __cxa_atexit(void (*)(void *), void *, void *) { return 0; } + void __cxa_pure_virtual() { arch::hcf(); } + void *__dso_handle; +} + +#include <generic/heap.hpp> + +typedef unsigned long size_t; + +void *operator new(size_t size) +{ + void* p = kheap::malloc(size); + memset(p,0,size); + return p; +} + +void *operator new[](size_t size) +{ + void* p = kheap::malloc(size); + memset(p,0,size); + return p; +} + +void operator delete(void *p) +{ + kheap::free(p); +} + +void operator delete[](void *p) +{ + kheap::free(p); +} + +void operator delete(void *p, size_t size) +{ + (void)size; + kheap::free(p); +} + +void operator delete[](void *p, size_t size) +{ + (void)size; + kheap::free(p); +}
\ No newline at end of file |
