summaryrefslogtreecommitdiffhomepage
path: root/dev/ZKAKit/src
diff options
context:
space:
mode:
authorAmlal <amlal.elmahrouss@icloud.com>2024-10-29 07:11:56 +0100
committerAmlal <amlal.elmahrouss@icloud.com>2024-10-29 07:11:56 +0100
commitc08af30448618c5d1950dc1fa0fb1685782e7b22 (patch)
treebc12b43a94fe4d4ff60b0f7c17100a179d95d0dc /dev/ZKAKit/src
parent0511c53e648e5f253cd9e83c9e211aa6600db377 (diff)
FIX: Fix scheduler crash (1/2)
- UserProcessScheduler has been improved and cleaned up. - Same goes for the HardwareThreadScheduler Signed-off-by: Amlal <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'dev/ZKAKit/src')
-rw-r--r--dev/ZKAKit/src/BitMapMgr.cc5
-rw-r--r--dev/ZKAKit/src/CodeMgr.cc2
-rw-r--r--dev/ZKAKit/src/CxxAbi-AMD64.cc4
-rw-r--r--dev/ZKAKit/src/CxxAbi-ARM64.cc4
-rw-r--r--dev/ZKAKit/src/HardwareThreadScheduler.cc5
-rw-r--r--dev/ZKAKit/src/PEFCodeMgr.cc58
-rw-r--r--dev/ZKAKit/src/UserProcessScheduler.cc50
7 files changed, 44 insertions, 84 deletions
diff --git a/dev/ZKAKit/src/BitMapMgr.cc b/dev/ZKAKit/src/BitMapMgr.cc
index 27158a12..1477dea0 100644
--- a/dev/ZKAKit/src/BitMapMgr.cc
+++ b/dev/ZKAKit/src/BitMapMgr.cc
@@ -162,11 +162,6 @@ namespace Kernel
ptr_new = traits.FindBitMap(kKernelBitMpStart, size, wr, user);
- if (!ptr_new)
- {
- return nullptr;
- }
-
return (UIntPtr*)ptr_new;
}
diff --git a/dev/ZKAKit/src/CodeMgr.cc b/dev/ZKAKit/src/CodeMgr.cc
index c855347b..429858d6 100644
--- a/dev/ZKAKit/src/CodeMgr.cc
+++ b/dev/ZKAKit/src/CodeMgr.cc
@@ -14,7 +14,7 @@ namespace Kernel
/// @note This sets up a new stack, anything on the main function that calls the Kernel will not be accessible.
/// @param main the start of the process.
/// @return if the process was started or not.
- SizeT rtl_create_process(MainKind main, const Char* process_name) noexcept
+ ProcessID rtl_create_process(MainKind main, const Char* process_name) noexcept
{
if (!main)
return No;
diff --git a/dev/ZKAKit/src/CxxAbi-AMD64.cc b/dev/ZKAKit/src/CxxAbi-AMD64.cc
index 1aac28e6..0ebebee9 100644
--- a/dev/ZKAKit/src/CxxAbi-AMD64.cc
+++ b/dev/ZKAKit/src/CxxAbi-AMD64.cc
@@ -10,7 +10,7 @@
#include <NewKit/CxxAbi.h>
#include <KernelKit/LPC.h>
-atexit_func_entry_t __atexit_funcs[kDSOMaxObjects];
+atexit_func_entry_t __atexit_funcs[kAtExitMacDestructors];
uarch_t __atexit_func_count;
@@ -29,7 +29,7 @@ EXTERN_C void ___chkstk_ms(void)
EXTERN_C int atexit(void (*f)(void*), void* arg, void* dso)
{
- if (__atexit_func_count >= kDSOMaxObjects)
+ if (__atexit_func_count >= kAtExitMacDestructors)
return -1;
__atexit_funcs[__atexit_func_count].destructor_func = f;
diff --git a/dev/ZKAKit/src/CxxAbi-ARM64.cc b/dev/ZKAKit/src/CxxAbi-ARM64.cc
index 6b5c1a0e..a222e4bb 100644
--- a/dev/ZKAKit/src/CxxAbi-ARM64.cc
+++ b/dev/ZKAKit/src/CxxAbi-ARM64.cc
@@ -10,7 +10,7 @@
#include <NewKit/CxxAbi.h>
#include <KernelKit/LPC.h>
-atexit_func_entry_t __atexit_funcs[kDSOMaxObjects];
+atexit_func_entry_t __atexit_funcs[kAtExitMacDestructors];
uarch_t __atexit_func_count;
@@ -23,7 +23,7 @@ EXTERN_C void __chkstk(void)
EXTERN_C int atexit(void (*f)(void*), void* arg, void* dso)
{
- if (__atexit_func_count >= kDSOMaxObjects)
+ if (__atexit_func_count >= kAtExitMacDestructors)
return -1;
__atexit_funcs[__atexit_func_count].destructor_func = f;
diff --git a/dev/ZKAKit/src/HardwareThreadScheduler.cc b/dev/ZKAKit/src/HardwareThreadScheduler.cc
index ddfd0ee7..f0605ff6 100644
--- a/dev/ZKAKit/src/HardwareThreadScheduler.cc
+++ b/dev/ZKAKit/src/HardwareThreadScheduler.cc
@@ -17,7 +17,7 @@
namespace Kernel
{
- HardwareThreadScheduler* kHardwareThreadScheduler = nullptr;
+ HardwareThreadScheduler kHardwareThreadScheduler;
///! A HardwareThread class takes care of it's owned hardware thread.
///! It has a stack for it's core.
@@ -136,8 +136,7 @@ namespace Kernel
/// @brief Shared singleton function
HardwareThreadScheduler& HardwareThreadScheduler::The()
{
- MUST_PASS(kHardwareThreadScheduler);
- return *kHardwareThreadScheduler;
+ return kHardwareThreadScheduler;
}
/// @brief Get Stack Frame of Core
diff --git a/dev/ZKAKit/src/PEFCodeMgr.cc b/dev/ZKAKit/src/PEFCodeMgr.cc
index 45a5e46c..8c18dfe3 100644
--- a/dev/ZKAKit/src/PEFCodeMgr.cc
+++ b/dev/ZKAKit/src/PEFCodeMgr.cc
@@ -199,16 +199,43 @@ namespace Kernel
return !fBad && fCachedBlob;
}
+ const Char* PEFLoader::Path()
+ {
+ return fPath.Leak().CData();
+ }
+
+ const Char* PEFLoader::AsString()
+ {
+#ifdef __32x0__
+ return "32x0 PEF executable.";
+#elif defined(__64x0__)
+ return "64x0 PEF executable.";
+#elif defined(__x86_64__)
+ return "x86_64 PEF executable.";
+#elif defined(__aarch64__)
+ return "aarch64 PEF executable.";
+#elif defined(__powerpc64__)
+ return "POWER64 PEF executable.";
+#else
+ return "???? PEF executable.";
+#endif // __32x0__ || __64x0__ || __x86_64__ || __powerpc64__
+ }
+
+ const Char* PEFLoader::MIME()
+ {
+ return kPefApplicationMime;
+ }
+
namespace Utils
{
- SizeT execute_from_image(PEFLoader& exec, const Int32& procKind) noexcept
+ ProcessID execute_from_image(PEFLoader& exec, const Int32& procKind) noexcept
{
auto errOrStart = exec.FindStart();
if (errOrStart.Error() != kErrorSuccess)
return No;
- UserProcess proc;
+ UserProcess proc{};
proc.Image = errOrStart.Leak().Leak();
proc.Kind = procKind;
@@ -229,31 +256,4 @@ namespace Kernel
return UserProcessScheduler::The().Add(proc);
}
} // namespace Utils
-
- const Char* PEFLoader::Path()
- {
- return fPath.Leak().CData();
- }
-
- const Char* PEFLoader::AsString()
- {
-#ifdef __32x0__
- return "32x0 PEF executable.";
-#elif defined(__64x0__)
- return "64x0 PEF executable.";
-#elif defined(__x86_64__)
- return "x86_64 PEF executable.";
-#elif defined(__aarch64__)
- return "aarch64 PEF executable.";
-#elif defined(__powerpc64__)
- return "POWER64 PEF executable.";
-#else
- return "???? PEF executable.";
-#endif // __32x0__ || __64x0__ || __x86_64__ || __powerpc64__
- }
-
- const Char* PEFLoader::MIME()
- {
- return kPefApplicationMime;
- }
} // namespace Kernel
diff --git a/dev/ZKAKit/src/UserProcessScheduler.cc b/dev/ZKAKit/src/UserProcessScheduler.cc
index 249033a2..280a006b 100644
--- a/dev/ZKAKit/src/UserProcessScheduler.cc
+++ b/dev/ZKAKit/src/UserProcessScheduler.cc
@@ -12,10 +12,10 @@
/// @brief User process scheduler.
/***********************************************************************************/
-#include <ArchKit/ArchKit.h>
#include <KernelKit/UserProcessScheduler.h>
-#include <KernelKit/IPEFDLLObject.h>
#include <KernelKit/HardwareThreadScheduler.h>
+#include <KernelKit/IPEFDLLObject.h>
+#include <ArchKit/ArchKit.h>
#include <KernelKit/Heap.h>
#include <NewKit/KString.h>
#include <KernelKit/LPC.h>
@@ -38,8 +38,7 @@ namespace Kernel
/// @brief User Process scheduler global and external reference of thread scheduler.
/***********************************************************************************/
- UserProcessScheduler* kProcessScheduler = nullptr;
- EXTERN HardwareThreadScheduler* kHardwareThreadScheduler;
+ UserProcessScheduler kProcessScheduler;
UserProcess::UserProcess(VoidPtr start_image) : Image(start_image) {}
@@ -373,16 +372,7 @@ namespace Kernel
UserProcessScheduler& UserProcessScheduler::The()
{
- MUST_PASS(kProcessScheduler);
- return *kProcessScheduler;
- }
-
- ErrorOr<UserProcessScheduler> UserProcessScheduler::TheSafe()
- {
- if (!kProcessScheduler)
- return ErrorOr<UserProcessScheduler>(nullptr);
-
- return ErrorOr<UserProcessScheduler>(kProcessScheduler);
+ return kProcessScheduler;
}
/***********************************************************************************/
@@ -397,7 +387,7 @@ namespace Kernel
const Bool UserProcessScheduler::Remove(ProcessID process_id)
{
// check if process is within range.
- if (process_id > mTeam.AsArray().Count())
+ if (process_id > mTeam.mProcessAmount)
return No;
mTeam.AsArray()[process_id].Status = ProcessStatusKind::kDead;
@@ -458,7 +448,7 @@ namespace Kernel
this->GetCurrentProcess() = process;
// tell helper to find a core to schedule on.
- if (!UserProcessHelper::Switch(process.Image, &process.StackReserve[process.StackSize], process.StackFrame,
+ if (!UserProcessHelper::Switch(process.Image, &process.StackReserve[process.StackSize - 1], process.StackFrame,
process.ProcessId))
{
process.Crash();
@@ -497,7 +487,7 @@ namespace Kernel
PID& UserProcessHelper::TheCurrentPID()
{
kcout << "UserProcessHelper::TheCurrentPID: Leaking ProcessId...\r";
- return kProcessScheduler->GetCurrentProcess().Leak().ProcessId;
+ return kProcessScheduler.GetCurrentProcess().Leak().ProcessId;
}
/// @brief Check if process can be schedulded.
@@ -523,36 +513,12 @@ namespace Kernel
/***********************************************************************************/
/**
- * @brief Allocate a scheduler.
- */
- /***********************************************************************************/
-
- Bool UserProcessHelper::InitializeScheduler()
- {
- if (!kProcessScheduler)
- {
- kProcessScheduler = new UserProcessScheduler();
- }
-
- if (!kHardwareThreadScheduler)
- {
- kHardwareThreadScheduler = new HardwareThreadScheduler();
- }
-
- return Yes;
- }
-
- /***********************************************************************************/
- /**
* @brief Start scheduling current AP/Hart/Core.
*/
/***********************************************************************************/
SizeT UserProcessHelper::StartScheduling()
{
- if (!kProcessScheduler)
- return 0;
-
- return kProcessScheduler->Run();
+ return kProcessScheduler.Run();
}
/***********************************************************************************/