summaryrefslogtreecommitdiffhomepage
path: root/Kernel
diff options
context:
space:
mode:
authorAmlal EL Mahrouss <amlalelmahrouss@icloud.com>2024-06-18 10:39:00 +0200
committerAmlal EL Mahrouss <amlalelmahrouss@icloud.com>2024-06-18 10:43:43 +0200
commit596268586bb4c8248a8ec106b8cdea12b9ab926a (patch)
tree5fdad88c44af284271ffac1ad3fefcbfe0dac4a6 /Kernel
parent8051ad2bd4af1f226a9751288957ee6af7e787d7 (diff)
IMP: TLS syscall, serial write syscall.
FIX: SMP manager writes to stack frame directly, check if we also want to free the stack. Signed-off-by: Amlal EL Mahrouss <amlalelmahrouss@icloud.com>
Diffstat (limited to 'Kernel')
-rw-r--r--Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cpp20
-rw-r--r--Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp2
-rw-r--r--Kernel/HALKit/AMD64/HalKernelMain.cxx14
-rw-r--r--Kernel/KernelKit/ProcessScheduler.hxx4
-rw-r--r--Kernel/KernelKit/ThreadLocalStorage.hxx6
-rw-r--r--Kernel/KernelKit/ThreadLocalStorage.inl8
-rw-r--r--Kernel/NetworkKit/NetworkDevice.hpp2
-rw-r--r--Kernel/Sources/KeMain.cxx10
-rw-r--r--Kernel/Sources/Network/NetworkDevice.cxx4
-rw-r--r--Kernel/Sources/PEFSharedObject.cxx10
-rw-r--r--Kernel/Sources/ProcessScheduler.cxx12
-rw-r--r--Kernel/Sources/SMPManager.cxx44
-rw-r--r--Kernel/Sources/ThreadLocalStorage.cxx8
-rw-r--r--Kernel/Sources/UserHeap.cxx2
14 files changed, 74 insertions, 72 deletions
diff --git a/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cpp b/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cpp
index e9c0941c..657ab622 100644
--- a/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cpp
+++ b/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cpp
@@ -14,9 +14,9 @@ EXTERN_C void idt_handle_gpf(NewOS::UIntPtr rsp)
{
NewOS::kcout
<< "newoskrnl: General Protection Fault, caused by "
- << NewOS::ProcessScheduler::The().Leak().GetCurrent().Leak().GetName();
+ << NewOS::ProcessScheduler::The().Leak().TheCurrent().Leak().GetName();
- NewOS::ProcessScheduler::The().Leak().GetCurrent().Leak().Crash();
+ NewOS::ProcessScheduler::The().Leak().TheCurrent().Leak().Crash();
}
/// @brief Handle page fault.
@@ -25,9 +25,9 @@ EXTERN_C void idt_handle_pf(NewOS::UIntPtr rsp)
{
NewOS::kcout
<< "newoskrnl: Segmentation Fault, caused by "
- << NewOS::ProcessScheduler::The().Leak().GetCurrent().Leak().GetName();
+ << NewOS::ProcessScheduler::The().Leak().TheCurrent().Leak().GetName();
- NewOS::ProcessScheduler::The().Leak().GetCurrent().Leak().Crash();
+ NewOS::ProcessScheduler::The().Leak().TheCurrent().Leak().Crash();
}
/// @brief Handle math fault.
@@ -36,9 +36,9 @@ EXTERN_C void idt_handle_math(NewOS::UIntPtr rsp)
{
NewOS::kcout
<< "newoskrnl: Math error, caused by "
- << NewOS::ProcessScheduler::The().Leak().GetCurrent().Leak().GetName();
+ << NewOS::ProcessScheduler::The().Leak().TheCurrent().Leak().GetName();
- NewOS::ProcessScheduler::The().Leak().GetCurrent().Leak().Crash();
+ NewOS::ProcessScheduler::The().Leak().TheCurrent().Leak().Crash();
}
/// @brief Handle any generic fault.
@@ -47,9 +47,9 @@ EXTERN_C void idt_handle_generic(NewOS::UIntPtr rsp)
{
NewOS::kcout
<< "newoskrnl: Execution error, caused by "
- << NewOS::ProcessScheduler::The().Leak().GetCurrent().Leak().GetName();
+ << NewOS::ProcessScheduler::The().Leak().TheCurrent().Leak().GetName();
- NewOS::ProcessScheduler::The().Leak().GetCurrent().Leak().Crash();
+ NewOS::ProcessScheduler::The().Leak().TheCurrent().Leak().Crash();
}
/// @brief Handle #UD fault.
@@ -58,9 +58,9 @@ EXTERN_C void idt_handle_ud(NewOS::UIntPtr rsp)
{
NewOS::kcout
<< "newoskrnl: Invalid interrupt, caused by "
- << NewOS::ProcessScheduler::The().Leak().GetCurrent().Leak().GetName();
+ << NewOS::ProcessScheduler::The().Leak().TheCurrent().Leak().GetName();
- NewOS::ProcessScheduler::The().Leak().GetCurrent().Leak().Crash();
+ NewOS::ProcessScheduler::The().Leak().TheCurrent().Leak().Crash();
}
/// @brief Enter syscall from assembly.
diff --git a/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp b/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp
index 26773640..4e9d2ff6 100644
--- a/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp
+++ b/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp
@@ -185,7 +185,7 @@ namespace NewOS::HAL
{
Semaphore sem;
- sem.LockOrWait(&ProcessScheduler::The().Leak().GetCurrent().Leak(), Seconds(5));
+ sem.LockOrWait(&ProcessScheduler::The().Leak().TheCurrent().Leak(), Seconds(5));
cFramePtr = stackFrame;
diff --git a/Kernel/HALKit/AMD64/HalKernelMain.cxx b/Kernel/HALKit/AMD64/HalKernelMain.cxx
index cafa6388..3fac40ca 100644
--- a/Kernel/HALKit/AMD64/HalKernelMain.cxx
+++ b/Kernel/HALKit/AMD64/HalKernelMain.cxx
@@ -76,14 +76,20 @@ EXTERN_C void hal_init_platform(
/* install basic hooks. */
- constexpr auto cDummyInterrupt = 0x10; // 16
+ constexpr auto cSerialWriteInterrupt = 0x10; // 16
+ constexpr auto cTlsInterrupt = 0x11; // 17
- kSyscalls[cDummyInterrupt].Leak().Leak()->fProc = [](NewOS::VoidPtr sf) -> void {
- const char* msg = (const char*)sf;
+ kSyscalls[cSerialWriteInterrupt].Leak().Leak()->fProc = [](NewOS::VoidPtr rdx) -> void {
+ const char* msg = (const char*)rdx;
NewOS::kcout << "newoskrnl: " << msg << "\r";
};
- kSyscalls[cDummyInterrupt].Leak().Leak()->fHooked = true;
+ kSyscalls[cTlsInterrupt].Leak().Leak()->fProc = [](NewOS::VoidPtr rdx)->void {
+ tls_check_syscall_impl(rdx);
+ };
+
+ kSyscalls[cSerialWriteInterrupt].Leak().Leak()->fHooked = true;
+ kSyscalls[cTlsInterrupt].Leak().Leak()->fHooked = true;
NewOS::HAL::Detail::_ke_power_on_self_test();
diff --git a/Kernel/KernelKit/ProcessScheduler.hxx b/Kernel/KernelKit/ProcessScheduler.hxx
index 7c8f99be..8c470bb4 100644
--- a/Kernel/KernelKit/ProcessScheduler.hxx
+++ b/Kernel/KernelKit/ProcessScheduler.hxx
@@ -249,7 +249,7 @@ namespace NewOS
bool Remove(SizeT headerIndex);
public:
- Ref<ProcessHeader>& GetCurrent();
+ Ref<ProcessHeader>& TheCurrent();
SizeT Run() noexcept;
public:
@@ -268,7 +268,7 @@ namespace NewOS
public:
static bool Switch(HAL::StackFrame* newStack, const PID& newPid);
static bool CanBeScheduled(Ref<ProcessHeader>& process);
- static PID& GetCurrentPID();
+ static PID& TheCurrentPID();
static SizeT StartScheduling();
};
diff --git a/Kernel/KernelKit/ThreadLocalStorage.hxx b/Kernel/KernelKit/ThreadLocalStorage.hxx
index eaae7991..432cc9ac 100644
--- a/Kernel/KernelKit/ThreadLocalStorage.hxx
+++ b/Kernel/KernelKit/ThreadLocalStorage.hxx
@@ -37,14 +37,16 @@ struct PACKED ThreadInformationBlock final
NewOS::Int32 ThreadID; // Thread execution ID.
};
+typedef struct ThreadInformationBlock ProcessInformationBlock;
+
/// @brief TLS install TIB and PIB.
-EXTERN_C void rt_install_tib(ThreadInformationBlock* TIB, NewOS::VoidPtr PIB);
+EXTERN_C void rt_install_tib(ThreadInformationBlock* TIB, ThreadInformationBlock* PIB);
///! @brief Cookie Sanity check.
NewOS::Boolean tls_check_tib(ThreadInformationBlock* Ptr);
/// @brief TLS check system call
-EXTERN_C NewOS::Void tls_check_syscall_impl(NewOS::HAL::StackFramePtr StackPtr) noexcept;
+EXTERN_C NewOS::Void tls_check_syscall_impl(NewOS::VoidPtr TIB) noexcept;
#include <KernelKit/ThreadLocalStorage.inl>
diff --git a/Kernel/KernelKit/ThreadLocalStorage.inl b/Kernel/KernelKit/ThreadLocalStorage.inl
index 1df825a3..6dbff3a1 100644
--- a/Kernel/KernelKit/ThreadLocalStorage.inl
+++ b/Kernel/KernelKit/ThreadLocalStorage.inl
@@ -15,9 +15,9 @@ inline T* tls_new_ptr(void)
{
using namespace NewOS;
- MUST_PASS(ProcessScheduler::The().Leak().GetCurrent());
+ MUST_PASS(ProcessScheduler::The().Leak().TheCurrent());
- auto ref_process = ProcessScheduler::The().Leak().GetCurrent();
+ auto ref_process = ProcessScheduler::The().Leak().TheCurrent();
T* pointer = (T*)ref_process.Leak().New(sizeof(T));
return pointer;
@@ -32,9 +32,9 @@ inline bool tls_delete_ptr(T* ptr)
using namespace NewOS;
- MUST_PASS(ProcessScheduler::The().Leak().GetCurrent());
+ MUST_PASS(ProcessScheduler::The().Leak().TheCurrent());
- auto ref_process = ProcessScheduler::The().Leak().GetCurrent();
+ auto ref_process = ProcessScheduler::The().Leak().TheCurrent();
return ref_process.Leak().Delete(ptr, sizeof(T));
}
diff --git a/Kernel/NetworkKit/NetworkDevice.hpp b/Kernel/NetworkKit/NetworkDevice.hpp
index 4ea98e4f..9b251c2e 100644
--- a/Kernel/NetworkKit/NetworkDevice.hpp
+++ b/Kernel/NetworkKit/NetworkDevice.hpp
@@ -38,7 +38,7 @@ namespace NewOS
Boolean Name(const char* strView);
private:
- constexpr auto cNetworkNameLen = 512;
+ static constexpr auto cNetworkNameLen = 512;
Void (*fCleanup)(void);
Char fNetworkName[cNetworkNameLen];
diff --git a/Kernel/Sources/KeMain.cxx b/Kernel/Sources/KeMain.cxx
index 83702d77..fb127271 100644
--- a/Kernel/Sources/KeMain.cxx
+++ b/Kernel/Sources/KeMain.cxx
@@ -28,13 +28,13 @@ namespace NewOS::Detail
{
/// @brief Filesystem auto mounter, additional checks are also done by the
/// class.
- class FilesystemWizard final
+ class FilesystemInstaller final
{
NewOS::NewFilesystemManager* fNewFS{nullptr};
public:
/// @brief wizard constructor.
- explicit FilesystemWizard()
+ explicit FilesystemInstaller()
{
if (NewOS::FilesystemManagerInterface::GetMounted())
{
@@ -166,9 +166,9 @@ namespace NewOS::Detail
}
}
- ~FilesystemWizard() = default;
+ ~FilesystemInstaller() = default;
- NEWOS_COPY_DEFAULT(FilesystemWizard);
+ NEWOS_COPY_DEFAULT(FilesystemInstaller);
/// @brief Grab the disk's NewFS reference.
/// @return NewFilesystemManager the filesystem interface
@@ -211,7 +211,7 @@ namespace NewOS::Detail
EXTERN_C NewOS::Void KeMain(NewOS::Void)
{
/// Now run kernel loop, until no process are running.
- NewOS::Detail::FilesystemWizard wizard; // automatic filesystem creation.
+ NewOS::Detail::FilesystemInstaller installer; // automatic filesystem creation.
NewOS::Detail::ke_launch_srv();
diff --git a/Kernel/Sources/Network/NetworkDevice.cxx b/Kernel/Sources/Network/NetworkDevice.cxx
index e1994baa..027613ac 100644
--- a/Kernel/Sources/Network/NetworkDevice.cxx
+++ b/Kernel/Sources/Network/NetworkDevice.cxx
@@ -5,6 +5,7 @@
------------------------------------------- */
#include <NetworkKit/NetworkDevice.hpp>
+#include <NewKit/Utils.hpp>
namespace NewOS
{
@@ -26,7 +27,8 @@ namespace NewOS
if (rt_string_len(strView) > cNetworkNameLen)
return false;
- rt_copy_memory(strView, this->fNetworkName, rt_string_len(strView));
+ rt_copy_memory((VoidPtr)strView,
+ (VoidPtr)this->fNetworkName, rt_string_len(strView));
return true;
}
diff --git a/Kernel/Sources/PEFSharedObject.cxx b/Kernel/Sources/PEFSharedObject.cxx
index 5103e075..0d5949f1 100644
--- a/Kernel/Sources/PEFSharedObject.cxx
+++ b/Kernel/Sources/PEFSharedObject.cxx
@@ -41,7 +41,7 @@ EXTERN_C SharedObjectPtr rt_library_init(void)
if (!library)
{
- ProcessScheduler::The().Leak().GetCurrent().Leak().Crash();
+ ProcessScheduler::The().Leak().TheCurrent().Leak().Crash();
return nullptr;
}
@@ -50,17 +50,17 @@ EXTERN_C SharedObjectPtr rt_library_init(void)
if (!library->Get())
{
- ProcessScheduler::The().Leak().GetCurrent().Leak().Crash();
+ ProcessScheduler::The().Leak().TheCurrent().Leak().Crash();
return nullptr;
}
library->Get()->fImageObject =
- ProcessScheduler::The().Leak().GetCurrent().Leak().Image;
+ ProcessScheduler::The().Leak().TheCurrent().Leak().Image;
if (!library->Get()->fImageObject)
{
- ProcessScheduler::The().Leak().GetCurrent().Leak().Crash();
+ ProcessScheduler::The().Leak().TheCurrent().Leak().Crash();
return nullptr;
}
@@ -85,7 +85,7 @@ EXTERN_C Void rt_library_free(SharedObjectPtr lib, bool* successful)
if (lib == nullptr)
{
*successful = false;
- ProcessScheduler::The().Leak().GetCurrent().Leak().Crash();
+ ProcessScheduler::The().Leak().TheCurrent().Leak().Crash();
}
delete lib->Get();
diff --git a/Kernel/Sources/ProcessScheduler.cxx b/Kernel/Sources/ProcessScheduler.cxx
index d232c72e..aae69386 100644
--- a/Kernel/Sources/ProcessScheduler.cxx
+++ b/Kernel/Sources/ProcessScheduler.cxx
@@ -161,7 +161,7 @@ namespace NewOS
void ProcessHeader::Exit(Int32 exit_code)
{
if (this->ProcessId !=
- ProcessScheduler::The().Leak().GetCurrent().Leak().ProcessId)
+ ProcessScheduler::The().Leak().TheCurrent().Leak().ProcessId)
ke_stop(RUNTIME_CHECK_PROCESS);
kLastExitCode = exit_code;
@@ -286,17 +286,17 @@ namespace NewOS
/// @brief Gets current running process.
/// @return
- Ref<ProcessHeader>& ProcessScheduler::GetCurrent()
+ Ref<ProcessHeader>& ProcessScheduler::TheCurrent()
{
return mTeam.AsRef();
}
/// @brief Current proccess id getter.
/// @return Process ID integer.
- PID& ProcessHelper::GetCurrentPID()
+ PID& ProcessHelper::TheCurrentPID()
{
- kcout << "ProcessHelper::GetCurrentPID: Leaking ProcessId...\r";
- return ProcessScheduler::The().Leak().GetCurrent().Leak().ProcessId;
+ kcout << "ProcessHelper::TheCurrentPID: Leaking ProcessId...\r";
+ return ProcessScheduler::The().Leak().TheCurrent().Leak().ProcessId;
}
/// @brief Check if process can be schedulded.
@@ -368,7 +368,7 @@ namespace NewOS
ThreadKind::kHartSystemReserved)
{
SMPManager::The().Leak()[index].Leak()->Busy(true);
- ProcessHelper::GetCurrentPID() = new_pid;
+ ProcessHelper::TheCurrentPID() = new_pid;
return SMPManager::The().Leak()[index].Leak()->Switch(the_stack);
}
diff --git a/Kernel/Sources/SMPManager.cxx b/Kernel/Sources/SMPManager.cxx
index 5002e880..149b1334 100644
--- a/Kernel/Sources/SMPManager.cxx
+++ b/Kernel/Sources/SMPManager.cxx
@@ -85,36 +85,26 @@ namespace NewOS
bool HardwareThread::Switch(HAL::StackFramePtr stack)
{
if (!rt_check_stack(stack))
- return false;
-
- if (!fStack)
- {
- fStack = stack;
- }
- else
{
- /// Keep the arguments, switch the base pointer, stack pointer
- /// fs and gs registers.
- fStack->Rbp = stack->Rbp;
- fStack->Rsp = stack->Rsp;
- fStack->Fs = stack->Fs;
- fStack->Gs = stack->Gs;
-
- // save global registers.
-
- fStack->R15 = stack->R15;
- fStack->R14 = stack->R14;
+ /// provide 'nullptr' to free the stack frame.
+ if (stack == nullptr)
+ {
+ delete fStack;
+ fStack = nullptr;
- fStack->R13 = stack->R13;
- fStack->R12 = stack->R12;
- fStack->R11 = stack->R11;
+ return true;
+ }
- fStack->R10 = stack->R10;
- fStack->R9 = stack->R9;
- fStack->R8 = stack->R8;
+ return false;
+ }
- fStack->Rcx = this->fID;
+ if (fStack)
+ {
+ delete fStack;
+ fStack = nullptr;
}
+
+ fStack = stack;
rt_do_context_switch(fStack);
@@ -146,7 +136,7 @@ namespace NewOS
HAL::StackFramePtr SMPManager::Leak() noexcept
{
if (fThreadList[fCurrentThread].Leak() &&
- ProcessHelper::GetCurrentPID() ==
+ ProcessHelper::TheCurrentPID() ==
fThreadList[fCurrentThread].Leak().Leak()->fPID)
return fThreadList[fCurrentThread].Leak().Leak()->fStack;
@@ -189,7 +179,7 @@ namespace NewOS
fThreadList[idx].Leak().Leak()->Switch(fThreadList[idx].Leak().Leak()->fStack);
- fThreadList[idx].Leak().Leak()->fPID = ProcessHelper::GetCurrentPID();
+ fThreadList[idx].Leak().Leak()->fPID = ProcessHelper::TheCurrentPID();
fThreadList[idx].Leak().Leak()->Busy(false);
diff --git a/Kernel/Sources/ThreadLocalStorage.cxx b/Kernel/Sources/ThreadLocalStorage.cxx
index c292d078..4d6fec14 100644
--- a/Kernel/Sources/ThreadLocalStorage.cxx
+++ b/Kernel/Sources/ThreadLocalStorage.cxx
@@ -44,14 +44,16 @@ Boolean tls_check_tib(ThreadInformationBlock* tib)
* @param stackPtr The call frame.
* @return
*/
-EXTERN_C Void tls_check_syscall_impl(NewOS::HAL::StackFramePtr stackPtr) noexcept
+EXTERN_C Void tls_check_syscall_impl(NewOS::VoidPtr TIB) noexcept
{
- ThreadInformationBlock* tib = (ThreadInformationBlock*)stackPtr->Gs;
+ if (!TIB) return;
+
+ ThreadInformationBlock* tib = (ThreadInformationBlock*)TIB;
if (!tls_check_tib(tib))
{
kcout << "newoskrnl: Verification failed, Crashing...\r";
- ProcessScheduler::The().Leak().GetCurrent().Leak().Crash();
+ ProcessScheduler::The().Leak().TheCurrent().Leak().Crash();
}
kcout << "newoskrnl: Verification succeeded! Keeping on...\r";
diff --git a/Kernel/Sources/UserHeap.cxx b/Kernel/Sources/UserHeap.cxx
index d1de13a6..f20e30f8 100644
--- a/Kernel/Sources/UserHeap.cxx
+++ b/Kernel/Sources/UserHeap.cxx
@@ -150,7 +150,7 @@ namespace NewOS
{
if (!poolHdr->fFree)
{
- ProcessScheduler::The().Leak().GetCurrent().Leak().Crash();
+ ProcessScheduler::The().Leak().TheCurrent().Leak().Crash();
return;
}