summaryrefslogtreecommitdiffhomepage
path: root/NewKernel/Source/ThreadLocalStorage.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'NewKernel/Source/ThreadLocalStorage.cxx')
-rw-r--r--NewKernel/Source/ThreadLocalStorage.cxx58
1 files changed, 58 insertions, 0 deletions
diff --git a/NewKernel/Source/ThreadLocalStorage.cxx b/NewKernel/Source/ThreadLocalStorage.cxx
new file mode 100644
index 00000000..9330e8f4
--- /dev/null
+++ b/NewKernel/Source/ThreadLocalStorage.cxx
@@ -0,0 +1,58 @@
+/*
+ * ========================================================
+ *
+ * NewOS
+ * Copyright Mahrouss Logic, all rights reserved.
+ *
+ * ========================================================
+ */
+
+#include <KernelKit/ProcessScheduler.hpp>
+#include <KernelKit/ThreadLocalStorage.hxx>
+
+///! BUGS: 0
+
+/***********************************************************************************/
+/// @file ThreadLocalStorage.cxx
+/// @brief TLS implementation in kernel.
+/***********************************************************************************/
+
+using namespace NewOS;
+
+/**
+ * @brief Check for cookie inside TIB.
+ * @param tib the TIB to check.
+ * @return if the cookie is enabled.
+ */
+
+Boolean tls_check_tib(ThreadInformationBlock* tib)
+{
+ if (!tib)
+ return false;
+
+ Encoder encoder;
+ const char* tibAsBytes = encoder.AsBytes(tib);
+
+ kcout << "New OS: Checking for a valid cookie...\r";
+
+ return tibAsBytes[0] == kCookieMag0 && tibAsBytes[1] == kCookieMag1 &&
+ tibAsBytes[2] == kCookieMag2;
+}
+
+/**
+ * @brief System call implementation of the TLS check.
+ * @param stackPtr The call frame.
+ * @return
+ */
+EXTERN_C Void tls_check_syscall_impl(NewOS::HAL::StackFramePtr stackPtr) noexcept
+{
+ ThreadInformationBlock* tib = (ThreadInformationBlock*)stackPtr->Gs;
+
+ if (!tls_check_tib(tib))
+ {
+ kcout << "New OS: Verification failed, Crashing...\r";
+ ProcessScheduler::Shared().Leak().GetCurrent().Leak().Crash();
+ }
+
+ kcout << "New OS: Verification succeeded! Keeping on...\r";
+}