summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAmlal <amlal@el-mahrouss-logic.com>2024-09-06 09:38:00 +0200
committerAmlal <amlal@el-mahrouss-logic.com>2024-09-06 09:38:00 +0200
commit507b3a76de36e41bdfd1c14d94a397990b26a423 (patch)
treee087051b51d36828fbca98d9e9e74cb1381a4def
parent98f504c442b1a0f769e2f20e4fb251813dd5dd67 (diff)
[ IMP ] A first set of software patches regarding the OS kernel and it's components.
Signed-off-by: Amlal <amlal@el-mahrouss-logic.com>
-rw-r--r--dev/DLL/RunSCM/build.json2
-rw-r--r--dev/HPFS/Defines.hxx15
-rw-r--r--dev/HPFS/Sources/IFSMain.cxx14
-rw-r--r--dev/HPFS/Sources/IFSMain.rs12
-rw-r--r--dev/HPFS/Sources/compile_flags.txt1
-rw-r--r--dev/HPFS/hpfs.json30
-rw-r--r--dev/SCI/makefile2
-rw-r--r--dev/SCI/sci_base.hxx30
-rw-r--r--dev/SCI/scm-design.drawio2
-rw-r--r--dev/SCI/xpcom_core.hxx6
-rw-r--r--dev/SCI/xpcom_sms.idl2
-rw-r--r--dev/ZBA/Sources/HEL/AMD64/BootMain.cxx13
-rw-r--r--dev/ZBA/amd64-efi.make2
-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
30 files changed, 300 insertions, 220 deletions
diff --git a/dev/DLL/RunSCM/build.json b/dev/DLL/RunSCM/build.json
index 14aae6af..e1294f74 100644
--- a/dev/DLL/RunSCM/build.json
+++ b/dev/DLL/RunSCM/build.json
@@ -3,7 +3,7 @@
"compiler_std": "c++20",
"headers_path": ["../", "./", "../../"],
"sources_path": ["Sources/*.cxx"],
- "output_name": "runscm.exe",
+ "output_name": "runxpcom.exe",
"compiler_flags": [
"-ffreestanding",
"-fno-rtti",
diff --git a/dev/HPFS/Defines.hxx b/dev/HPFS/Defines.hxx
new file mode 100644
index 00000000..8d0536a0
--- /dev/null
+++ b/dev/HPFS/Defines.hxx
@@ -0,0 +1,15 @@
+/* -------------------------------------------
+
+ Copyright ZKA Technologies.
+
+ FILE: Defines.hxx
+ PURPOSE: HPFS IFS defines.
+
+------------------------------------------- */
+
+#pragma once
+
+typedef __INT32_TYPE__ HPFS_INT32;
+typedef void HPFS_VOID;
+
+#define cHPFSVersion 0x0100
diff --git a/dev/HPFS/Sources/IFSMain.cxx b/dev/HPFS/Sources/IFSMain.cxx
new file mode 100644
index 00000000..229efb15
--- /dev/null
+++ b/dev/HPFS/Sources/IFSMain.cxx
@@ -0,0 +1,14 @@
+/* -------------------------------------------
+
+ Copyright ZKA Technologies.
+
+ FILE: IFSMain.cxx
+ PURPOSE: HPFS IFS entrypoint.
+
+------------------------------------------- */
+
+#include <HPFS/Defines.hxx>
+
+HPFS_INT32 IFSStart(HPFS_VOID) {
+ return 0;
+}
diff --git a/dev/HPFS/Sources/IFSMain.rs b/dev/HPFS/Sources/IFSMain.rs
deleted file mode 100644
index 5a49585a..00000000
--- a/dev/HPFS/Sources/IFSMain.rs
+++ /dev/null
@@ -1,12 +0,0 @@
-/* -------------------------------------------
-
- Copyright ZKA Technologies.
-
- FILE: IFSMain.rs
- PURPOSE: HPFS IFS.
-
-------------------------------------------- */
-
-fn IFSStart() {
-
-} \ No newline at end of file
diff --git a/dev/HPFS/Sources/compile_flags.txt b/dev/HPFS/Sources/compile_flags.txt
new file mode 100644
index 00000000..7c66a118
--- /dev/null
+++ b/dev/HPFS/Sources/compile_flags.txt
@@ -0,0 +1 @@
+-I../../
diff --git a/dev/HPFS/hpfs.json b/dev/HPFS/hpfs.json
index 3a13297b..a7ba778e 100644
--- a/dev/HPFS/hpfs.json
+++ b/dev/HPFS/hpfs.json
@@ -1,11 +1,21 @@
{
- "compiler_path": "rustc",
- "compiler_std": "",
- "sources_path": ["Sources/*.rs"],
- "output_name": "hpfs.sys",
- "compiler_flags": [
- ],
- "cpp_macros": [
- ]
- }
- \ No newline at end of file
+ "compiler_path": "x86_64-w64-mingw32-g++",
+ "compiler_std": "c++20",
+ "headers_path": ["../"],
+ "sources_path": ["Sources/*.cxx"],
+ "output_name": "hpfs.sys",
+ "compiler_flags": [
+ "-fPIC",
+ "-ffreestanding",
+ "-shared",
+ "-fno-rtti",
+ "-fno-exceptions",
+ "-Wl,--subsystem=17"
+ ],
+ "cpp_macros": [
+ "__HPFS_IMPL__",
+ "cHPFSVersion=0x0100",
+ "cHPFSVersionHighest=0x0100",
+ "cHPFSVersionLowest=0x0100"
+ ]
+}
diff --git a/dev/SCI/makefile b/dev/SCI/makefile
index 4193cd70..05593216 100644
--- a/dev/SCI/makefile
+++ b/dev/SCI/makefile
@@ -1,6 +1,6 @@
######################
# (C) ZKA
-# SCM/SCI kit makefile.
+# XPCOM/SCI kit makefile.
######################
CC=g++
diff --git a/dev/SCI/sci_base.hxx b/dev/SCI/sci_base.hxx
index 0cff8f0d..7f7565de 100644
--- a/dev/SCI/sci_base.hxx
+++ b/dev/SCI/sci_base.hxx
@@ -43,7 +43,7 @@ class IUnknown; // Refrenced from an IDB entry.
class UnknownUCLSID; // From the IDB, the constructor of the object, e.g: WordUCLSID.
class UUID;
-/// @brief Allocate new SCM class.
+/// @brief Allocate new XPCOM class.
/// @tparam TCLS
/// @tparam UCLSID
/// @param uclsidOfCls
@@ -54,7 +54,7 @@ TCLS* XPCOMQueryInterface(UCLSID uclsidOfCls, Args... args);
template <typename TCLS>
SInt32 XPCOMReleaseClass(TCLS** cls);
-/// @brief Release SCM class.
+/// @brief Release XPCOM class.
/// @tparam TCLS
/// @param cls
/// @return
@@ -157,13 +157,13 @@ IMPORT_C UInt64 IoSeekFile(_Input ZKAObject file_desc, UInt64 file_offset);
/// @brief Installs the Thread Information Block and Global Information Block inside the current process.
/// @param void.
/// @return > 0 error ocurred or already present, = 0 success.
-IMPORT_C UInt32 TlsInstallIB(UInt0);
+IMPORT_C UInt32 TlsInstall(UInt0);
// ------------------------------------------------------------------------
-// SCM API.
+// XPCOM API.
// ------------------------------------------------------------------------
-/// @brief Allocate new SCM object.
+/// @brief Allocate new XPCOM object.
/// @tparam TCLS the class type.
/// @tparam UCLSID UCLS factory class type.
/// @param uclsidOfCls UCLS factory class
@@ -171,20 +171,20 @@ IMPORT_C UInt32 TlsInstallIB(UInt0);
template <typename TCLS, typename UCLSID, typename... Args>
TCLS* XPCOMQueryInterface(_Input UCLSID* uclsidOfCls, _Input Args&&... args);
-/// @brief Release SCM object.
+/// @brief Release XPCOM object.
/// @tparam TCLS the class type.
/// @param cls the class to release.
/// @return status code.
template <typename TCLS>
SInt32 XPCOMReleaseClass(_Input TCLS* cls);
-/// @brief Creates an SCM instance in the process.
-/// @param handle_instance the SCM handle.
-/// @param flags the SCM flags.
+/// @brief Creates an XPCOM instance in the process.
+/// @param handle_instance the XPCOM handle.
+/// @param flags the XPCOM flags.
IMPORT_C SInt32 XPCOMCreateInstance(_Input UInt32 flags, _Output ZKAObject* handle_instance);
-/// @brief Destroys an SCM instance of the process.
-/// @param handle_instance the SCM handle.
+/// @brief Destroys an XPCOM instance of the process.
+/// @param handle_instance the XPCOM handle.
IMPORT_C UInt0 XPCOMDestroyInstance(_Input ZKAObject handle_instance);
// ------------------------------------------------------------------------
@@ -218,12 +218,16 @@ IMPORT_C SInt32 ErrGetLastError(UInt0);
// Threading API.
// ------------------------------------------------------------------------
-IMPORT_C UInt0 ThrExitCurrentThread(SInt32 exit_code);
-IMPORT_C UInt0 ThrExitMainThread(SInt32 exit_code);
+IMPORT_C UInt0 ThrExitCurrentThread(_Input SInt32 exit_code);
+IMPORT_C UInt0 ThrExitMainThread(_Input SInt32 exit_code);
IMPORT_C UInt0 ThrExitYieldThread(UInt0);
IMPORT_C UInt0 ThrExitJoinThread(UInt0);
IMPORT_C UInt0 ThrExitDetachThread(UInt0);
+// ------------------------------------------------------------------------
+// Disk Management API.
+// ------------------------------------------------------------------------
+
#endif // ifndef __SCI_BASE_HXX__
diff --git a/dev/SCI/scm-design.drawio b/dev/SCI/scm-design.drawio
index be77883c..22bcace6 100644
--- a/dev/SCI/scm-design.drawio
+++ b/dev/SCI/scm-design.drawio
@@ -19,7 +19,7 @@
<mxCell id="eRehIIeIVOPW1y23kRkx-8" value="Program #2&lt;div&gt;Is a web browser, it uses an HTML parser component.&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="253" y="570" width="120" height="60" as="geometry"/>
</mxCell>
- <mxCell id="eRehIIeIVOPW1y23kRkx-10" value="&lt;h1 style=&quot;margin-top: 0px;&quot;&gt;System Component/Call Model/Interface&lt;/h1&gt;&lt;p&gt;SCM is a standardized way of sharing code within DLLs in NewOS.&lt;/p&gt;&lt;p&gt;All classes are based upon&amp;nbsp;&lt;span style=&quot;color: rgb(78, 201, 176); background-color: rgb(31, 31, 31); font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px;&quot;&gt;IUnknown&lt;/span&gt;&lt;/p&gt;&lt;p&gt;It is also used to register and call code using&amp;nbsp;&lt;span style=&quot;color: rgb(78, 201, 176); background-color: rgb(31, 31, 31); font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px;&quot;&gt;IEventListener&lt;/span&gt;&lt;/p&gt;" style="text;html=1;whiteSpace=wrap;overflow=hidden;rounded=0;" parent="1" vertex="1">
+ <mxCell id="eRehIIeIVOPW1y23kRkx-10" value="&lt;h1 style=&quot;margin-top: 0px;&quot;&gt;System Component/Call Model/Interface&lt;/h1&gt;&lt;p&gt;XPCOM is a standardized way of sharing code within DLLs in NewOS.&lt;/p&gt;&lt;p&gt;All classes are based upon&amp;nbsp;&lt;span style=&quot;color: rgb(78, 201, 176); background-color: rgb(31, 31, 31); font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px;&quot;&gt;IUnknown&lt;/span&gt;&lt;/p&gt;&lt;p&gt;It is also used to register and call code using&amp;nbsp;&lt;span style=&quot;color: rgb(78, 201, 176); background-color: rgb(31, 31, 31); font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px;&quot;&gt;IEventListener&lt;/span&gt;&lt;/p&gt;" style="text;html=1;whiteSpace=wrap;overflow=hidden;rounded=0;" parent="1" vertex="1">
<mxGeometry x="450" y="240" width="320" height="240" as="geometry"/>
</mxCell>
</root>
diff --git a/dev/SCI/xpcom_core.hxx b/dev/SCI/xpcom_core.hxx
index 3183d0e4..63bcf403 100644
--- a/dev/SCI/xpcom_core.hxx
+++ b/dev/SCI/xpcom_core.hxx
@@ -3,7 +3,7 @@
Copyright ZKA Technologies.
File: rt.internal.inl
-Purpose: Base code of SCM.
+Purpose: Base code of XPCOM.
------------------------------------------- */
@@ -37,7 +37,7 @@ public:
virtual VoidPtr QueryInterface(UUID * p_uuid) = 0;
};
-/// @brief Allocate new SCM object.
+/// @brief Allocate new XPCOM object.
/// @tparam TCLS the class type.
/// @tparam UCLSID UCLS factory class type.
/// @param uclsidOfCls UCLS factory class
@@ -49,7 +49,7 @@ inline TCLS* XPCOMQueryInterface(UCLSID* uclsidOfCls, Args&&... args)
return uclsidOfCls->QueryInterfaceWithArgs(args...);
}
-/// @brief Release SCM object.
+/// @brief Release XPCOM object.
/// @tparam TCLS the class type.
/// @param cls the class to release.
/// @return status code.
diff --git a/dev/SCI/xpcom_sms.idl b/dev/SCI/xpcom_sms.idl
index de77d99e..ae37d285 100644
--- a/dev/SCI/xpcom_sms.idl
+++ b/dev/SCI/xpcom_sms.idl
@@ -3,7 +3,7 @@
Copyright ZKA Technologies.
File: rt.internal.inl
-Purpose: Base code of SCM.
+Purpose: Base code of XPCOM.
------------------------------------------- */
diff --git a/dev/ZBA/Sources/HEL/AMD64/BootMain.cxx b/dev/ZBA/Sources/HEL/AMD64/BootMain.cxx
index 9cccc922..3e78414c 100644
--- a/dev/ZBA/Sources/HEL/AMD64/BootMain.cxx
+++ b/dev/ZBA/Sources/HEL/AMD64/BootMain.cxx
@@ -211,11 +211,10 @@ EFI_EXTERN_C EFI_API Int Main(EfiHandlePtr ImageHandle,
handoverHdrPtr->f_BitMapStart = 0;
- while (BS->AllocatePool(EfiRuntimeServicesData, kHandoverHeapSz, &handoverHdrPtr->f_BitMapStart) != kEfiOk)
+ while (BS->AllocatePool(EfiRuntimeServicesData, kHandoverBitMapSz, &handoverHdrPtr->f_BitMapStart) != kEfiOk)
;
- handoverHdrPtr->f_VirtualSize =
- Descriptor[cDefaultMemoryMap].NumberOfPages; /* # of pages */
+ handoverHdrPtr->f_BitMapSize = kHandoverBitMapSz; /* # of pages */
handoverHdrPtr->f_FirmwareCustomTables[0] = (VoidPtr)BS;
handoverHdrPtr->f_FirmwareCustomTables[1] = (VoidPtr)ST;
@@ -291,13 +290,13 @@ EFI_EXTERN_C EFI_API Int Main(EfiHandlePtr ImageHandle,
urbanistTTF.Blob())
{
handoverHdrPtr->f_StartupChime = chimeWav.Blob();
- handoverHdrPtr->f_ChimeSz = chimeWav.Size();
+ handoverHdrPtr->f_ChimeSz = chimeWav.Size();
handoverHdrPtr->f_StartupImage = readerSysDrv.Blob();
- handoverHdrPtr->f_StartupSz = readerSysDrv.Size();
+ handoverHdrPtr->f_StartupSz = readerSysDrv.Size();
handoverHdrPtr->f_KernelImage = readerKernel.Blob();
- handoverHdrPtr->f_KernelSz = readerKernel.Size();
+ handoverHdrPtr->f_KernelSz = readerKernel.Size();
handoverHdrPtr->f_TTFallbackFont = urbanistTTF.Blob();
- handoverHdrPtr->f_FontSz = urbanistTTF.Size();
+ handoverHdrPtr->f_FontSz = urbanistTTF.Size();
}
else
{
diff --git a/dev/ZBA/amd64-efi.make b/dev/ZBA/amd64-efi.make
index 1f8bf1b1..0e159c41 100644
--- a/dev/ZBA/amd64-efi.make
+++ b/dev/ZBA/amd64-efi.make
@@ -36,7 +36,7 @@ EMU_FLAGS=-net none -m 8G -M q35 \
file=fat:rw:Sources/Root/,index=2,format=raw \
-drive id=disk_2,file=$(IMG_2),if=none \
-device ahci,id=ahci \
- -device ide-hd,drive=disk_2,bus=ahci.0 -serial stdio -no-reboot
+ -device ide-hd,drive=disk_2,bus=ahci.0 -d int -no-reboot -no-shutdown
LD_FLAGS=-e Main --subsystem=10
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