summaryrefslogtreecommitdiffhomepage
path: root/dev/ZKA
diff options
context:
space:
mode:
Diffstat (limited to 'dev/ZKA')
-rw-r--r--dev/ZKA/FSKit/NeFS.hxx91
-rw-r--r--dev/ZKA/FirmwareKit/Handover.hxx4
-rw-r--r--dev/ZKA/HALKit/AMD64/HalBMPMgr.cxx70
-rw-r--r--dev/ZKA/HALKit/AMD64/HalKernelMain.cxx2
-rw-r--r--dev/ZKA/HALKit/ARM64/HalKernelMain.cxx2
-rw-r--r--dev/ZKA/KernelKit/HardwareThreadScheduler.hxx2
-rw-r--r--dev/ZKA/KernelKit/IPEFDLLObject.hxx4
-rw-r--r--dev/ZKA/KernelKit/UserProcessScheduler.hxx4
-rw-r--r--dev/ZKA/NewKit/Ref.hxx2
-rw-r--r--dev/ZKA/Sources/CodeMgr.cxx8
-rw-r--r--dev/ZKA/Sources/ExeMain.cxx14
-rw-r--r--dev/ZKA/Sources/FS/NeFS.cxx4
-rw-r--r--dev/ZKA/Sources/HardwareThreadScheduler.cxx13
-rw-r--r--dev/ZKA/Sources/IPEFDLLObject.cxx10
-rw-r--r--dev/ZKA/Sources/ThreadLocalStorage.cxx36
-rw-r--r--dev/ZKA/Sources/UserProcessScheduler.cxx74
-rw-r--r--dev/ZKA/Sources/UserThreadScheduler.cxx49
17 files changed, 219 insertions, 170 deletions
diff --git a/dev/ZKA/FSKit/NeFS.hxx b/dev/ZKA/FSKit/NeFS.hxx
index 2bf17863..7bec2a4b 100644
--- a/dev/ZKA/FSKit/NeFS.hxx
+++ b/dev/ZKA/FSKit/NeFS.hxx
@@ -26,80 +26,83 @@ default.
@author Amlal EL Mahrouss
*/
-#define kNeFSInvalidFork (-1)
+#define kNeFSInvalidFork (-1)
#define kNeFSInvalidCatalog (-1)
-#define kNeFSNodeNameLen (256)
+#define kNeFSNodeNameLen (256)
-#define kNeFSSectorSz (512)
-#define kNeFSForkDataSz (kib_cast(8))
+#define kNeFSSectorSz (512)
+#define kNeFSForkDataSz (kib_cast(8))
#define kNeFSIdentLen (8)
-#define kNeFSIdent " NeFS"
-#define kNeFSPadLen (392)
+#define kNeFSIdent " NeFS"
+#define kNeFSPadLen (392)
#define kNeFSMetaFilePrefix '$'
#define kNeFSVersionInteger (0x0128)
-#define kNeFSVerionString "1.28"
+#define kNeFSVerionString "1.28"
/// @brief Standard fork types.
-#define kNeFSDataFork "main_data"
+#define kNeFSDataFork "main_data"
#define kNeFSResourceFork "main_rsrc"
+#define kNeFSForkSize (sizeof(NFS_FORK_STRUCT))
+
+#define kNeFSPartitionTypeStandard (7)
+#define kNeFSPartitionTypePage (8)
+#define kNeFSPartitionTypeBoot (9)
+
+
#define kNeFSCatalogKindFile (1)
-#define kNeFSCatalogKindDir (2)
+#define kNeFSCatalogKindDir (2)
#define kNeFSCatalogKindAlias (3)
-#define kNeFSForkSize (512)
-
-//! shared between network or
-//! other filesystems. Export forks as .zip when copying.
+//! Shared between network and/or partitions. Export forks as .zip when copying.
#define kNeFSCatalogKindShared (4)
-#define kNeFSCatalogKindResource (5)
+#define kNeFSCatalogKindResource (5)
#define kNeFSCatalogKindExecutable (6)
#define kNeFSCatalogKindPage (8)
-#define kNeFSPartitionTypeStandard (7)
-#define kNeFSPartitionTypePage (8)
-#define kNeFSPartitionTypeBoot (9)
-
#define kNeFSCatalogKindDevice (9)
-#define kNeFSCatalogKindLock (10)
+#define kNeFSCatalogKindLock (10)
-#define kNeFSCatalogKindRLE (11)
+#define kNeFSCatalogKindRLE (11)
#define kNeFSCatalogKindMetaFile (12)
-#define kNeFSCatalogKindTTF (13)
-#define kNeFSCatalogKindRIFF (14)
-#define kNeFSSeparator '\\'
+#define kNeFSCatalogKindTTF (13)
+#define kNeFSCatalogKindRIFF (14)
+
+#define kNeFSSeparator '\\'
#define kNeFSSeparatorAlt '/'
-#define kNeFSUpDir ".."
-#define kNeFSRoot "\\"
+#define kNeFSUpDir ".."
+#define kNeFSRoot "\\"
#define kNeFSRootAlt "/"
-#define kNeFSLF '\r'
+#define kNeFSLF '\r'
#define kNeFSEOF (-1)
#define kNeFSBitWidth (sizeof(Kernel::Char))
#define kNeFSLbaType (Kernel::Lba)
-/// Start After the PM headers, pad 1024 bytes.
+/// @note Start after the partition map header. (Virtual addressing)
#define kNeFSRootCatalogStartAddress (1024)
-#define kNeFSCatalogStartAddress ((2048) + sizeof(NFS_ROOT_PARTITION_BLOCK))
+#define kNeFSCatalogStartAddress ((2048) + sizeof(NFS_ROOT_PARTITION_BLOCK))
#define kResourceTypeDialog (10)
#define kResourceTypeString (11)
#define kResourceTypeMenu (12)
+#define kResourceTypeSound (13)
+#define kResourceTypeFont (14)
#define kConfigLen (64)
#define kPartLen (32)
-#define kNeFSFlagDeleted (70)
+#define kNeFSFlagDeleted (70)
#define kNeFSFlagUnallocated (0)
-#define kNeFSFlagCreated (71)
+#define kNeFSFlagCreated (71)
#define kNeFSMimeNameLen (200)
@@ -111,14 +114,14 @@ struct NFS_ROOT_PARTITION_BLOCK;
enum
{
- kNeFSHardDrive = 0xC0, // Hard Drive
- kNeFSSolidStateDrive = 0xC1, // Solid State Drive
- kNeFSOpticalDrive = 0x0C, // Blu-Ray/DVD
+ kNeFSHardDrive = 0xC0, // Hard Drive
+ kNeFSSolidStateDrive = 0xC1, // Solid State Drive
+ kNeFSOpticalDrive = 0x0C, // Blu-Ray/DVD
kNeFSMassStorageDevice = 0xCC, // USB
- kNeFSScsi = 0xC4, // SCSI Hard Drive
- kNeFSFlashDrive = 0xC6,
- kNeFSUnknown = 0xFF, // Unknown device.
- kNeFSDriveCount = 7,
+ kNeFSScsi = 0xC4, // SCSI Hard Drive
+ kNeFSFlashDrive = 0xC6,
+ kNeFSUnknown = 0xFF, // Unknown device.
+ kNeFSDriveCount = 7,
};
/// @brief Catalog type.
@@ -225,7 +228,7 @@ namespace Kernel
{
public:
explicit NeFSParser() = default;
- ~NeFSParser() = default;
+ ~NeFSParser() = default;
public:
ZKA_COPY_DEFAULT(NeFSParser);
@@ -236,15 +239,15 @@ namespace Kernel
/// @param theFork the fork itself.
/// @return the fork
_Output NFS_FORK_STRUCT* CreateFork(_Input NFS_CATALOG_STRUCT* catalog,
- _Input NFS_FORK_STRUCT& theFork);
+ _Input NFS_FORK_STRUCT& theFork);
/// @brief Find fork inside New filesystem.
/// @param catalog the catalog.
/// @param name the fork name.
/// @return the fork.
_Output NFS_FORK_STRUCT* FindFork(_Input NFS_CATALOG_STRUCT* catalog,
- _Input const Char* name,
- Boolean dataOrRsrc);
+ _Input const Char* name,
+ Boolean dataOrRsrc);
_Output Void RemoveFork(_Input NFS_FORK_STRUCT* fork);
@@ -254,7 +257,7 @@ namespace Kernel
_Output NFS_CATALOG_STRUCT* GetCatalog(_Input const Char* name);
- _Output NFS_CATALOG_STRUCT* CreateCatalog(_Input const Char* name,
+ _Output NFS_CATALOG_STRUCT* CreateCatalog(_Input const Char* name,
_Input const Int32& flags,
_Input const Int32& kind);
@@ -264,12 +267,12 @@ namespace Kernel
_Input Bool isRsrcFork,
_Input VoidPtr data,
_Input SizeT sizeOfData,
- _Input const Char* forkName);
+ _Input const Char* forkName);
VoidPtr ReadCatalog(_Input _Output NFS_CATALOG_STRUCT* catalog,
_Input Bool isRsrcFork,
_Input SizeT dataSz,
- _Input const Char* forkName);
+ _Input const Char* forkName);
bool Seek(_Input _Output NFS_CATALOG_STRUCT* catalog, SizeT off);
diff --git a/dev/ZKA/FirmwareKit/Handover.hxx b/dev/ZKA/FirmwareKit/Handover.hxx
index b4558560..8d25ec6d 100644
--- a/dev/ZKA/FirmwareKit/Handover.hxx
+++ b/dev/ZKA/FirmwareKit/Handover.hxx
@@ -24,7 +24,7 @@
#define kHandoverMagic 0xBADCC
#define kHandoverVersion 0x114
-#define kHandoverHeapSz gib_cast(3)
+#define kHandoverBitMapSz gib_cast(3)
#define kHandoverStructSz sizeof(HEL::HandoverInformationHeader)
namespace Kernel::HEL
@@ -57,7 +57,7 @@ namespace Kernel::HEL
UInt64 f_Version;
VoidPtr f_BitMapStart;
- SizeT f_VirtualSize;
+ SizeT f_BitMapSize;
VoidPtr f_PhysicalStart;
VoidPtr f_KernelImage;
diff --git a/dev/ZKA/HALKit/AMD64/HalBMPMgr.cxx b/dev/ZKA/HALKit/AMD64/HalBMPMgr.cxx
index 221cb044..800d8b3d 100644
--- a/dev/ZKA/HALKit/AMD64/HalBMPMgr.cxx
+++ b/dev/ZKA/HALKit/AMD64/HalBMPMgr.cxx
@@ -6,7 +6,7 @@
#include <ArchKit/ArchKit.hxx>
-#define cVMHMagic ((Kernel::UIntPtr)0x10210)
+#define cBitMpMagic ((Kernel::UIntPtr)0x10210)
#ifdef __ZKA_AMD64__
#include <HALKit/AMD64/HalPageAlloc.hxx>
@@ -29,21 +29,47 @@ namespace Kernel
/// @return The new address which was found.
VoidPtr FindBitMap(VoidPtr base_ptr, SizeT size, Bool rw, Bool user) noexcept
{
+ auto base = reinterpret_cast<UIntPtr>(base_ptr);
+
while (base_ptr && size)
{
UIntPtr* ptr_bit_set = reinterpret_cast<UIntPtr*>(base_ptr);
- if (ptr_bit_set[0] != cVMHMagic)
+ if (ptr_bit_set[0] == cBitMpMagic)
+ {
+ if (ptr_bit_set[1] != 0 &&
+ ptr_bit_set[1] <= size &&
+ ptr_bit_set[2] == No)
+ {
+ ptr_bit_set[1] = size;
+ ptr_bit_set[2] = Yes;
+
+ kcout << "BMPMgr: Allocated pointer!\r";
+ kcout << "Magic Number: " << hex_number(ptr_bit_set[0]) << endl;
+ kcout << "Size of pointer: " << hex_number(ptr_bit_set[1]) << endl;
+ kcout << "Address Of Header: " << hex_number((UIntPtr)ptr_bit_set) << endl;
+
+ if (rw)
+ mm_update_pte(base_ptr, eFlagsRw);
+
+ if (user)
+ mm_update_pte(base_ptr, eFlagsUser);
+
+ return (VoidPtr)ptr_bit_set;
+ }
+ }
+ else
{
- ptr_bit_set[0] = cVMHMagic;
+ UIntPtr* ptr_bit_set = reinterpret_cast<UIntPtr*>(base_ptr);
+
+ ptr_bit_set[0] = cBitMpMagic;
ptr_bit_set[1] = size;
- ptr_bit_set[2] = __BIGGEST_ALIGNMENT__;
+ ptr_bit_set[2] = Yes;
- kcout << "ALLOC STATUS\r";
- kcout << "MAG: " << hex_number(ptr_bit_set[0]) << endl;
- kcout << "ADDRESS: " << hex_number((UIntPtr)ptr_bit_set) << endl;
- kcout << "SIZE: " << hex_number(ptr_bit_set[1]) << endl;
- kcout << "ALLOC STATUS\r";
+ kcout << "BMPMgr: Allocated pointer!\r";
+ kcout << "Magic Number: " << hex_number(ptr_bit_set[0]) << endl;
+ kcout << "Size of pointer: " << hex_number(ptr_bit_set[1]) << endl;
+ kcout << "Address Of Header: " << hex_number((UIntPtr)ptr_bit_set) << endl;
if (rw)
mm_update_pte(base_ptr, eFlagsRw);
@@ -54,7 +80,10 @@ namespace Kernel
return (VoidPtr)ptr_bit_set;
}
- base_ptr = reinterpret_cast<VoidPtr>(reinterpret_cast<UIntPtr>(base_ptr) + __BIGGEST_ALIGNMENT__ + ptr_bit_set[1]);
+ base_ptr = reinterpret_cast<VoidPtr>(reinterpret_cast<UIntPtr>(base_ptr) + (ptr_bit_set[0] != cBitMpMagic ? size : ptr_bit_set[1]));
+
+ if (reinterpret_cast<UIntPtr>(base_ptr) >= (kHandoverHeader->f_BitMapSize + base))
+ break;
}
return nullptr;
@@ -73,6 +102,11 @@ namespace Kernel
ptr_new = traits.FindBitMap(kKernelVirtualStart, size, rw, user);
+ if (!ptr_new)
+ {
+ ke_stop(RUNTIME_CHECK_VIRTUAL_OUT_OF_MEM);
+ }
+
return ((UIntPtr*)ptr_new);
}
@@ -84,18 +118,16 @@ namespace Kernel
UIntPtr* ptr_bit_set = reinterpret_cast<UIntPtr*>(page_ptr);
if (!ptr_bit_set[0] ||
- ptr_bit_set[0] != cVMHMagic)
+ ptr_bit_set[0] != cBitMpMagic)
return false;
- kcout << "FREE STATUS\r";
- kcout << "MAG: " << hex_number(ptr_bit_set[0]) << endl;
- kcout << "ADDRESSS: " << hex_number((UIntPtr)ptr_bit_set) << endl;
- kcout << "SIZE: " << hex_number(ptr_bit_set[1]) << endl;
- kcout << "FREE STATUS\r";
+ kcout << "BMPMgr: Freed pointer!\r";
+ kcout << "Magic Number: " << hex_number(ptr_bit_set[0]) << endl;
+ kcout << "Size of pointer: " << hex_number(ptr_bit_set[1]) << endl;
+ kcout << "Address Of Header: " << hex_number((UIntPtr)ptr_bit_set) << endl;
- ptr_bit_set[0] = 0UL;
- ptr_bit_set[1] = 0UL;
- ptr_bit_set[2] = __BIGGEST_ALIGNMENT__;
+ ptr_bit_set[0] = cBitMpMagic;
+ ptr_bit_set[2] = No;
return true;
}
diff --git a/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx b/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx
index 79d9c097..c73eed5f 100644
--- a/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx
+++ b/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx
@@ -93,7 +93,7 @@ EXTERN_C void hal_init_platform(
Kernel::Void hal_real_init(Kernel::Void) noexcept
{
// get page size.
- kKernelVirtualSize = kHandoverHeader->f_VirtualSize;
+ kKernelVirtualSize = kHandoverHeader->f_BitMapSize;
// get virtual address start (for the heap)
kKernelVirtualStart = reinterpret_cast<Kernel::VoidPtr>(
diff --git a/dev/ZKA/HALKit/ARM64/HalKernelMain.cxx b/dev/ZKA/HALKit/ARM64/HalKernelMain.cxx
index 140c3370..d6bed3ba 100644
--- a/dev/ZKA/HALKit/ARM64/HalKernelMain.cxx
+++ b/dev/ZKA/HALKit/ARM64/HalKernelMain.cxx
@@ -77,7 +77,7 @@ Kernel::Void hal_real_init(Kernel::Void) noexcept
kAllocationInProgress = false;
// get page size.
- kKernelVirtualSize = kHandoverHeader->f_VirtualSize;
+ kKernelVirtualSize = kHandoverHeader->f_BitMapSize;
// get virtual address start (for the heap)
kKernelVirtualStart = reinterpret_cast<Kernel::VoidPtr>(
diff --git a/dev/ZKA/KernelKit/HardwareThreadScheduler.hxx b/dev/ZKA/KernelKit/HardwareThreadScheduler.hxx
index cf5d6754..f5b64883 100644
--- a/dev/ZKA/KernelKit/HardwareThreadScheduler.hxx
+++ b/dev/ZKA/KernelKit/HardwareThreadScheduler.hxx
@@ -90,6 +90,8 @@ namespace Kernel
private:
explicit HardwareThreadScheduler();
+ friend class UserProcessHelper;
+
public:
~HardwareThreadScheduler();
ZKA_COPY_DEFAULT(HardwareThreadScheduler);
diff --git a/dev/ZKA/KernelKit/IPEFDLLObject.hxx b/dev/ZKA/KernelKit/IPEFDLLObject.hxx
index 013173d1..91e0d1ff 100644
--- a/dev/ZKA/KernelKit/IPEFDLLObject.hxx
+++ b/dev/ZKA/KernelKit/IPEFDLLObject.hxx
@@ -98,8 +98,8 @@ namespace Kernel
typedef IPEFDLLObject* IDLL;
- EXTERN_C IDLL rtl_init_shared_object(UserProcess* header);
- EXTERN_C Void rtl_fini_shared_object(UserProcess* header, IDLL lib, Bool* successful);
+ EXTERN_C IDLL rtl_init_dll(UserProcess* header);
+ EXTERN_C Void rtl_fini_dll(UserProcess* header, IDLL lib, Bool* successful);
} // namespace Kernel
#endif /* ifndef __KERNELKIT_SHARED_OBJECT_HXX__ */
diff --git a/dev/ZKA/KernelKit/UserProcessScheduler.hxx b/dev/ZKA/KernelKit/UserProcessScheduler.hxx
index 9585da29..c35b65e1 100644
--- a/dev/ZKA/KernelKit/UserProcessScheduler.hxx
+++ b/dev/ZKA/KernelKit/UserProcessScheduler.hxx
@@ -295,10 +295,10 @@ namespace Kernel
{
public:
STATIC bool Switch(VoidPtr image_ptr, UInt8* stack_ptr, HAL::StackFramePtr frame_ptr, const PID& new_pid);
- STATIC bool CanBeScheduled(UserProcess& process);
+ STATIC bool CanBeScheduled(const UserProcess process);
STATIC PID& TheCurrentPID();
STATIC SizeT StartScheduling();
- STATIC Void Init();
+
};
const UInt32& sched_get_exit_code(void) noexcept;
diff --git a/dev/ZKA/NewKit/Ref.hxx b/dev/ZKA/NewKit/Ref.hxx
index 7f5167c2..5a2bf091 100644
--- a/dev/ZKA/NewKit/Ref.hxx
+++ b/dev/ZKA/NewKit/Ref.hxx
@@ -32,7 +32,7 @@ namespace Kernel
if (!fClass)
return *this;
- *fClass = ref;
+ fClass = &ref;
return *this;
}
diff --git a/dev/ZKA/Sources/CodeMgr.cxx b/dev/ZKA/Sources/CodeMgr.cxx
index 1d4f4a6e..49968e73 100644
--- a/dev/ZKA/Sources/CodeMgr.cxx
+++ b/dev/ZKA/Sources/CodeMgr.cxx
@@ -14,10 +14,10 @@ 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.
- bool sched_execute_thread(MainKind main, const Char* processName) noexcept
+ bool sched_execute_thread(MainKind main, const Char* process_name) noexcept
{
if (!main)
- return false;
+ return No;
UserProcess proc;
proc.SetImageStart(reinterpret_cast<VoidPtr>(main));
@@ -25,8 +25,8 @@ namespace Kernel
proc.Kind = UserProcess::kExeKind;
proc.StackSize = mib_cast(4);
- rt_copy_memory((VoidPtr)processName, proc.Name, rt_string_len(processName));
+ rt_copy_memory((VoidPtr)process_name, proc.Name, rt_string_len(process_name));
- return UserProcessScheduler::The().Add(proc) == kErrorSuccess;
+ return UserProcessScheduler::The().Add(proc) != 0;
}
} // namespace Kernel
diff --git a/dev/ZKA/Sources/ExeMain.cxx b/dev/ZKA/Sources/ExeMain.cxx
index 2aed9bf7..d8d1ea6e 100644
--- a/dev/ZKA/Sources/ExeMain.cxx
+++ b/dev/ZKA/Sources/ExeMain.cxx
@@ -65,11 +65,11 @@ namespace Kernel::Detail
CG::CGDrawStringToWnd(cKernelWnd, "Mounted NeFS IFS (A:)", 10, 10, RGB(0, 0, 0));
}
- const Kernel::SizeT cDirCount = 7UL;
+ const Kernel::SizeT cDirCount = 9UL;
const Kernel::Char* cDirStr[cDirCount] = {
"\\Boot\\", "\\System\\", "\\Support\\", "\\Applications\\",
- "\\Users\\", "\\Library\\", "\\Mount\\"};
+ "\\Users\\", "\\Library\\", "\\Mount\\", "\\Games\\", "\\Applications\\Java\\"};
if (fNeFS->GetParser())
{
@@ -117,11 +117,18 @@ EXTERN_C ATTRIBUTE(naked) Kernel::Void HangCPU(Kernel::Void)
}
}
+namespace Kernel
+{
+ EXTERN UserProcessScheduler* cProcessScheduler;
+}
+
/// @brief Application entrypoint.
/// @param Void
/// @return Void
EXTERN_C Kernel::Void ke_dll_entrypoint(Kernel::Void)
{
+ Kernel::cProcessScheduler = nullptr;
+
CG::CGDrawBackground();
cKernelWnd = nullptr;
@@ -148,8 +155,7 @@ EXTERN_C Kernel::Void ke_dll_entrypoint(Kernel::Void)
CG::CGDrawStringToWnd(cKernelWnd, "Starting ZKA System...", 20, 10, RGB(0, 0, 0));
- Kernel::UserProcessHelper::Init();
-
+ Kernel::UserProcessHelper::StartScheduling();
Kernel::sched_execute_thread(HangCPU, "HANG TEST");
while (Yes)
diff --git a/dev/ZKA/Sources/FS/NeFS.cxx b/dev/ZKA/Sources/FS/NeFS.cxx
index 68078ec3..409ca663 100644
--- a/dev/ZKA/Sources/FS/NeFS.cxx
+++ b/dev/ZKA/Sources/FS/NeFS.cxx
@@ -814,8 +814,8 @@ NeFSSearchThroughCatalogList:
NFS_CATALOG_STRUCT* catalogPtr = new NFS_CATALOG_STRUCT();
rt_copy_memory(catalog, catalogPtr, sizeof(NFS_CATALOG_STRUCT));
- kcout << "found catalog at: " << hex_number(startCatalogList) << endl;
- kcout << "found catalog at: " << catalog->Name << endl;
+ kcout << "Found catalog at: " << hex_number(startCatalogList) << endl;
+ kcout << "Found catalog at: " << catalog->Name << endl;
out_lba = startCatalogList;
return catalogPtr;
diff --git a/dev/ZKA/Sources/HardwareThreadScheduler.cxx b/dev/ZKA/Sources/HardwareThreadScheduler.cxx
index b130ef63..c5d04bbc 100644
--- a/dev/ZKA/Sources/HardwareThreadScheduler.cxx
+++ b/dev/ZKA/Sources/HardwareThreadScheduler.cxx
@@ -17,6 +17,8 @@
namespace Kernel
{
+ HardwareThreadScheduler* cHardwareThreadScheduler = nullptr;
+
///! A HardwareThread class takes care of it's owned hardware thread.
///! It has a stack for it's core.
@@ -107,7 +109,7 @@ namespace Kernel
{
mp_do_context_switch_pre();
mp_do_context_switch(image, stack_ptr, fStack);
-
+
return true;
}
}
@@ -124,7 +126,10 @@ namespace Kernel
///! @brief Constructor and destructors.
///! @brief Default constructor.
- HardwareThreadScheduler::HardwareThreadScheduler() = default;
+ HardwareThreadScheduler::HardwareThreadScheduler()
+ {
+ kcout << "Initializing class done!" << endl;
+ }
///! @brief Default destructor.
HardwareThreadScheduler::~HardwareThreadScheduler() = default;
@@ -132,8 +137,8 @@ namespace Kernel
/// @brief Shared singleton function
HardwareThreadScheduler& HardwareThreadScheduler::The()
{
- STATIC HardwareThreadScheduler sched;
- return sched;
+ MUST_PASS(cHardwareThreadScheduler);
+ return *cHardwareThreadScheduler;
}
/// @brief Get Stack Frame of Core
diff --git a/dev/ZKA/Sources/IPEFDLLObject.cxx b/dev/ZKA/Sources/IPEFDLLObject.cxx
index 913912a4..a8505eb3 100644
--- a/dev/ZKA/Sources/IPEFDLLObject.cxx
+++ b/dev/ZKA/Sources/IPEFDLLObject.cxx
@@ -18,11 +18,11 @@
Revision History:
- 01/02/24: Rework shared sharedObj ABI, except a rtl_init_shared_object and
- rtl_fini_shared_object (amlel) 15/02/24: Breaking changes, changed the name of the
+ 01/02/24: Rework shared sharedObj ABI, except a rtl_init_dll and
+ rtl_fini_dll (amlel) 15/02/24: Breaking changes, changed the name of the
routines. (amlel)
- 07/28/24: Replace rt_library_free with rtl_fini_shared_object
+ 07/28/24: Replace rt_library_free with rtl_fini_dll
------------------------------------------- */
@@ -37,7 +37,7 @@ using namespace Kernel;
/** @brief Library initializer. */
/***********************************************************************************/
-EXTERN_C IDLL rtl_init_shared_object(UserProcess* header)
+EXTERN_C IDLL rtl_init_dll(UserProcess* header)
{
IDLL sharedObj = tls_new_class<IPEFDLLObject>();
@@ -80,7 +80,7 @@ EXTERN_C IDLL rtl_init_shared_object(UserProcess* header)
/** @param successful Reports if successful or not. */
/***********************************************************************************/
-EXTERN_C Void rtl_fini_shared_object(UserProcess* header, IDLL lib, Bool* successful)
+EXTERN_C Void rtl_fini_dll(UserProcess* header, IDLL lib, Bool* successful)
{
MUST_PASS(successful);
diff --git a/dev/ZKA/Sources/ThreadLocalStorage.cxx b/dev/ZKA/Sources/ThreadLocalStorage.cxx
index 35f2dbcd..825761de 100644
--- a/dev/ZKA/Sources/ThreadLocalStorage.cxx
+++ b/dev/ZKA/Sources/ThreadLocalStorage.cxx
@@ -21,42 +21,6 @@
using namespace Kernel;
-namespace Kernel::Detail
-{
- /// \brief UserProcess thread information header.
- struct THREAD_HEADER_BLOCK final
- {
- STATIC constexpr SizeT cMaxLen = 256;
-
- Char fName[cMaxLen] = {"THREAD #0 (PROCESS 0)"};
- ProcessStatusKind fThreadStatus;
- Int64 fThreadID;
- UIntPtr fCode{0};
- UIntPtr fStack{0};
- UIntPtr fData{0};
-
- Void Exit() noexcept
- {
- this->fThreadStatus = ProcessStatusKind::kKilled;
- }
-
- UIntPtr GetStack() noexcept
- {
- return fStack;
- }
-
- UIntPtr GetData() noexcept
- {
- return fData;
- }
-
- UIntPtr GetPC() noexcept
- {
- return fCode;
- }
- };
-} // namespace Detail
-
/**
* @brief Checks for cookie inside the TIB.
* @param tib the TIB to check.
diff --git a/dev/ZKA/Sources/UserProcessScheduler.cxx b/dev/ZKA/Sources/UserProcessScheduler.cxx
index 8c46b1cf..f480bccc 100644
--- a/dev/ZKA/Sources/UserProcessScheduler.cxx
+++ b/dev/ZKA/Sources/UserProcessScheduler.cxx
@@ -12,6 +12,7 @@
/// @brief User Process scheduler.
/***********************************************************************************/
+#include "HALKit/AMD64/Processor.hxx"
#include <KernelKit/UserProcessScheduler.hxx>
#include <KernelKit/IPEFDLLObject.hxx>
#include <KernelKit/HardwareThreadScheduler.hxx>
@@ -213,7 +214,7 @@ namespace Kernel
if (this->Kind == kDLLKind)
{
Bool success = false;
- rtl_fini_shared_object(this, this->DLLPtr, &success);
+ rtl_fini_dll(this, this->DLLPtr, &success);
if (success)
{
@@ -237,7 +238,7 @@ namespace Kernel
process.MemoryPD = reinterpret_cast<UIntPtr>(hal_read_cr3());
#endif // __ZKA_AMD64__
- process.StackFrame = (HAL::StackFrame*)process.New(sizeof(HAL::StackFrame));
+ process.StackFrame = new HAL::StackFrame(0);
if (!process.StackFrame)
{
@@ -248,28 +249,26 @@ namespace Kernel
// Create heap according to type of process.
if (process.Kind == UserProcess::kDLLKind)
{
- process.DLLPtr = rtl_init_shared_object(&process);
+ process.DLLPtr = rtl_init_dll(&process);
}
- if (process.Image)
+ if (!process.Image)
{
- // get preferred stack size by app.
- const auto cMaxStackSize = process.StackSize;
- process.StackReserve = (UInt8*)process.New(sizeof(UInt8) * cMaxStackSize);
-
- if (process.StackReserve)
+ if (process.Kind != UserProcess::kDLLKind)
{
process.Crash();
return -kErrorProcessFault;
}
}
- else
+
+ // get preferred stack size by app.
+ const auto cMaxStackSize = process.StackSize;
+ process.StackReserve = new UInt8[cMaxStackSize];
+
+ if (!process.StackReserve)
{
- if (process.Kind != UserProcess::kDLLKind)
- {
- process.Crash();
- return -kErrorProcessFault;
- }
+ process.Crash();
+ return -kErrorProcessFault;
}
process.Status = ProcessStatusKind::kStarting;
@@ -277,9 +276,6 @@ namespace Kernel
++mTeam.mProcessAmount;
- while (1)
- ;
-
mTeam.AsArray()[process.ProcessId] = process;
return process.ProcessId;
@@ -318,6 +314,8 @@ namespace Kernel
SizeT process_index = 0; //! we store this guy to tell the scheduler how many
//! things we have scheduled.
+ kcout << "Finding available process...\r";
+
for (; process_index < mTeam.AsArray().Capacity(); ++process_index)
{
auto& process = mTeam.AsArray()[process_index];
@@ -326,7 +324,7 @@ namespace Kernel
if (UserProcessHelper::CanBeScheduled(process))
{
// set the current process.
- mTeam.AsRef() = mTeam.AsArray()[process.ProcessId];
+ mTeam.AsRef() = process;
process.PTime = static_cast<Int32>(process.Affinity);
@@ -339,10 +337,6 @@ namespace Kernel
process.Crash();
continue;
}
-
- process.Exit();
-
- continue;
}
else
{
@@ -378,35 +372,16 @@ namespace Kernel
return cProcessScheduler->CurrentProcess().Leak().ProcessId;
}
- Void UserProcessHelper::Init()
- {
- if (mm_is_valid_heap(cProcessScheduler))
- delete cProcessScheduler;
-
- cProcessScheduler = nullptr;
- cProcessScheduler = new UserProcessScheduler();
- MUST_PASS(cProcessScheduler);
- }
-
/// @brief Check if process can be schedulded.
/// @param process the process reference.
/// @retval true can be schedulded.
/// @retval false cannot be schedulded.
- bool UserProcessHelper::CanBeScheduled(UserProcess& process)
+ bool UserProcessHelper::CanBeScheduled(const UserProcess process)
{
if (process.Status == ProcessStatusKind::kFrozen ||
process.Status == ProcessStatusKind::kDead)
return false;
- if (process.Kind == UserProcess::kDLLKind)
- {
- if (auto start = process.DLLPtr->Load<VoidPtr>(kPefStart, rt_string_len(kPefStart), kPefCode);
- start)
- {
- process.Image = start;
- }
- }
-
return process.PTime < 1;
}
@@ -414,8 +389,21 @@ namespace Kernel
* @brief Scheduler helper class.
*/
+ EXTERN
+ HardwareThreadScheduler* cHardwareThreadScheduler;
+
SizeT UserProcessHelper::StartScheduling()
{
+ if (!cHardwareThreadScheduler)
+ {
+ cHardwareThreadScheduler = new HardwareThreadScheduler();
+ }
+
+ if (!cProcessScheduler)
+ {
+ cProcessScheduler = new UserProcessScheduler();
+ }
+
SizeT ret = cProcessScheduler->Run();
return ret;
}
diff --git a/dev/ZKA/Sources/UserThreadScheduler.cxx b/dev/ZKA/Sources/UserThreadScheduler.cxx
new file mode 100644
index 00000000..739f00ad
--- /dev/null
+++ b/dev/ZKA/Sources/UserThreadScheduler.cxx
@@ -0,0 +1,49 @@
+/*
+ * ========================================================
+ *
+ * newoskrnl
+ * Copyright ZKA Technologies., all rights reserved.
+ *
+ * ========================================================
+ */
+
+#include <NewKit/String.hxx>
+#include <CFKit/Property.hxx>
+#include <KernelKit/UserProcessScheduler.hxx>
+
+namespace Kernel
+{
+ /// \brief UserProcess thread information header.
+ struct USER_THREAD_BLOCK final
+ {
+ STATIC constexpr SizeT cMaxLen = 256;
+
+ Char fName[cMaxLen] = {"THREAD #0 (PROCESS 0)"};
+ ProcessStatusKind fThreadStatus;
+ Int64 fThreadID;
+ Int64* fProcessID{nullptr};
+ VoidPtr fCode{nullptr};
+ VoidPtr fStack{nullptr};
+ VoidPtr fData{nullptr};
+
+ Void Exit() noexcept
+ {
+ this->fThreadStatus = ProcessStatusKind::kKilled;
+ }
+
+ VoidPtr GetStack() noexcept
+ {
+ return fStack;
+ }
+
+ VoidPtr GetData() noexcept
+ {
+ return fData;
+ }
+
+ VoidPtr GetPC() noexcept
+ {
+ return fCode;
+ }
+ };
+} // namespace Detail