summaryrefslogtreecommitdiffhomepage
path: root/Kernel/Source/ThreadLocalStorage.cxx
diff options
context:
space:
mode:
authorAmlal <amlalelmahrouss@icloud.com>2024-05-11 06:43:54 +0000
committerAmlal <amlalelmahrouss@icloud.com>2024-05-11 06:43:54 +0000
commitca675beb41dba8d7d16c5793b55d1672f38be3b4 (patch)
treec995ada42729ac2059a0ed87a4539d1a7e10b14a /Kernel/Source/ThreadLocalStorage.cxx
parent2b4a4792abf51487ab4a16106f9376f43acf381a (diff)
parentbc57a29a24b98b00ba17710ba84ec2188ab73504 (diff)
Merged in MHR-23 (pull request #12)
MHR-23: Merge work.
Diffstat (limited to 'Kernel/Source/ThreadLocalStorage.cxx')
-rw-r--r--Kernel/Source/ThreadLocalStorage.cxx58
1 files changed, 58 insertions, 0 deletions
diff --git a/Kernel/Source/ThreadLocalStorage.cxx b/Kernel/Source/ThreadLocalStorage.cxx
new file mode 100644
index 00000000..c31ae1c2
--- /dev/null
+++ b/Kernel/Source/ThreadLocalStorage.cxx
@@ -0,0 +1,58 @@
+/*
+ * ========================================================
+ *
+ * NewOS
+ * Copyright SoftwareLabs, 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";
+}