diff options
Diffstat (limited to 'libs/kstd/src')
| -rw-r--r-- | libs/kstd/src/bits/os.cpp | 10 | ||||
| -rw-r--r-- | libs/kstd/src/libc/stdlib.cpp | 19 | ||||
| -rw-r--r-- | libs/kstd/src/libc/string.cpp | 32 | ||||
| -rw-r--r-- | libs/kstd/src/mutex.cpp | 24 |
4 files changed, 85 insertions, 0 deletions
diff --git a/libs/kstd/src/bits/os.cpp b/libs/kstd/src/bits/os.cpp new file mode 100644 index 0000000..e6edbfd --- /dev/null +++ b/libs/kstd/src/bits/os.cpp @@ -0,0 +1,10 @@ +#include "kstd/bits/os.hpp" + +namespace kstd::os +{ + [[gnu::weak, noreturn]] + auto abort() -> void + { + os::panic("Abort called."); + } +} // namespace kstd::os
\ No newline at end of file diff --git a/libs/kstd/src/libc/stdlib.cpp b/libs/kstd/src/libc/stdlib.cpp new file mode 100644 index 0000000..a0f062a --- /dev/null +++ b/libs/kstd/src/libc/stdlib.cpp @@ -0,0 +1,19 @@ +#include "kstd/bits/os.hpp" + +namespace kstd::libc +{ + + extern "C" + { + [[noreturn]] auto abort() -> void + { + kstd::os::abort(); + } + + [[noreturn, gnu::weak]] auto free(void *) -> void + { + kstd::os::panic("Tried to call free."); + } + } + +} // namespace kstd::libc
\ No newline at end of file diff --git a/libs/kstd/src/libc/string.cpp b/libs/kstd/src/libc/string.cpp new file mode 100644 index 0000000..319f6fd --- /dev/null +++ b/libs/kstd/src/libc/string.cpp @@ -0,0 +1,32 @@ +#include <algorithm> +#include <bit> +#include <cstddef> +#include <iterator> +#include <span> + +namespace kstd::libc +{ + + extern "C" + { + auto strlen(char const * string) -> std::size_t + { + return std::distance(string, std::ranges::find(string, nullptr, '\0')); + } + + auto memcmp(void const * lhs, void const * rhs, std::size_t size) -> std::size_t + { + auto left_span = std::span{static_cast<std::byte const *>(lhs), size}; + auto right_span = std::span{static_cast<std::byte const *>(rhs), size}; + auto mismatched = std::ranges::mismatch(left_span, right_span); + + if (mismatched.in1 == left_span.end()) + { + return 0; + } + + return std::bit_cast<char>(*mismatched.in1) - std::bit_cast<char>(*mismatched.in2); + } + } + +} // namespace kstd::libc
\ No newline at end of file diff --git a/libs/kstd/src/mutex.cpp b/libs/kstd/src/mutex.cpp new file mode 100644 index 0000000..5a26154 --- /dev/null +++ b/libs/kstd/src/mutex.cpp @@ -0,0 +1,24 @@ +#include "kstd/mutex" + +#include <atomic> + +namespace kstd +{ + auto mutex::lock() -> void + { + while (!try_lock()) + { + asm volatile("nop"); + } + } + + auto mutex::try_lock() -> bool + { + return !locked.exchange(true, std::memory_order_acquire); + } + + auto mutex::unlock() -> void + { + locked.store(false, std::memory_order_release); + } +} // namespace kstd |
