summaryrefslogtreecommitdiffhomepage
path: root/Kernel/Sources
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/Sources
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/Sources')
-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
7 files changed, 42 insertions, 48 deletions
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;
}