summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--dev/kernel/ArchKit/ArchKit.h10
-rw-r--r--dev/kernel/FSKit/HeFS.h10
-rw-r--r--dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc16
-rw-r--r--dev/kernel/HALKit/AMD64/HalKernelMain.cc17
-rw-r--r--dev/kernel/KernelKit/UserProcessScheduler.h9
-rw-r--r--dev/kernel/src/FS/HeFS.cc4
-rw-r--r--dev/kernel/src/UserProcessScheduler.cc27
7 files changed, 69 insertions, 24 deletions
diff --git a/dev/kernel/ArchKit/ArchKit.h b/dev/kernel/ArchKit/ArchKit.h
index c55f3872..bb483d28 100644
--- a/dev/kernel/ArchKit/ArchKit.h
+++ b/dev/kernel/ArchKit/ArchKit.h
@@ -26,7 +26,7 @@
#error !!! unknown architecture !!!
#endif
-#define kKernelMaxSystemCalls (512U)
+#define kMaxDispatchCallCount (512U)
namespace Kernel
{
@@ -88,11 +88,11 @@ struct HalSyscallEntry final
};
inline Kernel::Array<HalSyscallEntry,
- kKernelMaxSystemCalls>
- kSyscalls;
+ kMaxDispatchCallCount>
+ kSysCalls;
inline Kernel::Array<HalSyscallEntry,
- kKernelMaxSystemCalls>
- kKerncalls;
+ kMaxDispatchCallCount>
+ kKernCalls;
EXTERN_C Kernel::HAL::StackFramePtr mp_get_current_context(Kernel::Int64 pid);
diff --git a/dev/kernel/FSKit/HeFS.h b/dev/kernel/FSKit/HeFS.h
index 65594b99..60f1342a 100644
--- a/dev/kernel/FSKit/HeFS.h
+++ b/dev/kernel/FSKit/HeFS.h
@@ -17,7 +17,7 @@
/// @file HeFS.h
/// @brief HeFS filesystem support.
-#define kHeFSVersion (0x0100)
+#define kHeFSVersion (0x0101)
#define kHeFSMagic " HeFS"
#define kHeFSMagicLen (8)
@@ -102,6 +102,10 @@ struct PACKED HEFS_BOOT_NODE final
Kernel::UInt16 fDiskStatus; /// @brief Status of the disk. (locked, unlocked, error, invalid).
Kernel::UInt16 fDiskFlags; /// @brief Flags of the disk. (read-only, read-write, etc).
Kernel::UInt16 fVID; /// @brief Virtual Identification Number within an EPM disk. (0xFFFF if not used).
+ Kernel::UInt64 fReserved; /// @brief Reserved for future use.
+ Kernel::UInt64 fReserved2; /// @brief Reserved for future use.
+ Kernel::UInt64 fReserved3; /// @brief Reserved for future use.
+ Kernel::UInt64 fReserved4; /// @brief Reserved for future use.
};
/// @brief Access time type.
@@ -160,6 +164,10 @@ struct PACKED ALIGN(8) HEFS_INDEX_NODE_DIRECTORY final
Kernel::UInt32 fUID, fGID; /// @brief User ID and Group ID of the file.
Kernel::UInt32 fMode; /// @brief File mode. (read, write, execute, etc).
+ /// @note These slices are organized as:
+ /// [0] = OFFSET
+ /// [1] = SIZE
+ /// @note Thus the += 2 when iterating over them.
Kernel::UInt64 fIndexNodeStart[kHeFSBlockCount]; /// @brief Start of the index node.
Kernel::UInt64 fIndexNodeEnd[kHeFSBlockCount]; /// @brief End of the index node.
diff --git a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc
index 7209fd06..46775a7f 100644
--- a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc
+++ b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc
@@ -190,15 +190,15 @@ EXTERN_C void idt_handle_ud(Kernel::UIntPtr rsp)
/// @return nothing.
EXTERN_C Kernel::Void hal_system_call_enter(Kernel::UIntPtr rcx_syscall_index, Kernel::UIntPtr rdx_syscall_struct)
{
- if (rcx_syscall_index < kSyscalls.Count())
+ if (rcx_syscall_index < kSysCalls.Count())
{
Kernel::kout << "syscall: Enter Syscall.\r";
- if (kSyscalls[rcx_syscall_index].fHooked)
+ if (kSysCalls[rcx_syscall_index].fHooked)
{
- if (kSyscalls[rcx_syscall_index].fProc)
+ if (kSysCalls[rcx_syscall_index].fProc)
{
- (kSyscalls[rcx_syscall_index].fProc)((Kernel::VoidPtr)rdx_syscall_struct);
+ (kSysCalls[rcx_syscall_index].fProc)((Kernel::VoidPtr)rdx_syscall_struct);
}
else
{
@@ -219,15 +219,15 @@ EXTERN_C Kernel::Void hal_system_call_enter(Kernel::UIntPtr rcx_syscall_index, K
/// @return nothing.
EXTERN_C Kernel::Void hal_kernel_call_enter(Kernel::UIntPtr rcx_kerncall_index, Kernel::UIntPtr rdx_kerncall_struct)
{
- if (rcx_kerncall_index < kKerncalls.Count())
+ if (rcx_kerncall_index < kKernCalls.Count())
{
Kernel::kout << "kerncall: Enter Kernel Call List.\r";
- if (kKerncalls[rcx_kerncall_index].fHooked)
+ if (kKernCalls[rcx_kerncall_index].fHooked)
{
- if (kKerncalls[rcx_kerncall_index].fProc)
+ if (kKernCalls[rcx_kerncall_index].fProc)
{
- (kKerncalls[rcx_kerncall_index].fProc)((Kernel::VoidPtr)rdx_kerncall_struct);
+ (kKernCalls[rcx_kerncall_index].fProc)((Kernel::VoidPtr)rdx_kerncall_struct);
}
else
{
diff --git a/dev/kernel/HALKit/AMD64/HalKernelMain.cc b/dev/kernel/HALKit/AMD64/HalKernelMain.cc
index ce8c1245..60d05e11 100644
--- a/dev/kernel/HALKit/AMD64/HalKernelMain.cc
+++ b/dev/kernel/HALKit/AMD64/HalKernelMain.cc
@@ -98,8 +98,23 @@ EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept
idt_loader.Load(idt_reg);
+ auto constexpr kSchedTeamSwitchMS = 200U; /// @brief Team switch time in milliseconds.
+
+ Kernel::HardwareTimer timer(rtl_ms(kSchedTeamSwitchMS));
+
+ SizeT i = 0U;
+
while (YES)
{
- ;
+ timer.Wait();
+
+ UserProcessScheduler::The().SwitchTeam(kTeams[i]);
+
+ ++i;
+
+ if (i > kSchedTeamCount)
+ {
+ i = 0U;
+ }
}
}
diff --git a/dev/kernel/KernelKit/UserProcessScheduler.h b/dev/kernel/KernelKit/UserProcessScheduler.h
index 881f3957..d8c1dff8 100644
--- a/dev/kernel/KernelKit/UserProcessScheduler.h
+++ b/dev/kernel/KernelKit/UserProcessScheduler.h
@@ -19,6 +19,7 @@
#define kSchedMinMicroTime (AffinityKind::kStandard)
#define kSchedInvalidPID (-1)
#define kSchedProcessLimitPerTeam (32U)
+#define kSchedTeamCount (512)
#define kSchedMaxMemoryLimit gib_cast(128) /* max physical memory limit */
#define kSchedMaxStackSz mib_cast(8) /* maximum stack size */
@@ -328,13 +329,15 @@ namespace Kernel
explicit UserProcessScheduler() = default;
~UserProcessScheduler() override = default;
- NE_COPY_DEFAULT(UserProcessScheduler)
+ NE_COPY_DELETE(UserProcessScheduler)
+ NE_MOVE_DELETE(UserProcessScheduler)
operator bool();
bool operator!();
public:
ProcessTeam& CurrentTeam();
+ BOOL SwitchTeam(ProcessTeam& team);
public:
ProcessID Spawn(const Char* name, VoidPtr code, VoidPtr image);
@@ -371,6 +374,10 @@ namespace Kernel
};
const UInt32& sched_get_exit_code(void) noexcept;
+
+ inline Kernel::Array<ProcessTeam,
+ kSchedTeamCount>
+ kTeams;
} // namespace Kernel
#include <KernelKit/ThreadLocalStorage.h>
diff --git a/dev/kernel/src/FS/HeFS.cc b/dev/kernel/src/FS/HeFS.cc
index ccd808ad..b48512c8 100644
--- a/dev/kernel/src/FS/HeFS.cc
+++ b/dev/kernel/src/FS/HeFS.cc
@@ -253,7 +253,7 @@ namespace Kernel
{
if (KStringBuilder::Equals(dir_name, dir->fName))
{
- for (SizeT inode_index = 0UL; inode_index < kHeFSBlockCount; ++inode_index)
+ for (SizeT inode_index = 0UL; inode_index < kHeFSBlockCount; inode_index += 2)
{
if (dir->fIndexNodeStart[inode_index] != 0 ||
dir->fIndexNodeEnd[inode_index] != 0)
@@ -345,7 +345,7 @@ namespace Kernel
if (KStringBuilder::Equals(dir->fName, parent_dir_name))
{
- for (SizeT inode_index = 0UL; inode_index < kHeFSBlockCount; ++inode_index)
+ for (SizeT inode_index = 0UL; inode_index < kHeFSBlockCount; inode_index += 2)
{
if (dir->fIndexNodeStart[inode_index] != 0 ||
dir->fIndexNodeEnd[inode_index] != 0)
diff --git a/dev/kernel/src/UserProcessScheduler.cc b/dev/kernel/src/UserProcessScheduler.cc
index 77831082..d8d34010 100644
--- a/dev/kernel/src/UserProcessScheduler.cc
+++ b/dev/kernel/src/UserProcessScheduler.cc
@@ -35,7 +35,7 @@ namespace Kernel
/// @brief External reference of the thread scheduler.
/***********************************************************************************/
- STATIC UserProcessScheduler kProcessScheduler;
+ STATIC UserProcessScheduler kScheduler;
Process::Process() = default;
Process::~Process() = default;
@@ -406,7 +406,7 @@ namespace Kernel
UserProcessScheduler& UserProcessScheduler::The()
{
- return kProcessScheduler;
+ return kScheduler;
}
/***********************************************************************************/
@@ -512,7 +512,22 @@ namespace Kernel
return mTeam;
}
- /// @internal
+ /***********************************************************************************/
+ /// @brief Switches the current team.
+ /// @param team the new team to switch to.
+ /// @retval true team was switched.
+ /// @retval false team was not switched.
+ /***********************************************************************************/
+
+ BOOL UserProcessScheduler::SwitchTeam(ProcessTeam& team)
+ {
+ if (team.AsArray().Count() < 1)
+ return No;
+
+ kScheduler.mTeam = team;
+
+ return Yes;
+ }
/// @brief Gets current running process.
/// @return
@@ -525,11 +540,11 @@ namespace Kernel
/// @return Process ID integer.
ErrorOr<PID> UserProcessHelper::TheCurrentPID()
{
- if (!kProcessScheduler.CurrentProcess())
+ if (!kScheduler.CurrentProcess())
return ErrorOr<PID>{-kErrorProcessFault};
kout << "UserProcessHelper::TheCurrentPID: Leaking ProcessId...\r";
- return ErrorOr<PID>{kProcessScheduler.CurrentProcess().Leak().ProcessId};
+ return ErrorOr<PID>{kScheduler.CurrentProcess().Leak().ProcessId};
}
/// @brief Check if process can be schedulded.
@@ -568,7 +583,7 @@ namespace Kernel
SizeT UserProcessHelper::StartScheduling()
{
- return kProcessScheduler.Run();
+ return kScheduler.Run();
}
/***********************************************************************************/