diff options
author | Aqua-sama <aqua@iserlohn-fortress.net> | 2021-03-16 12:34:18 +0200 |
---|---|---|
committer | Aqua-sama <aqua@iserlohn-fortress.net> | 2021-03-16 12:34:18 +0200 |
commit | d39920b62e3e0371c5698aae2c316671130b0956 (patch) | |
tree | 7b561a5f53d1d4373fbe30c72d5ef3b9888a5d4a /libk | |
parent | Map .text and .rodata as read-only (diff) | |
download | kernel.cpp-d39920b62e3e0371c5698aae2c316671130b0956.tar.xz |
Switch lto to full
Diffstat (limited to 'libk')
-rw-r--r-- | libk/makefile | 2 | ||||
-rw-r--r-- | libk/stdlib/memory.cc | 47 |
2 files changed, 48 insertions, 1 deletions
diff --git a/libk/makefile b/libk/makefile index afea066..be4a3c0 100644 --- a/libk/makefile +++ b/libk/makefile @@ -1,5 +1,5 @@ CXX_OBJ += libk/string/string.o libk/string/integerview.o \ - libk/stdlib/abort.o libk/stdlib/console.o + libk/stdlib/abort.o libk/stdlib/console.o libk/stdlib/memory.o CXX_TEST_OBJ += libk/test/types.o libk/test/string.o libk/test/result.o diff --git a/libk/stdlib/memory.cc b/libk/stdlib/memory.cc new file mode 100644 index 0000000..c197519 --- /dev/null +++ b/libk/stdlib/memory.cc @@ -0,0 +1,47 @@ +#include <stdlib.h> + +void operator delete(void*) { + printk("Calling delete\n"); + abort(); +} + +extern "C" void __cxa_pure_virtual() { + printk("__cxa_pure_virtual\n"); + abort(); +} + +extern "C" void* memcpy(void* dstptr, const void* srcptr, const size_t n) { + auto* dst = static_cast<uint8_t*>(dstptr); + const auto* src = static_cast<const uint8_t*>(srcptr); + for (size_t i = 0; i < n; ++i) dst[i] = src[i]; + return dstptr; +} + +extern "C" void* memset(void* bufptr, const int value, const size_t n) { + auto* buf = static_cast<uint8_t*>(bufptr); + for (size_t i = 0; i < n; ++i) buf[i] = static_cast<uint8_t>(value); + return bufptr; +} + +extern "C" void* memmove(void* dstptr, const void* srcptr, const size_t n) { + auto* dst = static_cast<uint8_t*>(dstptr); + const auto* src = static_cast<const uint8_t*>(srcptr); + if (dst < src) { + for (size_t i = 0; i < n; ++i) dst[i] = src[i]; + } else { + for (size_t i = n; i != 0; i--) dst[i - 1] = src[i - 1]; + } + return dstptr; +} + +extern "C" int memcmp(const void* aptr, const void* bptr, const size_t n) { + const auto* a = static_cast<const uint8_t*>(aptr); + const auto* b = static_cast<const uint8_t*>(bptr); + for (size_t i = 0; i < n; ++i) { + if (a[i] < b[i]) + return -1; + else if (b[i] < a[i]) + return 1; + } + return 0; +} |