summaryrefslogtreecommitdiffhomepage
path: root/dev/Kernel/KernelKit
diff options
context:
space:
mode:
authorAmlal <amlal.elmahrouss@icloud.com>2025-01-24 10:38:36 +0100
committerAmlal <amlal.elmahrouss@icloud.com>2025-01-24 10:38:36 +0100
commit7b4bd3577a31d0f0adc7371840642791ae1567f4 (patch)
tree1a8afc973aaa739d0d763315cad2fd376d1cea9c /dev/Kernel/KernelKit
ADD: Open version, with important changes kept out.
Signed-off-by: Amlal <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'dev/Kernel/KernelKit')
-rw-r--r--dev/Kernel/KernelKit/CodeMgr.h37
-rw-r--r--dev/Kernel/KernelKit/DebugOutput.h211
-rw-r--r--dev/Kernel/KernelKit/Defines.h15
-rw-r--r--dev/Kernel/KernelKit/DeviceMgr.h140
-rw-r--r--dev/Kernel/KernelKit/DriveMgr.h191
-rw-r--r--dev/Kernel/KernelKit/FileMgr.h392
-rw-r--r--dev/Kernel/KernelKit/HardwareThreadScheduler.h149
-rw-r--r--dev/Kernel/KernelKit/Heap.h86
-rw-r--r--dev/Kernel/KernelKit/IDylibObject.h48
-rw-r--r--dev/Kernel/KernelKit/IPEFDylibObject.h106
-rw-r--r--dev/Kernel/KernelKit/LPC.h70
-rw-r--r--dev/Kernel/KernelKit/LoaderInterface.h34
-rw-r--r--dev/Kernel/KernelKit/LockDelegate.h69
-rw-r--r--dev/Kernel/KernelKit/MSDOS.h52
-rw-r--r--dev/Kernel/KernelKit/PCI/DMA.h81
-rw-r--r--dev/Kernel/KernelKit/PCI/DMA.inl20
-rw-r--r--dev/Kernel/KernelKit/PCI/Database.h38
-rw-r--r--dev/Kernel/KernelKit/PCI/Device.h80
-rw-r--r--dev/Kernel/KernelKit/PCI/Express.h11
-rw-r--r--dev/Kernel/KernelKit/PCI/IO-Impl-AMD64.inl54
-rw-r--r--dev/Kernel/KernelKit/PCI/IO.h59
-rw-r--r--dev/Kernel/KernelKit/PCI/Iterator.h43
-rw-r--r--dev/Kernel/KernelKit/PCI/PCI.h59
-rw-r--r--dev/Kernel/KernelKit/PE.h143
-rw-r--r--dev/Kernel/KernelKit/PECodeMgr.h24
-rw-r--r--dev/Kernel/KernelKit/PEF.h117
-rw-r--r--dev/Kernel/KernelKit/PEFCodeMgr.h72
-rw-r--r--dev/Kernel/KernelKit/Semaphore.h43
-rw-r--r--dev/Kernel/KernelKit/ThreadLocalStorage.h69
-rw-r--r--dev/Kernel/KernelKit/ThreadLocalStorage.inl99
-rw-r--r--dev/Kernel/KernelKit/Timer.h81
-rw-r--r--dev/Kernel/KernelKit/User.h86
-rw-r--r--dev/Kernel/KernelKit/UserProcessScheduler.h341
-rw-r--r--dev/Kernel/KernelKit/UserProcessScheduler.inl51
-rw-r--r--dev/Kernel/KernelKit/XCOFF.h51
35 files changed, 3222 insertions, 0 deletions
diff --git a/dev/Kernel/KernelKit/CodeMgr.h b/dev/Kernel/KernelKit/CodeMgr.h
new file mode 100644
index 00000000..eb5b316d
--- /dev/null
+++ b/dev/Kernel/KernelKit/CodeMgr.h
@@ -0,0 +1,37 @@
+/* -------------------------------------------
+
+ Copyright (C) 2024, Amlal EL Mahrouss, all rights reserved.
+
+ File: CodeMgr.h
+ Purpose: Code Mgr.
+
+ Revision History:
+
+ 30/01/24: Added file (amlel)
+ 3/8/24: Add UPP struct.
+
+------------------------------------------- */
+
+#pragma once
+
+#include <KernelKit/PECodeMgr.h>
+#include <KernelKit/PEFCodeMgr.h>
+#include <KernelKit/IPEFDylibObject.h>
+
+namespace Kernel
+{
+ /// @brief Main process entrypoint.
+ typedef void (*rtl_main_kind)(const SizeT argc, Char** argv, Char** envp, const SizeT envp_len);
+
+ /// @brief C++ Constructor entrypoint.
+ typedef void (*rtl_ctor_kind)(void);
+
+ /// @brief C++ Destructor entrypoint.
+ typedef void (*rtl_dtor_kind)(void);
+
+ /// @brief Executes a new process from a function. Kernel code only.
+ /// @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 The team's process id.
+ ProcessID rtl_create_process(rtl_main_kind main, const Char* process_name) noexcept;
+} // namespace Kernel
diff --git a/dev/Kernel/KernelKit/DebugOutput.h b/dev/Kernel/KernelKit/DebugOutput.h
new file mode 100644
index 00000000..0f02ecb1
--- /dev/null
+++ b/dev/Kernel/KernelKit/DebugOutput.h
@@ -0,0 +1,211 @@
+/* -------------------------------------------
+
+ Copyright (C) 2024, Amlal EL Mahrouss, all rights reserved.
+
+------------------------------------------- */
+
+#pragma once
+
+#include <KernelKit/DeviceMgr.h>
+#include <CompilerKit/CompilerKit.h>
+#include <NewKit/OwnPtr.h>
+#include <NewKit/Stream.h>
+
+#define kDebugMaxPorts 56
+
+#define kDebugUnboundPort 0x0FEED
+
+#define kDebugMag0 'Z'
+#define kDebugMag1 'D'
+#define kDebugMag2 'B'
+#define kDebugMag3 'G'
+
+#define kDebugSourceFile 0
+#define kDebugLine 33
+#define kDebugTeam 43
+#define kDebugEOP 49
+
+namespace Kernel
+{
+ class TerminalDevice;
+ class DTraceDevice;
+
+ inline TerminalDevice end_line();
+ inline TerminalDevice number(const Long& x);
+ inline TerminalDevice hex_number(const Long& x);
+
+ // @brief Emulates a VT100 terminal.
+ class TerminalDevice final ZKA_DEVICE<const Char*>
+ {
+ public:
+ TerminalDevice(void (*print)(const Char*), void (*gets)(const Char*))
+ : IDeviceObject<const Char*>(print, gets)
+ {
+ }
+
+ ~TerminalDevice() override;
+
+ /// @brief returns device name (terminal name)
+ /// @return string type (const Char*)
+ const Char* Name() const override
+ {
+ return ("TerminalDevice");
+ }
+
+ ZKA_COPY_DEFAULT(TerminalDevice);
+
+ STATIC TerminalDevice The() noexcept;
+ };
+
+ inline TerminalDevice end_line()
+ {
+ TerminalDevice self = TerminalDevice::The();
+
+ self.operator<<("\r");
+ return self;
+ }
+
+ inline TerminalDevice carriage_return()
+ {
+ TerminalDevice self = TerminalDevice::The();
+
+ self.operator<<("\r");
+ return self;
+ }
+
+ inline TerminalDevice tabulate()
+ {
+ TerminalDevice self = TerminalDevice::The();
+
+ self.operator<<("\t");
+ return self;
+ }
+
+ /// @brief emulate a terminal bell, like the VT100 does.
+ inline TerminalDevice bell()
+ {
+ TerminalDevice self = TerminalDevice::The();
+
+ self.operator<<("\a");
+ return self;
+ }
+
+ namespace Detail
+ {
+ inline TerminalDevice _write_number(const Long& x, TerminalDevice& term)
+ {
+ UInt64 y = (x > 0 ? x : -x) / 10;
+ UInt64 h = (x > 0 ? x : -x) % 10;
+
+ if (y)
+ _write_number(y, term);
+
+ /* fail if the number is not base-10 */
+ if (h > 10)
+ {
+ _write_number('?', term);
+ return term;
+ }
+
+ if (y < 0)
+ y = -y;
+
+ const Char kNumbers[11] = "0123456789";
+
+ Char buf[2];
+ buf[0] = kNumbers[h];
+ buf[1] = 0;
+
+ term.operator<<(buf);
+ return term;
+ }
+
+ inline TerminalDevice _write_number_hex(const Long& x, TerminalDevice& term)
+ {
+ UInt64 y = (x > 0 ? x : -x) / 16;
+ UInt64 h = (x > 0 ? x : -x) % 16;
+
+ if (y)
+ _write_number_hex(y, term);
+
+ /* fail if the hex number is not base-16 */
+ if (h > 16)
+ {
+ _write_number_hex('?', term);
+ return term;
+ }
+
+ if (y < 0)
+ y = -y;
+
+ const Char kNumbers[17] = "0123456789ABCDEF";
+
+ Char buf[2];
+ buf[0] = kNumbers[h];
+ buf[1] = 0;
+
+ term.operator<<(buf);
+ return term;
+ }
+ } // namespace Detail
+
+ inline TerminalDevice hex_number(const Long& x)
+ {
+ TerminalDevice self = TerminalDevice::The();
+
+ Detail::_write_number_hex(x, self);
+ self.operator<<("h");
+
+ return self;
+ }
+
+ inline TerminalDevice number(const Char* x)
+ {
+ TerminalDevice self = TerminalDevice::The();
+
+ self << "?";
+
+ return self;
+ }
+
+ inline TerminalDevice number(const Long& x)
+ {
+ TerminalDevice self = TerminalDevice::The();
+
+ Detail::_write_number(x, self);
+
+ return self;
+ }
+
+ inline TerminalDevice get_console_in(Char* buf)
+ {
+ TerminalDevice self = TerminalDevice::The();
+
+ self >> buf;
+
+ return self;
+ }
+
+ typedef Char rt_debug_type[255];
+
+ class DebuggerPortHeader final
+ {
+ public:
+ Int16 fPort[kDebugMaxPorts];
+ Int16 fBoundCnt;
+ };
+
+ inline TerminalDevice& operator<<(TerminalDevice& src, auto number)
+ {
+ number(number, src);
+ return src;
+ }
+} // namespace Kernel
+
+#ifdef kcout
+#undef kcout
+#endif // ifdef kcout
+
+#define kcout Kernel::TerminalDevice::The() << "\e[0;31m [NeKernel] " << __FILE__ << " \e[0m: "
+
+#define endl Kernel::TerminalDevice::The() << Kernel::end_line()
diff --git a/dev/Kernel/KernelKit/Defines.h b/dev/Kernel/KernelKit/Defines.h
new file mode 100644
index 00000000..8fa90619
--- /dev/null
+++ b/dev/Kernel/KernelKit/Defines.h
@@ -0,0 +1,15 @@
+/* -------------------------------------------
+
+ Copyright (C) 2024, Amlal EL Mahrouss, all rights reserved.
+
+------------------------------------------- */
+
+#pragma once
+
+#include <NewKit/Defines.h>
+
+#define KERNELKIT_VERSION "1.0.2"
+#define KERNELKIT_VERSION_BCD 0x01020
+
+class UserProcessScheduler;
+class UserProcess;
diff --git a/dev/Kernel/KernelKit/DeviceMgr.h b/dev/Kernel/KernelKit/DeviceMgr.h
new file mode 100644
index 00000000..9e867561
--- /dev/null
+++ b/dev/Kernel/KernelKit/DeviceMgr.h
@@ -0,0 +1,140 @@
+/* -------------------------------------------
+
+ Copyright (C) 2024, Amlal EL Mahrouss, all rights reserved.
+
+------------------------------------------- */
+
+/* -------------------------------------------
+
+ Revision History:
+
+ 31/01/24: Add kDeviceCnt (amlel)
+ 15/11/24: Add ZKA_DEVICE macro, to inherit from device object.
+
+ ------------------------------------------- */
+
+#pragma once
+
+/* @note Device Mgr. */
+/* @file KernelKit/DeviceMgr.h */
+/* @brief Device abstraction and I/O buffer. */
+
+#include <NewKit/ErrorOr.h>
+#include <NewKit/Ref.h>
+
+#define kDeviceMgrRootDirPath "/Devices/"
+
+#define ZKA_DEVICE : public ::Kernel::IDeviceObject
+
+// Last Rev: Wed, Apr 3, 2024 9:09:41 AM
+
+namespace Kernel
+{
+ template <typename T>
+ class IDeviceObject;
+
+ /***********************************************************************************/
+ /// @brief Device contract interface, represents an HW device.
+ /***********************************************************************************/
+ template <typename T>
+ class IDeviceObject
+ {
+ public:
+ explicit IDeviceObject(void (*Out)(T), void (*In)(T))
+ : fOut(Out), fIn(In)
+ {
+ }
+
+ virtual ~IDeviceObject() = default;
+
+ public:
+ IDeviceObject& operator=(const IDeviceObject<T>&) = default;
+ IDeviceObject(const IDeviceObject<T>&) = default;
+
+ public:
+ virtual IDeviceObject<T>& operator<<(T Data)
+ {
+ fOut(Data);
+ return *this;
+ }
+
+ virtual IDeviceObject<T>& operator>>(T Data)
+ {
+ fIn(Data);
+ return *this;
+ }
+
+ virtual const char* Name() const
+ {
+ return "IDeviceObject";
+ }
+
+ operator bool()
+ {
+ return fOut && fIn;
+ }
+
+ Bool operator!()
+ {
+ return !fOut || !fIn;
+ }
+
+ protected:
+ Void (*fOut)(T Data) = {nullptr};
+ Void (*fIn)(T Data) = {nullptr};
+ };
+
+ ///
+ /// @brief Input Output abstract class.
+ /// Used mainly to communicate between OS to hardware.
+ ///
+ template <typename T>
+ class IOBuf final
+ {
+ public:
+ explicit IOBuf(T dma_addr)
+ : fData(dma_addr)
+ {
+ // At least pass something valid when instancating this struct.
+ MUST_PASS(fData);
+ }
+
+ IOBuf& operator=(const IOBuf<T>&) = default;
+ IOBuf(const IOBuf<T>&) = default;
+
+ ~IOBuf() = default;
+
+ public:
+ template <typename R>
+ R operator->() const
+ {
+ return fData;
+ }
+
+ template <typename R>
+ R& operator[](Size index) const
+ {
+ return fData[index];
+ }
+
+ private:
+ T fData;
+ };
+
+ ///! @brief Device enum types.
+ enum
+ {
+ kDeviceTypeIDE,
+ kDeviceTypeEthernet,
+ kDeviceTypeWiFi,
+ kDeviceTypeFW,
+ kDeviceTypeBT,
+ kDeviceTypeRS232,
+ kDeviceTypeSCSI,
+ kDeviceTypeAHCI,
+ kDeviceTypeMBCI,
+ kDeviceTypeUSB,
+ kDeviceTypeMediaCtrl, // MM controller
+ kDeviceTypeCount,
+ };
+} // namespace Kernel
diff --git a/dev/Kernel/KernelKit/DriveMgr.h b/dev/Kernel/KernelKit/DriveMgr.h
new file mode 100644
index 00000000..e28e7cb7
--- /dev/null
+++ b/dev/Kernel/KernelKit/DriveMgr.h
@@ -0,0 +1,191 @@
+/* -------------------------------------------
+
+ Copyright (C) 2024, Amlal EL Mahrouss, all rights reserved.
+
+------------------------------------------- */
+
+#ifndef INC_DRIVE_MANAGER_H
+#define INC_DRIVE_MANAGER_H
+
+#include <KernelKit/UserProcessScheduler.h>
+#include <CompilerKit/CompilerKit.h>
+#include <KernelKit/DebugOutput.h>
+#include <KernelKit/DeviceMgr.h>
+#include <KernelKit/LPC.h>
+#include <NewKit/Defines.h>
+#include <NewKit/KString.h>
+#include <NewKit/Ref.h>
+
+#define kDriveMaxCount (4U)
+#define kDriveSectorSz (512U)
+#define kDriveInvalidID (-1)
+#define kDriveNameLen (32)
+
+#define drv_sector_cnt(SIZE, SECTOR_SZ) (((SIZE) + (SECTOR_SZ)) / (SECTOR_SZ))
+
+namespace Kernel
+{
+ enum
+ {
+ kInvalidDisc = -1,
+
+ /// Storage types, combine with flags.
+ kBlockDevice = 0xAD,
+ kMassStorageDisc = 0xDA,
+ kFloppyDisc = 0xCD,
+ kOpticalDisc = 0xDC, // CD-ROM/DVD-ROM/Blu-Ray
+ kTapeDisc = 0xD7,
+
+ /// Storage flags, combine with types.
+ kReadOnlyDrive = 0x10, // Read only drive
+ kEPMDrive = 0x11, // Explicit Partition Map.
+ kEPTDrive = 0x12, // ESP w/ EPM partition.
+ kMBRDrive = 0x13, // PC classic partition scheme
+ kGPTDrive = 0x14, // PC new partition scheme
+ kUnformattedDrive = 0x15,
+ kStorageCount = 9,
+ };
+
+ /// @brief Media drive trait type.
+ struct DriveTrait final
+ {
+ Char fName[kDriveNameLen]; // /System, /Boot, //./Devices/USB...
+ Int32 fKind; // fMassStorage, fFloppy, fOpticalDisc.
+ Int32 fFlags; // fReadOnly, fEPMDrive...
+
+ /// @brief Packet drive (StorageKit compilant.)
+ struct DrivePacket final
+ {
+ VoidPtr fPacketContent{nullptr}; //! packet body.
+ Char fPacketMime[kDriveNameLen] = "*/*"; //! identify what we're sending.
+ SizeT fPacketSize{0UL}; //! packet size
+ UInt32 fPacketCRC32{0UL}; //! sanity crc, in case if good is set to false
+ Boolean fPacketGood{YES};
+ Lba fPacketLba{0UL};
+ Boolean fPacketReadOnly{NO};
+ } fPacket;
+
+ Lba fLbaStart{0}, fLbaEnd{0};
+ SizeT fSectorSz{512};
+
+ Void (*fInput)(DrivePacket packet);
+ Void (*fOutput)(DrivePacket packet);
+ Void (*fVerify)(DrivePacket packet);
+ Void (*fInit)(DrivePacket packet);
+ const Char* (*fDriveKind)(Void);
+ };
+
+ ///! drive as a device.
+ typedef DriveTrait* DriveTraitPtr;
+
+ /**
+ * @brief Mounted drives interface.
+ * @note This class has all of it's drive set to nullptr, allocate them using
+ * GetAddressOf(index).
+ */
+ class MountpointInterface final
+ {
+ public:
+ explicit MountpointInterface() = default;
+ ~MountpointInterface() = default;
+
+ ZKA_COPY_DEFAULT(MountpointInterface);
+
+ public:
+ DriveTrait& A()
+ {
+ return mA;
+ }
+
+ DriveTrait& B()
+ {
+ return mB;
+ }
+
+ DriveTrait& C()
+ {
+ return mC;
+ }
+
+ DriveTrait& D()
+ {
+ return mD;
+ }
+
+ enum
+ {
+ kDriveIndexA = 0,
+ kDriveIndexB,
+ kDriveIndexC,
+ kDriveIndexD,
+ kDriveIndexInvalid,
+ };
+
+ DriveTraitPtr GetAddressOf(const Int32& index)
+ {
+ err_local_get() = kErrorSuccess;
+
+ switch (index)
+ {
+ case kDriveIndexA:
+ return &mA;
+ case kDriveIndexB:
+ return &mB;
+ case kDriveIndexC:
+ return &mC;
+ case kDriveIndexD:
+ return &mD;
+ default: {
+ err_local_get() = kErrorNoSuchDisk;
+ kcout << "No such disc letter.\n";
+
+ break;
+ }
+ }
+
+ return nullptr;
+ }
+
+ private:
+ DriveTrait mA, mB, mC, mD;
+ };
+
+ /// @brief Unimplemented drive.
+ /// @param pckt the packet to read.
+ /// @return
+ Void io_drv_unimplemented(DriveTrait::DrivePacket* pckt) noexcept;
+
+ /// @brief Gets the drive kind (ATA, SCSI, AHCI...)
+ /// @param void none.
+ /// @return the drive kind (ATA, Flash, NVM)
+ const Char* io_drv_kind(Void);
+
+ /// @brief Makes a new drive.
+ /// @return the new drive as a trait.
+ DriveTrait io_construct_blank_drive(Void) noexcept;
+
+ /// @brief Fetches the main drive.
+ /// @return the new drive as a trait.
+ DriveTrait io_construct_main_drive(Void) noexcept;
+
+ namespace Detect
+ {
+ Void io_detect_drive(DriveTrait& trait);
+ }
+
+ /// @brief Read from newfs disk.
+ /// @param Mnt mounted interface.
+ /// @param DrvTrait drive info
+ /// @param DrvIndex drive index.
+ /// @return
+ Int32 fs_ifs_read(MountpointInterface* Mnt, DriveTrait& DrvTrait, Int32 DrvIndex);
+
+ /// @brief Write to ifs disk.
+ /// @param Mnt mounted interface.
+ /// @param DrvTrait drive info
+ /// @param DrvIndex drive index.
+ /// @return
+ Int32 fs_ifs_write(MountpointInterface* Mnt, DriveTrait& DrvTrait, Int32 DrvIndex);
+} // namespace Kernel
+
+#endif /* ifndef INC_DRIVE_MANAGER_H */
diff --git a/dev/Kernel/KernelKit/FileMgr.h b/dev/Kernel/KernelKit/FileMgr.h
new file mode 100644
index 00000000..c78c0b97
--- /dev/null
+++ b/dev/Kernel/KernelKit/FileMgr.h
@@ -0,0 +1,392 @@
+/* -------------------------------------------
+
+ Copyright (C) 2024-2025, Amlal EL Mahrouss Labs, all rights reserved.
+
+ File: FileMgr.h
+ Purpose: Kernel file manager.
+
+------------------------------------------- */
+
+/* -------------------------------------------
+
+ Revision History:
+
+ 31/01/24: Update documentation (amlel)
+ 05/07/24: NeFS support, and fork support, updated constants and specs
+ as well.
+ 18/01/25: Patches to FileStream class.
+
+ ------------------------------------------- */
+
+#ifndef INC_FILEMGR_H
+#define INC_FILEMGR_H
+
+#ifdef __FSKIT_INCLUDES_NEFS__
+#include <FSKit/NeFS.h>
+#endif // __FSKIT_INCLUDES_NEFS__
+
+#ifdef __FSKIT_INCLUDES_HPFS__
+#include <FSKit/HPFS.h>
+#endif // __FSKIT_INCLUDES_HPFS__
+
+#include <CompilerKit/CompilerKit.h>
+#include <Hints/CompilerHint.h>
+#include <KernelKit/LPC.h>
+#include <KernelKit/DebugOutput.h>
+#include <NewKit/Stream.h>
+#include <NewKit/ErrorOr.h>
+#include <KernelKit/Heap.h>
+#include <NewKit/Ref.h>
+
+/// @brief Filesystem manager, abstraction over mounted filesystem.
+/// Works like the VFS or IFS.
+
+#define kRestrictR "r"
+#define kRestrictRB "rb"
+#define kRestrictW "w"
+#define kRestrictWB "rw"
+#define kRestrictRWB "rwb"
+
+#define kRestrictMax (5U)
+
+#define node_cast(PTR) reinterpret_cast<Kernel::NodePtr>(PTR)
+
+/**
+ @note Refer to first enum.
+*/
+#define kFileOpsCount (4U)
+#define kFileMimeGeneric "n-application-kind/all"
+
+/** @brief invalid position. (n-pos) */
+#define kNPos (SizeT)(-1);
+
+namespace Kernel
+{
+ enum
+ {
+ kFileWriteAll = 100,
+ kFileReadAll = 101,
+ kFileReadChunk = 102,
+ kFileWriteChunk = 103,
+ kFileIOCnt = (kFileWriteChunk - kFileWriteAll) + 1,
+ // file flags
+ kFileFlagRsrc = 104,
+ kFileFlagData = 105,
+ };
+
+ typedef VoidPtr NodePtr;
+
+ /**
+ @brief Filesystem Mgr Interface class
+ @brief Used to provide common I/O for a specific filesystem.
+*/
+ class IFilesystemMgr
+ {
+ public:
+ explicit IFilesystemMgr() = default;
+ virtual ~IFilesystemMgr() = default;
+
+ public:
+ ZKA_COPY_DEFAULT(IFilesystemMgr);
+
+ public:
+ /// @brief Mounts a new filesystem into an active state.
+ /// @param interface the filesystem interface
+ /// @return
+ static bool Mount(IFilesystemMgr* interface);
+
+ /// @brief Unmounts the active filesystem
+ /// @return
+ static IFilesystemMgr* Unmount();
+
+ /// @brief Getter, gets the active filesystem.
+ /// @return
+ static IFilesystemMgr* GetMounted();
+
+ public:
+ virtual NodePtr Create(_Input const Char* path) = 0;
+ virtual NodePtr CreateAlias(_Input const Char* path) = 0;
+ virtual NodePtr CreateDirectory(_Input const Char* path) = 0;
+ virtual NodePtr CreateSwapFile(const Char* path) = 0;
+
+ public:
+ virtual bool Remove(_Input const Char* path) = 0;
+
+ public:
+ virtual NodePtr Open(_Input const Char* path, _Input const Char* r) = 0;
+
+ public:
+ virtual Void Write(_Input NodePtr node, _Input VoidPtr data, _Input Int32 flags, _Input SizeT size) = 0;
+
+ virtual _Output VoidPtr Read(_Input NodePtr node,
+ _Input Int32 flags,
+ _Input SizeT sz) = 0;
+
+ virtual Void Write(_Input const Char* name,
+ _Input NodePtr node,
+ _Input VoidPtr data,
+ _Input Int32 flags,
+ _Input SizeT size) = 0;
+
+ virtual _Output VoidPtr Read(_Input const Char* name,
+ _Input NodePtr node,
+ _Input Int32 flags,
+ _Input SizeT sz) = 0;
+
+ public:
+ virtual bool Seek(_Input NodePtr node, _Input SizeT off) = 0;
+
+ public:
+ virtual SizeT Tell(_Input NodePtr node) = 0;
+ virtual bool Rewind(_Input NodePtr node) = 0;
+ };
+
+#ifdef __FSKIT_INCLUDES_NEFS__
+ /**
+ * @brief Based of IFilesystemMgr, takes care of managing NeFS
+ * disks.
+ */
+ class NeFileSystemMgr final : public IFilesystemMgr
+ {
+ public:
+ explicit NeFileSystemMgr();
+ ~NeFileSystemMgr() override;
+
+ public:
+ ZKA_COPY_DEFAULT(NeFileSystemMgr);
+
+ public:
+ NodePtr Create(const Char* path) override;
+ NodePtr CreateAlias(const Char* path) override;
+ NodePtr CreateDirectory(const Char* path) override;
+ NodePtr CreateSwapFile(const Char* path) override;
+
+ public:
+ bool Remove(_Input const Char* path) override;
+ NodePtr Open(_Input const Char* path, _Input const Char* r) override;
+ Void Write(_Input NodePtr node, _Input VoidPtr data, _Input Int32 flags, _Input SizeT sz) override;
+ VoidPtr Read(_Input NodePtr node, _Input Int32 flags, _Input SizeT sz) override;
+ bool Seek(_Input NodePtr node, _Input SizeT off) override;
+ SizeT Tell(_Input NodePtr node) override;
+ bool Rewind(_Input NodePtr node) override;
+
+ Void Write(_Input const Char* name,
+ _Input NodePtr node,
+ _Input VoidPtr data,
+ _Input Int32 flags,
+ _Input SizeT size) override;
+
+ _Output VoidPtr Read(_Input const Char* name,
+ _Input NodePtr node,
+ _Input Int32 flags,
+ _Input SizeT sz) override;
+
+ public:
+ /// @brief Get NeFS parser class.
+ /// @return The filesystem parser class.
+ NeFileSystemParser* GetParser() noexcept;
+
+ private:
+ NeFileSystemParser* mParser{nullptr};
+ };
+
+#endif // ifdef __FSKIT_INCLUDES_NEFS__
+
+ /**
+ * FileStream class.
+ * @tparam Encoding file encoding (char, wchar_t...)
+ * @tparam FSClass Filesystem contract who takes care of it.
+ */
+ template <typename Encoding = Char,
+ typename FSClass = IFilesystemMgr>
+ class FileStream final
+ {
+ public:
+ explicit FileStream(const Encoding* path, const Encoding* restrict_type);
+ ~FileStream();
+
+ public:
+ FileStream& operator=(const FileStream&);
+ FileStream(const FileStream&);
+
+ public:
+ ErrorOr<Int64> Write(const SizeT offset, const VoidPtr data, SizeT len) noexcept
+ {
+ if (this->fFileRestrict != kFileMgrRestrictReadWrite &&
+ this->fFileRestrict != kFileMgrRestrictReadWriteBinary &&
+ this->fFileRestrict != kFileMgrRestrictWrite &&
+ this->fFileRestrict != kFileMgrRestrictWriteBinary)
+ return ErrorOr<Int64>(kErrorInvalidData);
+
+ if (data == nullptr)
+ return ErrorOr<Int64>(kErrorInvalidData);
+
+ auto man = FSClass::GetMounted();
+
+ if (man)
+ {
+ man->Write(offset, fFile, data, len);
+ return ErrorOr<Int64>(0);
+ }
+
+ return ErrorOr<Int64>(kErrorInvalidData);
+ }
+
+ ErrorOr<Int64> Write(const Char* name, const VoidPtr data, SizeT len) noexcept
+ {
+ if (this->fFileRestrict != kFileMgrRestrictReadWrite &&
+ this->fFileRestrict != kFileMgrRestrictReadWriteBinary &&
+ this->fFileRestrict != kFileMgrRestrictWrite &&
+ this->fFileRestrict != kFileMgrRestrictWriteBinary)
+ return ErrorOr<Int64>(kErrorInvalidData);
+
+ if (data == nullptr)
+ return ErrorOr<Int64>(kErrorInvalidData);
+
+ auto man = FSClass::GetMounted();
+
+ if (man)
+ {
+ man->Write(name, fFile, data, 0, len);
+ return ErrorOr<Int64>(0);
+ }
+
+ return ErrorOr<Int64>(kErrorInvalidData);
+ }
+
+ VoidPtr Read(const Char* name, const SizeT sz) noexcept
+ {
+ if (this->fFileRestrict != kFileMgrRestrictReadWrite &&
+ this->fFileRestrict != kFileMgrRestrictReadWriteBinary &&
+ this->fFileRestrict != kFileMgrRestrictRead &&
+ this->fFileRestrict != kFileMgrRestrictReadBinary)
+ return nullptr;
+
+ auto man = FSClass::GetMounted();
+
+ if (man)
+ {
+ VoidPtr ret = man->Read(name, fFile, kFileReadAll, 0);
+ return ret;
+ }
+
+ return nullptr;
+ }
+
+ VoidPtr Read(SizeT offset, const SizeT sz)
+ {
+ if (this->fFileRestrict != kFileMgrRestrictReadWrite &&
+ this->fFileRestrict != kFileMgrRestrictReadWriteBinary &&
+ this->fFileRestrict != kFileMgrRestrictRead &&
+ this->fFileRestrict != kFileMgrRestrictReadBinary)
+ return nullptr;
+
+ auto man = FSClass::GetMounted();
+
+ if (man)
+ {
+ man->Seek(fFile, offset);
+ auto ret = man->Read(fFile, kFileReadChunk, sz);
+
+ return ret;
+ }
+
+ return nullptr;
+ }
+
+ public:
+ /// @brief Leak node pointer.
+ /// @return The node pointer.
+ NodePtr Leak()
+ {
+ return fFile;
+ }
+
+ /// @brief Leak MIME.
+ /// @return The MIME.
+ Char* MIME() noexcept
+ {
+ return const_cast<Char*>(fMime);
+ }
+
+ enum
+ {
+ kFileMgrRestrictRead,
+ kFileMgrRestrictReadBinary,
+ kFileMgrRestrictWrite,
+ kFileMgrRestrictWriteBinary,
+ kFileMgrRestrictReadWrite,
+ kFileMgrRestrictReadWriteBinary,
+ };
+
+ private:
+ NodePtr fFile{nullptr};
+ Int32 fFileRestrict{kFileMgrRestrictReadBinary};
+ const Char* fMime{kFileMimeGeneric};
+ };
+
+ using FileStreamUTF8 = FileStream<Char>;
+ using FileStreamUTF16 = FileStream<WideChar>;
+
+ typedef UInt64 CursorType;
+
+ inline static const auto kRestrictStrLen = 8U;
+
+ /// @brief restrict information about the file descriptor.
+ struct FileRestrictKind final
+ {
+ Char fRestrict[kRestrictStrLen];
+ Int32 fMappedTo;
+ };
+
+ /// @brief constructor
+ template <typename Encoding, typename Class>
+ inline FileStream<Encoding, Class>::FileStream(const Encoding* path,
+ const Encoding* restrict_type)
+ : fFile(Class::GetMounted()->Open(path, restrict_type))
+ {
+ const SizeT kRestrictCount = kRestrictMax;
+ const FileRestrictKind kRestrictList[] = {
+ {
+ .fRestrict = kRestrictR,
+ .fMappedTo = kFileMgrRestrictRead,
+ },
+ {
+ .fRestrict = kRestrictRB,
+ .fMappedTo = kFileMgrRestrictReadBinary,
+ },
+ {
+ .fRestrict = kRestrictRWB,
+ .fMappedTo = kFileMgrRestrictReadWriteBinary,
+ },
+ {
+ .fRestrict = kRestrictW,
+ .fMappedTo = kFileMgrRestrictWrite,
+ },
+ {
+ .fRestrict = kRestrictWB,
+ .fMappedTo = kFileMgrRestrictReadWrite,
+ }};
+
+ for (SizeT index = 0; index < kRestrictCount; ++index)
+ {
+ if (rt_string_cmp(restrict_type, kRestrictList[index].fRestrict,
+ rt_string_len(kRestrictList[index].fRestrict)) == 0)
+ {
+ fFileRestrict = kRestrictList[index].fMappedTo;
+ break;
+ }
+ }
+
+ kcout << "new file: " << path << ".\r";
+ }
+
+ /// @brief destructor of the file stream.
+ template <typename Encoding, typename Class>
+ inline FileStream<Encoding, Class>::~FileStream()
+ {
+ mm_delete_heap(fFile);
+ }
+} // namespace Kernel
+
+#endif // ifndef INC_FILEMGR_H
diff --git a/dev/Kernel/KernelKit/HardwareThreadScheduler.h b/dev/Kernel/KernelKit/HardwareThreadScheduler.h
new file mode 100644
index 00000000..81a137e1
--- /dev/null
+++ b/dev/Kernel/KernelKit/HardwareThreadScheduler.h
@@ -0,0 +1,149 @@
+/* -------------------------------------------
+
+ Copyright (C) 2024, Amlal EL Mahrouss, all rights reserved.
+
+------------------------------------------- */
+
+#ifndef __INC_MP_MANAGER_H__
+#define __INC_MP_MANAGER_H__
+
+#include <ArchKit/ArchKit.h>
+#include <CompilerKit/CompilerKit.h>
+#include <NewKit/Ref.h>
+
+/// @note Last Rev Sun 28 Jul CET 2024
+/// @note Last Rev Thu, Aug 1, 2024 9:07:38 AM
+
+#define kMaxAPInsideSched (8U)
+
+namespace Kernel
+{
+ class HardwareThread;
+ class HardwareThreadScheduler;
+
+ using ThreadID = UInt32;
+
+ enum ThreadKind
+ {
+ kAPSystemReserved, // System reserved thread, well user can't use it
+ kAPStandard, // user thread, cannot be used by Kernel
+ kAPFallback, // fallback thread, cannot be used by user if not clear or
+ // used by Kernel.
+ kAPBoot, // The core we booted from, the mama.
+ kInvalidAP,
+ kAPCount,
+ };
+
+ typedef enum ThreadKind ThreadKind;
+ typedef ThreadID ThreadID;
+
+ /***********************************************************************************/
+ ///
+ /// \name HardwareThread
+ /// \brief Abstraction over the CPU's core, used to run processes or threads.
+ ///
+ /***********************************************************************************/
+
+ class HardwareThread final
+ {
+ public:
+ explicit HardwareThread();
+ ~HardwareThread();
+
+ public:
+ ZKA_COPY_DEFAULT(HardwareThread)
+
+ public:
+ operator bool();
+
+ public:
+ void Wake(const bool wakeup = false) noexcept;
+ void Busy(const bool busy = false) noexcept;
+
+ public:
+ bool Switch(VoidPtr image, Ptr8 stack_ptr, HAL::StackFramePtr frame, const ThreadID& pid);
+ bool IsWakeup() noexcept;
+
+ public:
+ HAL::StackFramePtr StackFrame() noexcept;
+ const ThreadKind& Kind() noexcept;
+ bool IsBusy() noexcept;
+ const ThreadID& ID() noexcept;
+
+ private:
+ HAL::StackFramePtr fStack{nullptr};
+ ThreadKind fKind{ThreadKind::kAPStandard};
+ ThreadID fID{0};
+ ThreadID fSourcePID{0};
+ Bool fWakeup{NO};
+ Bool fBusy{NO};
+ UInt64 fPTime{0};
+
+ private:
+ friend class HardwareThreadScheduler;
+ friend class UserProcessHelper;
+ };
+
+ ///
+ /// \name HardwareThreadScheduler
+ /// \brief Class to manage the thread scheduling.
+ ///
+
+ class HardwareThreadScheduler final : public ISchedulable
+ {
+ private:
+ friend class UserProcessHelper;
+
+ public:
+ explicit HardwareThreadScheduler();
+ ~HardwareThreadScheduler();
+ ZKA_COPY_DEFAULT(HardwareThreadScheduler);
+
+ public:
+ HAL::StackFramePtr Leak() noexcept;
+
+ public:
+ Ref<HardwareThread*> operator[](const SizeT& idx);
+ bool operator!() noexcept;
+ operator bool() noexcept;
+
+ const Bool IsUser() override
+ {
+ return Yes;
+ }
+
+ const Bool IsKernel() override
+ {
+ return No;
+ }
+
+ const Bool HasMP() override
+ {
+ return kHandoverHeader->f_HardwareTables.f_MultiProcessingEnabled;
+ }
+
+ public:
+ /// @brief Shared instance of the MP Mgr.
+ /// @return the reference to the mp manager class.
+ STATIC HardwareThreadScheduler& The();
+
+ public:
+ /// @brief Returns the amount of threads present in the system.
+ /// @returns SizeT the amount of cores present.
+ SizeT Capacity() noexcept;
+
+ private:
+ Array<HardwareThread, kMaxAPInsideSched> fThreadList;
+ ThreadID fCurrentThread{0};
+ };
+
+ /// @brief wakes up thread.
+ /// wakes up thread from hang.
+ Void mp_wakeup_thread(HAL::StackFramePtr stack);
+
+ /// @brief makes thread sleep.
+ /// hooks and hangs thread to prevent code from executing.
+ Void mp_hang_thread(HAL::StackFramePtr stack);
+} // namespace Kernel
+
+#endif // !__INC_MP_MANAGER_H__
diff --git a/dev/Kernel/KernelKit/Heap.h b/dev/Kernel/KernelKit/Heap.h
new file mode 100644
index 00000000..ac6cac41
--- /dev/null
+++ b/dev/Kernel/KernelKit/Heap.h
@@ -0,0 +1,86 @@
+/* -------------------------------------------
+
+ Copyright (C) 2024, Amlal EL Mahrouss, all rights reserved.
+
+------------------------------------------- */
+
+#ifndef INC_KERNEL_HEAP_H
+#define INC_KERNEL_HEAP_H
+
+/// @date 30/01/24
+/// @file: Heap.h
+/// @brief: heap allocation support.
+
+#include <NewKit/KernelPanic.h>
+#include <KernelKit/LPC.h>
+#include <Hints/CompilerHint.h>
+
+namespace Kernel
+{
+ /// @brief Declare pointer as free.
+ /// @param heap_ptr the pointer.
+ /// @return a status code regarding the deallocation.
+ Int32 mm_delete_heap(VoidPtr heap_ptr);
+
+ /// @brief Declare a new size for heap_ptr.
+ /// @param heap_ptr the pointer.
+ /// @return unsupported always returns nullptr.
+ VoidPtr mm_realloc_heap(VoidPtr heap_ptr, SizeT new_sz);
+
+ /// @brief Check if pointer is a valid Kernel pointer.
+ /// @param heap_ptr the pointer
+ /// @return if it exists it returns true.
+ Boolean mm_is_valid_heap(VoidPtr heap_ptr);
+
+ /// @brief Allocate chunk of memory.
+ /// @param sz Size of pointer
+ /// @param wr Read Write bit.
+ /// @param user User enable bit.
+ /// @return The newly allocated pointer, or nullptr.
+ VoidPtr mm_new_heap(const SizeT sz, const Bool wr, const Bool user);
+
+ /// @brief Protect the heap with a CRC value.
+ /// @param heap_ptr pointer.
+ /// @return if it valid: point has crc now., otherwise fail.
+ Boolean mm_protect_heap(VoidPtr heap_ptr);
+
+ /// @brief Makes a Kernel page.
+ /// @param heap_ptr the page pointer.
+ /// @return status code
+ Int32 mm_make_page(VoidPtr heap_ptr);
+
+ /// @brief Overwrites and set the flags of a heap header.
+ /// @param heap_ptr the pointer to update.
+ /// @param flags the flags to set.
+ Int32 mm_make_flags(VoidPtr heap_ptr, UInt64 flags);
+
+ /// @brief Gets the flags of a heap header.
+ /// @param heap_ptr the pointer to get.
+ UInt64 mm_get_flags(VoidPtr heap_ptr);
+
+ /// @brief Allocate C++ class.
+ /// @param cls The class to allocate.
+ /// @param args The args to pass.
+ template <typename T, typename... Args>
+ inline Void mm_new_class(_Input _Output T** cls, _Input Args&&... args)
+ {
+ if (*cls)
+ {
+ err_global_get() = Kernel::kErrorInvalidData;
+ return;
+ }
+
+ *cls = new T(move(args)...);
+ }
+
+ /// @brief Delete and nullify C++ class.
+ /// @param cls The class to delete.
+ template <typename T>
+ inline Void mm_delete_class(_Input _Output T** cls)
+ {
+ delete *cls;
+ *cls = nullptr;
+ }
+} // namespace Kernel
+
+#endif // !INC_KERNEL_HEAP_H
diff --git a/dev/Kernel/KernelKit/IDylibObject.h b/dev/Kernel/KernelKit/IDylibObject.h
new file mode 100644
index 00000000..a7602be6
--- /dev/null
+++ b/dev/Kernel/KernelKit/IDylibObject.h
@@ -0,0 +1,48 @@
+/*
+ * ========================================================
+ *
+ * Kernel
+ * Copyright (C) 2024, Amlal EL Mahrouss, all rights reserved., all rights reserved.
+ *
+ * ========================================================
+ */
+
+#pragma once
+
+#include <NewKit/Defines.h>
+#include <CompilerKit/CompilerKit.h>
+
+#define ZKA_DLL_OBJECT : public IDylibObject
+
+namespace Kernel
+{
+ /// @brief DLL class object. A handle to a shared library.
+ class IDylibObject
+ {
+ public:
+ explicit IDylibObject() = default;
+ virtual ~IDylibObject() = default;
+
+ struct DLL_TRAITS final
+ {
+ VoidPtr ImageObject{nullptr};
+ VoidPtr ImageEntrypointOffset{nullptr};
+
+ Bool IsValid()
+ {
+ return ImageObject && ImageEntrypointOffset;
+ }
+ };
+
+ ZKA_COPY_DEFAULT(IDylibObject);
+
+ virtual DLL_TRAITS** GetAddressOf() = 0;
+ virtual DLL_TRAITS* Get() = 0;
+
+ virtual Void Mount(DLL_TRAITS* to_mount) = 0;
+ virtual Void Unmount() = 0;
+ };
+
+ /// @brief Pure implementation, missing method/function handler.
+ EXTERN_C void __zka_pure_call(void);
+} // namespace Kernel
diff --git a/dev/Kernel/KernelKit/IPEFDylibObject.h b/dev/Kernel/KernelKit/IPEFDylibObject.h
new file mode 100644
index 00000000..68493c86
--- /dev/null
+++ b/dev/Kernel/KernelKit/IPEFDylibObject.h
@@ -0,0 +1,106 @@
+/*
+ * ========================================================
+ *
+ * Kernel
+ * Copyright (C) 2024, Amlal EL Mahrouss, all rights reserved., all rights reserved.
+ *
+ * ========================================================
+ */
+
+#ifndef __KERNELKIT_SHARED_OBJECT_H__
+#define __KERNELKIT_SHARED_OBJECT_H__
+
+#include <KernelKit/PEF.h>
+#include <NewKit/Defines.h>
+#include <KernelKit/PEFCodeMgr.h>
+#include <KernelKit/UserProcessScheduler.h>
+#include <KernelKit/IDylibObject.h>
+
+namespace Kernel
+{
+ /**
+ * @brief Shared Library class
+ * Load library from this class
+ */
+ class IPEFDylibObject final ZKA_DLL_OBJECT
+ {
+ public:
+ explicit IPEFDylibObject() = default;
+ ~IPEFDylibObject() = default;
+
+ public:
+ ZKA_COPY_DEFAULT(IPEFDylibObject);
+
+ private:
+ DLL_TRAITS* fMounted{nullptr};
+
+ public:
+ DLL_TRAITS** GetAddressOf()
+ {
+ return &fMounted;
+ }
+
+ DLL_TRAITS* Get()
+ {
+ return fMounted;
+ }
+
+ public:
+ void Mount(DLL_TRAITS* to_mount)
+ {
+ if (!to_mount || !to_mount->ImageObject)
+ return;
+
+ fMounted = to_mount;
+
+ if (fLoader && to_mount)
+ {
+ delete fLoader;
+ fLoader = nullptr;
+ }
+
+ if (!fLoader)
+ {
+ fLoader = new PEFLoader(fMounted->ImageObject);
+ }
+ }
+
+ void Unmount()
+ {
+ if (fMounted)
+ fMounted = nullptr;
+ };
+
+ template <typename SymbolType>
+ SymbolType Load(const Char* symbol_name, SizeT len, Int32 kind)
+ {
+ if (symbol_name == nullptr || *symbol_name == 0)
+ return nullptr;
+ if (len > kPathLen || len < 1)
+ return nullptr;
+
+ auto ret =
+ reinterpret_cast<SymbolType>(fLoader->FindSymbol(symbol_name, kind));
+
+ if (!ret)
+ {
+ if (kind == kPefCode)
+ return (VoidPtr)&__zka_pure_call;
+
+ return nullptr;
+ }
+
+ return ret;
+ }
+
+ private:
+ PEFLoader* fLoader{nullptr};
+ };
+
+ typedef IPEFDylibObject* IDylibRef;
+
+ EXTERN_C IDylibRef rtl_init_dylib(UserProcess& header);
+ EXTERN_C Void rtl_fini_dylib(UserProcess& header, IDylibRef lib, Bool* successful);
+} // namespace Kernel
+
+#endif /* ifndef __KERNELKIT_SHARED_OBJECT_H__ */
diff --git a/dev/Kernel/KernelKit/LPC.h b/dev/Kernel/KernelKit/LPC.h
new file mode 100644
index 00000000..434a3efc
--- /dev/null
+++ b/dev/Kernel/KernelKit/LPC.h
@@ -0,0 +1,70 @@
+/* -------------------------------------------
+
+ Copyright (C) 2024, Amlal EL Mahrouss, all rights reserved.
+
+------------------------------------------- */
+
+#pragma once
+
+#include <NewKit/Defines.h>
+
+/// @file LPC.h
+/// @brief Local Process Codes.
+
+#define err_local_ok() (Kernel::UserProcessScheduler::The().GetCurrentProcess().Leak().GetLocalCode() == Kernel::kErrorSuccess)
+#define err_local_fail() (Kernel::UserProcessScheduler::The().GetCurrentProcess().Leak().GetLocalCode() != Kernel::kErrorSuccess)
+#define err_local_get() (Kernel::UserProcessScheduler::The().GetCurrentProcess().Leak().GetLocalCode())
+
+#define err_global_ok() (Kernel::kErrorLocalNumber == Kernel::kErrorSuccess)
+#define err_global_fail() (Kernel::kErrorLocalNumber != Kernel::kErrorSuccess)
+#define err_global_get() (Kernel::kErrorLocalNumber)
+
+namespace Kernel
+{
+ typedef Int32 HError;
+
+ inline HError kErrorLocalNumber = 0UL;
+
+ inline constexpr HError kErrorSuccess = 0;
+ inline constexpr HError kErrorExecutable = 33;
+ inline constexpr HError kErrorExecutableLib = 34;
+ inline constexpr HError kErrorFileNotFound = 35;
+ inline constexpr HError kErrorDirectoryNotFound = 36;
+ inline constexpr HError kErrorDiskReadOnly = 37;
+ inline constexpr HError kErrorDiskIsFull = 38;
+ inline constexpr HError kErrorProcessFault = 39;
+ inline constexpr HError kErrorSocketHangUp = 40;
+ inline constexpr HError kErrorThreadLocalStorage = 41;
+ inline constexpr HError kErrorMath = 42;
+ inline constexpr HError kErrorNoNetwork = 43;
+ inline constexpr HError kErrorHeapOutOfMemory = 44;
+ inline constexpr HError kErrorNoSuchDisk = 45;
+ inline constexpr HError kErrorFileExists = 46;
+ inline constexpr HError kErrorFormatFailed = 47;
+ inline constexpr HError kErrorNetworkTimeout = 48;
+ inline constexpr HError kErrorInternal = 49;
+ inline constexpr HError kErrorForkAlreadyExists = 50;
+ inline constexpr HError kErrorOutOfTeamSlot = 51;
+ inline constexpr HError kErrorHeapNotPresent = 52;
+ inline constexpr HError kErrorNoEntrypoint = 53;
+ inline constexpr HError kErrorDiskIsCorrupted = 54;
+ inline constexpr HError kErrorDisk = 55;
+ inline constexpr HError kErrorInvalidData = 56;
+ inline constexpr HError kErrorAsync = 57;
+ inline constexpr HError kErrorNonBlocking = 58;
+ inline constexpr HError kErrorIPC = 59;
+ inline constexpr HError kErrorSign = 60;
+ inline constexpr HError kErrorInvalidCreds = 61;
+ inline constexpr HError kErrorCDTrayBroken = 62;
+ inline constexpr HError kErrorUnrecoverableDisk = 63;
+ inline constexpr HError kErrorFileLocked = 64;
+ inline constexpr HError kErrorUnimplemented = 0;
+
+ /// @brief Raises a bug check stop code.
+ Void err_bug_check_raise(Void) noexcept;
+
+ /// @brief Does a system wide bug check.
+ /// @param void no params are needed.
+ /// @return if error-free: false, otherwise true.
+ Boolean err_bug_check(Void) noexcept;
+} // namespace Kernel
diff --git a/dev/Kernel/KernelKit/LoaderInterface.h b/dev/Kernel/KernelKit/LoaderInterface.h
new file mode 100644
index 00000000..29a1b928
--- /dev/null
+++ b/dev/Kernel/KernelKit/LoaderInterface.h
@@ -0,0 +1,34 @@
+/* -------------------------------------------
+
+ Copyright (C) 2024, Amlal EL Mahrouss, all rights reserved.
+
+------------------------------------------- */
+
+#pragma once
+
+#include <CompilerKit/CompilerKit.h>
+#include <Hints/CompilerHint.h>
+#include <NewKit/Defines.h>
+#include <NewKit/ErrorOr.h>
+
+namespace Kernel
+{
+ /// @brief This interface is used to make loader contracts (MSCOFF, PEF).
+ /// @author @Amlal-El-Mahrouss
+ class LoaderInterface
+ {
+ public:
+ explicit LoaderInterface() = default;
+ virtual ~LoaderInterface() = default;
+
+ ZKA_COPY_DEFAULT(LoaderInterface);
+
+ public:
+ virtual _Output ErrorOr<VoidPtr> GetBlob() = 0;
+ virtual _Output const Char* AsString() = 0;
+ virtual _Output const Char* MIME() = 0;
+ virtual _Output const Char* Path() = 0;
+ virtual _Output ErrorOr<VoidPtr> FindStart() = 0;
+ virtual _Output VoidPtr FindSymbol(_Input const Char* name, _Input Int32 kind) = 0;
+ };
+} // namespace Kernel
diff --git a/dev/Kernel/KernelKit/LockDelegate.h b/dev/Kernel/KernelKit/LockDelegate.h
new file mode 100644
index 00000000..2ee4bb25
--- /dev/null
+++ b/dev/Kernel/KernelKit/LockDelegate.h
@@ -0,0 +1,69 @@
+/* -------------------------------------------
+
+ Copyright (C) 2024, Amlal EL Mahrouss, all rights reserved.
+
+------------------------------------------- */
+
+#pragma once
+
+#include <NewKit/Atom.h>
+#include <NewKit/Defines.h>
+
+namespace Kernel
+{
+ enum
+ {
+ kLockDone = 200,
+ kLockTimedOut,
+ };
+
+ /// @brief Lock condition pointer.
+ typedef Boolean* LockPtr;
+
+ /// @brief Locking delegate class, hangs until limit.
+ /// @tparam N the amount of cycles to wait.
+ template <SizeT N>
+ class LockDelegate final
+ {
+ public:
+ LockDelegate() = delete;
+
+ public:
+ explicit LockDelegate(LockPtr expr)
+ {
+ auto spin = 0U;
+
+ while (spin < N)
+ {
+ if (*expr)
+ {
+ fLockStatus | kLockDone;
+ break;
+ }
+
+ ++spin;
+ }
+
+ if (spin > N)
+ fLockStatus | kLockTimedOut;
+ }
+
+ ~LockDelegate() = default;
+
+ LockDelegate& operator=(const LockDelegate&) = delete;
+ LockDelegate(const LockDelegate&) = delete;
+
+ bool Done()
+ {
+ return fLockStatus[kLockDone] == kLockDone;
+ }
+
+ bool HasTimedOut()
+ {
+ return fLockStatus[kLockTimedOut] != kLockTimedOut;
+ }
+
+ private:
+ Atom<UInt> fLockStatus;
+ };
+} // namespace Kernel
diff --git a/dev/Kernel/KernelKit/MSDOS.h b/dev/Kernel/KernelKit/MSDOS.h
new file mode 100644
index 00000000..3da68dae
--- /dev/null
+++ b/dev/Kernel/KernelKit/MSDOS.h
@@ -0,0 +1,52 @@
+/* -------------------------------------------
+
+ Copyright (C) 2024, Amlal EL Mahrouss, all rights reserved.
+
+ File: MSDOS.h
+ Purpose: MS-DOS header for Kernel.
+
+ Revision History:
+
+ 30/01/24: Added file (amlel)
+
+------------------------------------------- */
+
+#ifndef __MSDOS_EXEC__
+#define __MSDOS_EXEC__
+
+#include <KernelKit/PE.h>
+#include <NewKit/Defines.h>
+
+// Last Rev
+// Sat Feb 24 CET 2024
+
+#define kMagMz0 'M'
+#define kMagMz1 'Z'
+
+typedef Kernel::UInt32 DosWord;
+typedef Kernel::Long DosLong;
+
+typedef struct _DosHeader
+{
+ Kernel::UInt8 eMagic[2];
+ DosWord eMagLen;
+ DosWord ePagesCount;
+ DosWord eCrlc;
+ DosWord eCParHdr;
+ DosWord eMinAlloc;
+ DosWord eMaxAlloc;
+ DosWord eStackSeg;
+ DosWord eStackPtr;
+ DosWord eChksum;
+ DosWord eIp;
+ DosWord eCs;
+ DosWord eLfarlc;
+ DosWord eOvno;
+ DosWord eRes[4];
+ DosWord eOemid;
+ DosWord eOeminfo;
+ DosWord eRes2[10];
+ DosLong eLfanew;
+} DosHeader, *DosHeaderPtr;
+
+#endif /* ifndef __MSDOS_EXEC__ */
diff --git a/dev/Kernel/KernelKit/PCI/DMA.h b/dev/Kernel/KernelKit/PCI/DMA.h
new file mode 100644
index 00000000..0ad2c344
--- /dev/null
+++ b/dev/Kernel/KernelKit/PCI/DMA.h
@@ -0,0 +1,81 @@
+/* -------------------------------------------
+
+ Copyright (C) 2024, Amlal EL Mahrouss, all rights reserved.
+
+------------------------------------------- */
+
+#pragma once
+
+#include <KernelKit/DeviceMgr.h>
+#include <KernelKit/PCI/Device.h>
+#include <NewKit/Array.h>
+#include <NewKit/OwnPtr.h>
+#include <NewKit/Ref.h>
+
+namespace Kernel
+{
+ enum class DmaKind
+ {
+ PCI, // Bus mastering is required to be turned on. Basiaclly a request
+ // control system. 64-Bit access depends on the PAE bit and the device
+ // (if Double Address Cycle is available)
+ ISA, // Four DMA channels 0-3; 8 bit transfers and only a megabyte of RAM.
+ Invalid,
+ };
+
+ class DMAWrapper final
+ {
+ public:
+ explicit DMAWrapper() = delete;
+
+ public:
+ explicit DMAWrapper(nullPtr) = delete;
+ explicit DMAWrapper(voidPtr Ptr, DmaKind Kind = DmaKind::PCI)
+ : fAddress(Ptr), fKind(Kind)
+ {
+ }
+
+ public:
+ DMAWrapper& operator=(voidPtr Ptr);
+
+ public:
+ DMAWrapper& operator=(const DMAWrapper&) = default;
+ DMAWrapper(const DMAWrapper&) = default;
+
+ public:
+ ~DMAWrapper() = default;
+
+ template <class T>
+ T* operator->();
+
+ template <class T>
+ T* Get(const UIntPtr off = 0);
+
+ public:
+ operator bool();
+ bool operator!();
+
+ public:
+ bool Write(const UIntPtr& bit, const UIntPtr& offset);
+ UIntPtr Read(const UIntPtr& offset);
+ Boolean Check(UIntPtr offset) const;
+
+ public:
+ UIntPtr operator[](const UIntPtr& offset);
+
+ private:
+ voidPtr fAddress{nullptr};
+ DmaKind fKind{DmaKind::Invalid};
+
+ private:
+ friend class DMAFactory;
+ };
+
+ class DMAFactory final
+ {
+ public:
+ static OwnPtr<IOBuf<Char*>> Construct(OwnPtr<DMAWrapper>& dma);
+ };
+} // namespace Kernel
+
+#include <KernelKit/PCI/DMA.inl>
diff --git a/dev/Kernel/KernelKit/PCI/DMA.inl b/dev/Kernel/KernelKit/PCI/DMA.inl
new file mode 100644
index 00000000..49c950a6
--- /dev/null
+++ b/dev/Kernel/KernelKit/PCI/DMA.inl
@@ -0,0 +1,20 @@
+/* -------------------------------------------
+
+ Copyright (C) 2024, Amlal EL Mahrouss, all rights reserved.
+
+------------------------------------------- */
+
+namespace Kernel
+{
+ template <class T>
+ T* DMAWrapper::operator->()
+ {
+ return fAddress;
+ }
+
+ template <class T>
+ T* DMAWrapper::Get(const UIntPtr offset)
+ {
+ return reinterpret_cast<T*>((UIntPtr)fAddress + offset);
+ }
+} // namespace Kernel
diff --git a/dev/Kernel/KernelKit/PCI/Database.h b/dev/Kernel/KernelKit/PCI/Database.h
new file mode 100644
index 00000000..6cf27521
--- /dev/null
+++ b/dev/Kernel/KernelKit/PCI/Database.h
@@ -0,0 +1,38 @@
+/* -------------------------------------------
+
+ Copyright (C) 2024, Amlal EL Mahrouss, all rights reserved.
+
+------------------------------------------- */
+#pragma once
+
+#include <KernelKit/PCI/Device.h>
+#include <NewKit/Defines.h>
+
+namespace Kernel
+{
+ namespace Types
+ {
+ // https://wiki.osdev.org/PCI
+ enum class PciDeviceKind : UChar
+ {
+ MassStorageController = 0x1,
+ NetworkController = 0x2,
+ DisplayController = 0x3,
+ MultimediaController = 0x4,
+ MemoryController = 0x5,
+ Bridge = 0x6,
+ CommunicationController = 0x7,
+ GenericSystemPeripheral = 0x8,
+ InputDeviceController = 0x9,
+ DockingStation = 0xa,
+ Processor = 0xb,
+ SerialBusController = 0xc,
+ WirelessController = 0xd,
+ IntelligentController = 0xe,
+ SatelliteCommunicationsController = 0xf,
+ CoProcessor = 0x40,
+ Unassgined = 0xf,
+ Invalid = Unassgined,
+ };
+ } // namespace Types
+} // namespace Kernel
diff --git a/dev/Kernel/KernelKit/PCI/Device.h b/dev/Kernel/KernelKit/PCI/Device.h
new file mode 100644
index 00000000..75a84308
--- /dev/null
+++ b/dev/Kernel/KernelKit/PCI/Device.h
@@ -0,0 +1,80 @@
+/* -------------------------------------------
+
+ Copyright (C) 2024, Amlal EL Mahrouss, all rights reserved.
+
+------------------------------------------- */
+#pragma once
+
+#include <NewKit/Defines.h>
+
+namespace Kernel::PCI
+{
+ enum class PciConfigKind : UShort
+ {
+ ConfigAddress = 0xCF8,
+ ConfigData = 0xCFC,
+ Invalid = 0xFFF
+ };
+
+ class Device final
+ {
+ public:
+ Device() = default;
+
+ public:
+ explicit Device(UShort bus, UShort device, UShort function, UInt32 bar);
+
+ Device& operator=(const Device&) = default;
+
+ Device(const Device&) = default;
+
+ ~Device();
+
+ public:
+ UInt Read(UInt bar, Size szData);
+ void Write(UInt bar, UIntPtr data, Size szData);
+
+ public:
+ operator bool();
+
+ public:
+ template <typename T>
+ UInt Read(UInt bar)
+ {
+ static_assert(sizeof(T) <= 4, "64-bit PCI addressing is unsupported");
+ return Read(bar, sizeof(T));
+ }
+
+ template <typename T>
+ void Write(UInt bar, UIntPtr data)
+ {
+ static_assert(sizeof(T) <= 4, "64-bit PCI addressing is unsupported");
+ Write(bar, data, sizeof(T));
+ }
+
+ public:
+ UShort DeviceId();
+ UShort VendorId();
+ UShort InterfaceId();
+ UChar Class();
+ UChar Subclass();
+ UChar ProgIf();
+ UChar HeaderType();
+ UIntPtr Bar(UInt32 bar_in);
+
+ public:
+ void EnableMmio(UInt32 bar_in);
+ void BecomeBusMaster(UInt32 bar_in); // for PCI-DMA, PC-DMA does not need that.
+
+ UShort Vendor();
+
+ private:
+ UShort fBus;
+ UShort fDevice;
+ UShort fFunction;
+ UInt32 fBar;
+ };
+} // namespace Kernel::PCI
+
+EXTERN_C void NewOSPCISetCfgTarget(Kernel::UInt bar);
+EXTERN_C Kernel::UInt NewOSPCIReadRaw(Kernel::UInt bar);
diff --git a/dev/Kernel/KernelKit/PCI/Express.h b/dev/Kernel/KernelKit/PCI/Express.h
new file mode 100644
index 00000000..f8b24289
--- /dev/null
+++ b/dev/Kernel/KernelKit/PCI/Express.h
@@ -0,0 +1,11 @@
+/* -------------------------------------------
+
+ Copyright (C) 2024, Amlal EL Mahrouss, all rights reserved.
+
+------------------------------------------- */
+
+#pragma once
+
+#include <NewKit/Defines.h>
+
+#define PCI_EXPRESS_BUS_COUNT (4096)
diff --git a/dev/Kernel/KernelKit/PCI/IO-Impl-AMD64.inl b/dev/Kernel/KernelKit/PCI/IO-Impl-AMD64.inl
new file mode 100644
index 00000000..7eb5b405
--- /dev/null
+++ b/dev/Kernel/KernelKit/PCI/IO-Impl-AMD64.inl
@@ -0,0 +1,54 @@
+/* -------------------------------------------
+
+ Copyright (C) 2024, Amlal EL Mahrouss, all rights reserved.
+
+ File: IO-Impl-AMD64.h
+ Purpose: I/O for AMD64.
+
+ Revision History:
+
+ 30/01/24: Add file. (amlel)
+ 02/02/24: Update I/O routines. (amlel)
+
+------------------------------------------- */
+
+namespace Kernel
+{
+ template <SizeT Sz>
+ template <typename T>
+ T IOArray<Sz>::In(SizeT index)
+ {
+ switch (sizeof(T))
+ {
+#ifdef __ZKA_AMD64__
+ case 4:
+ return HAL::rt_in32(fPorts[index].Leak());
+ case 2:
+ return HAL::rt_in16(fPorts[index].Leak());
+ case 1:
+ return HAL::rt_in8(fPorts[index].Leak());
+#endif
+ default:
+ return 0xFFFF;
+ }
+ }
+
+ template <SizeT Sz>
+ template <typename T>
+ void IOArray<Sz>::Out(SizeT index, T value)
+ {
+ switch (sizeof(T))
+ {
+#ifdef __ZKA_AMD64__
+ case 4:
+ HAL::rt_out32(fPorts[index].Leak(), value);
+ case 2:
+ HAL::rt_out16(fPorts[index].Leak(), value);
+ case 1:
+ HAL::rt_out8(fPorts[index].Leak(), value);
+#endif
+ default:
+ break;
+ }
+ }
+} // namespace Kernel
diff --git a/dev/Kernel/KernelKit/PCI/IO.h b/dev/Kernel/KernelKit/PCI/IO.h
new file mode 100644
index 00000000..b947a739
--- /dev/null
+++ b/dev/Kernel/KernelKit/PCI/IO.h
@@ -0,0 +1,59 @@
+/* -------------------------------------------
+
+ Copyright (C) 2024, Amlal EL Mahrouss, all rights reserved.
+
+------------------------------------------- */
+
+#pragma once
+
+#include <ArchKit/ArchKit.h>
+#include <NewKit/Array.h>
+#include <NewKit/Defines.h>
+#include <NewKit/Ref.h>
+
+namespace Kernel
+{
+ template <SizeT Sz>
+ class IOArray final
+ {
+ public:
+ IOArray() = delete;
+
+ IOArray(nullPtr) = delete;
+
+ explicit IOArray(Array<UShort, Sz>& ports)
+ : fPorts(ports)
+ {
+ }
+ ~IOArray()
+ {
+ }
+
+ IOArray& operator=(const IOArray&) = default;
+
+ IOArray(const IOArray&) = default;
+
+ operator bool()
+ {
+ return !fPorts.Empty();
+ }
+
+ public:
+ template <typename T>
+ T In(SizeT index);
+
+ template <typename T>
+ void Out(SizeT index, T value);
+
+ private:
+ Array<UShort, Sz> fPorts;
+ };
+
+ using IOArray16 = IOArray<16>;
+} // namespace Kernel
+
+#ifdef __x86_64__
+#include <KernelKit/PCI/IO-Impl-AMD64.inl>
+#else
+#error Please provide platform specific code for the I/O
+#endif // ifdef __x86_64__
diff --git a/dev/Kernel/KernelKit/PCI/Iterator.h b/dev/Kernel/KernelKit/PCI/Iterator.h
new file mode 100644
index 00000000..012d5f00
--- /dev/null
+++ b/dev/Kernel/KernelKit/PCI/Iterator.h
@@ -0,0 +1,43 @@
+/* -------------------------------------------
+
+ Copyright (C) 2024, Amlal EL Mahrouss, all rights reserved.
+
+------------------------------------------- */
+
+#ifndef __PCI_ITERATOR_H__
+#define __PCI_ITERATOR_H__
+
+#include <KernelKit/PCI/Database.h>
+#include <KernelKit/PCI/Device.h>
+#include <NewKit/Array.h>
+#include <NewKit/Defines.h>
+#include <NewKit/Ref.h>
+
+#define ZKA_BUS_COUNT (256)
+#define ZKA_DEVICE_COUNT (33)
+#define ZKA_FUNCTION_COUNT (8)
+
+namespace Kernel::PCI
+{
+ class Iterator final
+ {
+ public:
+ Iterator() = delete;
+
+ public:
+ explicit Iterator(const Types::PciDeviceKind& deviceType);
+
+ Iterator& operator=(const Iterator&) = default;
+ Iterator(const Iterator&) = default;
+
+ ~Iterator();
+
+ public:
+ Ref<PCI::Device> operator[](const Size& sz);
+
+ private:
+ Array<PCI::Device, ZKA_BUS_COUNT> fDevices;
+ };
+} // namespace Kernel::PCI
+
+#endif // __PCI_ITERATOR_H__
diff --git a/dev/Kernel/KernelKit/PCI/PCI.h b/dev/Kernel/KernelKit/PCI/PCI.h
new file mode 100644
index 00000000..230ec6c6
--- /dev/null
+++ b/dev/Kernel/KernelKit/PCI/PCI.h
@@ -0,0 +1,59 @@
+/* -------------------------------------------
+
+ Copyright (C) 2024, Amlal EL Mahrouss, all rights reserved.
+
+------------------------------------------- */
+
+#pragma once
+
+#include <NewKit/Defines.h>
+
+#define cPCIConfigAddressPort (0xCF8)
+#define cPCIConfigDataPort (0xCFC)
+
+#define cPCIDeviceCount (32)
+#define cPCIFuncCount (8)
+#define cPCIBusCount (255)
+
+namespace Kernel::PCI
+{
+ // model
+ struct DeviceHeader
+ {
+ UInt16 VendorId;
+ UInt16 DeviceId;
+ UInt8 Command;
+ UInt8 Status;
+ UInt8 RevisionId;
+ UInt8 ProgIf;
+ UInt8 SubClass;
+ UInt8 Class;
+ UInt8 CacheLineSz;
+ UInt8 LatencyTimer;
+ UInt8 HeaderType;
+ UInt8 Bist;
+ UInt8 Bus;
+ UInt8 Device;
+ UInt8 Function;
+ };
+
+ namespace Detail
+ {
+ class BAR
+ {
+ public:
+ UIntPtr BAR;
+ SizeT Size;
+ };
+ } // namespace Detail
+
+ class BAR
+ {
+ public:
+ Detail::BAR BAR1;
+ Detail::BAR BAR2;
+ Detail::BAR BAR3;
+ Detail::BAR BAR4;
+ Detail::BAR BAR5;
+ };
+} // namespace Kernel::PCI
diff --git a/dev/Kernel/KernelKit/PE.h b/dev/Kernel/KernelKit/PE.h
new file mode 100644
index 00000000..90406a5d
--- /dev/null
+++ b/dev/Kernel/KernelKit/PE.h
@@ -0,0 +1,143 @@
+/* -------------------------------------------
+
+ Copyright (C) 2024, Amlal EL Mahrouss, all rights reserved.
+
+ File: PE.h
+ Purpose: Portable Executable for Kernel.
+
+ Revision History:
+
+ 30/01/24: Added file (amlel)
+
+------------------------------------------- */
+
+#ifndef __KERNELKIT_INC_PE_H__
+#define __KERNELKIT_INC_PE_H__
+
+#include <NewKit/Defines.h>
+
+#define kPeSignature 0x00004550
+
+#define kPeDLLBase 0x4000000
+#define kPeEXEBase 0x1000000
+
+#define kPeMagic32 0x010b
+#define kPeMagic64 0x020b
+
+#define kPeMachineAMD64 0x8664
+#define kPeMachineARM64 0xaa64
+
+typedef struct LDR_EXEC_HEADER final
+{
+ Kernel::UInt32 mSignature;
+ Kernel::UInt16 mMachine;
+ Kernel::UInt16 mNumberOfSections;
+ Kernel::UInt32 mTimeDateStamp;
+ Kernel::UInt32 mPointerToSymbolTable;
+ Kernel::UInt32 mNumberOfSymbols;
+ Kernel::UInt16 mSizeOfOptionalHeader;
+ Kernel::UInt16 mCharacteristics;
+} LDR_EXEC_HEADER, *LDR_EXEC_HEADER_PTR;
+
+typedef struct LDR_OPTIONAL_HEADER final
+{
+ Kernel::UInt16 mMagic; // 0x010b - PE32, 0x020b - PE32+ (64 bit)
+ Kernel::UInt8 mMajorLinkerVersion;
+ Kernel::UInt8 mMinorLinkerVersion;
+ Kernel::UInt32 mSizeOfCode;
+ Kernel::UInt32 mSizeOfInitializedData;
+ Kernel::UInt32 mSizeOfUninitializedData;
+ Kernel::UInt32 mAddressOfEntryPoint;
+ Kernel::UInt32 mBaseOfCode;
+ Kernel::UInt32 mBaseOfData;
+ Kernel::UInt32 mImageBase;
+ Kernel::UInt32 mSectionAlignment;
+ Kernel::UInt32 mFileAlignment;
+ Kernel::UInt16 mMajorOperatingSystemVersion;
+ Kernel::UInt16 mMinorOperatingSystemVersion;
+ Kernel::UInt16 mMajorImageVersion;
+ Kernel::UInt16 mMinorImageVersion;
+ Kernel::UInt16 mMajorSubsystemVersion;
+ Kernel::UInt16 mMinorSubsystemVersion;
+ Kernel::UInt32 mWin32VersionValue;
+ Kernel::UInt32 mSizeOfImage;
+ Kernel::UInt32 mSizeOfHeaders;
+ Kernel::UInt32 mCheckSum;
+ Kernel::UInt16 mSubsystem;
+ Kernel::UInt16 mDllCharacteristics;
+ Kernel::UInt32 mSizeOfStackReserve;
+ Kernel::UInt32 mSizeOfStackCommit;
+ Kernel::UInt32 mSizeOfHeapReserve;
+ Kernel::UInt32 mSizeOfHeapCommit;
+ Kernel::UInt32 mLoaderFlags;
+ Kernel::UInt32 mNumberOfRvaAndSizes;
+} LDR_OPTIONAL_HEADER, *LDR_OPTIONAL_HEADER_PTR;
+
+typedef struct LDR_SECTION_HEADER final
+{
+ Kernel::Char mName[8];
+ Kernel::UInt32 mVirtualSize;
+ Kernel::UInt32 mVirtualAddress;
+ Kernel::UInt32 mSizeOfRawData;
+ Kernel::UInt32 mPointerToRawData;
+ Kernel::UInt32 mPointerToRelocations;
+ Kernel::UInt32 mPointerToLineNumbers;
+ Kernel::UInt16 mNumberOfRelocations;
+ Kernel::UInt16 mNumberOfLinenumbers;
+ Kernel::UInt32 mCharacteristics;
+} LDR_SECTION_HEADER, *LDR_SECTION_HEADER_PTR;
+
+enum kExecDataDirParams
+{
+ kExecExport,
+ kExecImport,
+ kExecInvalid,
+ kExecCount,
+};
+
+typedef struct LDR_EXPORT_DIRECTORY
+{
+ Kernel::UInt32 mCharacteristics;
+ Kernel::UInt32 mTimeDateStamp;
+ Kernel::UInt16 mMajorVersion;
+ Kernel::UInt16 mMinorVersion;
+ Kernel::UInt32 mName;
+ Kernel::UInt32 mBase;
+ Kernel::UInt32 mNumberOfFunctions;
+ Kernel::UInt32 mNumberOfNames;
+ Kernel::UInt32 mAddressOfFunctions; // export table rva
+ Kernel::UInt32 mAddressOfNames;
+ Kernel::UInt32 mAddressOfNameOrdinal; // ordinal table rva
+} LDR_EXPORT_DIRECTORY, *LDR_EXPORT_DIRECTORY_PTR;
+
+typedef struct LDR_IMPORT_DIRECTORY
+{
+ union {
+ Kernel::UInt32 mCharacteristics;
+ Kernel::UInt32 mOriginalFirstThunk;
+ };
+ Kernel::UInt32 mTimeDateStamp;
+ Kernel::UInt32 mForwarderChain;
+ Kernel::UInt32 mNameRva;
+ Kernel::UInt32 mThunkTableRva;
+} LDR_IMPORT_DIRECTORY, *LDR_IMPORT_DIRECTORY_PTR;
+
+typedef struct LDR_DATA_DIRECTORY
+{
+ Kernel::UInt32 VirtualAddress;
+ Kernel::UInt32 Size;
+} LDR_DATA_DIRECTORY, *LDR_DATA_DIRECTORY_PTR;
+
+typedef struct LDR_IMAGE_HEADER
+{
+ LDR_EXEC_HEADER mHeader;
+ LDR_OPTIONAL_HEADER mOptHdr;
+} LDR_IMAGE_HEADER, *LDR_IMAGE_HEADER_PTR;
+
+enum
+{
+ eUserSection = 0x00000020,
+ cPEResourceId = 0xFFaadd00,
+};
+
+#endif /* ifndef __KERNELKIT_INC_PE_H__ */
diff --git a/dev/Kernel/KernelKit/PECodeMgr.h b/dev/Kernel/KernelKit/PECodeMgr.h
new file mode 100644
index 00000000..f0f1b719
--- /dev/null
+++ b/dev/Kernel/KernelKit/PECodeMgr.h
@@ -0,0 +1,24 @@
+/* -------------------------------------------
+
+ Copyright (C) 2024, Amlal EL Mahrouss, all rights reserved.
+
+ File: PECodeMgr.h
+ Purpose: PE32+ Code Mgr and DLL mgr.
+
+ Revision History:
+
+ 12/02/24: Added file (amlel)
+
+------------------------------------------- */
+
+#pragma once
+
+////////////////////////////////////////////////////
+
+// LAST REV: Mon Feb 12 13:52:01 CET 2024
+
+////////////////////////////////////////////////////
+
+#include <KernelKit/PE.h>
+#include <NewKit/ErrorOr.h>
+#include <NewKit/KString.h>
diff --git a/dev/Kernel/KernelKit/PEF.h b/dev/Kernel/KernelKit/PEF.h
new file mode 100644
index 00000000..79d237fe
--- /dev/null
+++ b/dev/Kernel/KernelKit/PEF.h
@@ -0,0 +1,117 @@
+/* -------------------------------------------
+
+ Copyright (C) 2024, Amlal EL Mahrouss, all rights reserved.
+
+ File: PEF.h
+ Purpose: Preferred Executable Format for Kernel.
+
+ Revision History:
+
+ ?/?/23: Added file (amlel)
+
+------------------------------------------- */
+
+#ifndef KERNELKIT_PEF_H
+#define KERNELKIT_PEF_H
+
+#include <CompilerKit/CompilerKit.h>
+#include <KernelKit/LoaderInterface.h>
+#include <NewKit/Defines.h>
+
+#define kPefMagic "Joy!"
+#define kPefMagicFat "yoJ!"
+
+#define kPefMagicLen 5
+
+#define kPefVersion 3
+#define kPefNameLen 255
+
+/* not mandatory, only for non fork based filesystems. */
+#define kPefExt ".o"
+#define kPefDylibExt ".dylib"
+#define kPefLibExt ".lib"
+#define kPefObjectExt ".obj"
+#define kPefDebugExt ".dbg"
+#define kPefDriverExt ".sys"
+
+// Kernel System Binary Interface.
+#define kPefAbi (0x5046)
+
+#define kPefBaseOrigin (0x40000000)
+
+#define kPefStart "__ImageStart"
+
+#define kPefForkKind kPefMagic
+#define kPefForkKindFAT kPefMagicFat
+
+namespace Kernel
+{
+ enum
+ {
+ kPefArchIntel86S,
+ kPefArchAMD64,
+ kPefArchRISCV,
+ kPefArch64x0, /* 64x0. ISA */
+ kPefArch32x0, /* 32x0. ISA */
+ kPefArchPowerPC,
+ kPefArchARM64,
+ kPefArchCount = (kPefArchPowerPC - kPefArchIntel86S) + 1,
+ kPefArchInvalid = 0xFF,
+ };
+
+ enum
+ {
+ kPefSubArchAMD,
+ kPefSubArchIntel,
+ kPefSubArchARM,
+ kPefSubArchGeneric,
+ kPefSubArchIBM,
+ };
+
+ enum
+ {
+ kPefKindExec = 1, /* .o */
+ kPefKindDylib = 2, /* .dylib */
+ kPefKindObject = 4, /* .obj */
+ kPefKindDebug = 5, /* .dbg */
+ kPefKindDriver = 6,
+ kPefKindCount,
+ };
+
+ typedef struct PEFContainer final
+ {
+ Char Magic[kPefMagicLen];
+ UInt32 Linker;
+ UInt32 Version;
+ UInt32 Kind;
+ UInt32 Abi;
+ UInt32 Cpu;
+ UInt32 SubCpu; /* Cpu specific information */
+ UIntPtr Start;
+ SizeT HdrSz; /* Size of header */
+ SizeT Count; /* container header count */
+ } PACKED PEFContainer;
+
+ /* First PEFCommandHeader starts after PEFContainer */
+
+ typedef struct PEFCommandHeader final
+ {
+ Char Name[kPefNameLen]; /* container name */
+ UInt32 Cpu; /* container cpu */
+ UInt32 SubCpu; /* container sub-cpu */
+ UInt32 Flags; /* container flags */
+ UInt16 Kind; /* container kind */
+ UIntPtr Offset; /* content offset */
+ SizeT Size; /* content Size */
+ } PACKED PEFCommandHeader;
+
+ enum
+ {
+ kPefCode = 0xC,
+ kPefData = 0xD,
+ kPefZero = 0xE,
+ kPefLinkerID = 0x1,
+ };
+} // namespace Kernel
+
+#endif /* ifndef KERNELKIT_PEF_H */
diff --git a/dev/Kernel/KernelKit/PEFCodeMgr.h b/dev/Kernel/KernelKit/PEFCodeMgr.h
new file mode 100644
index 00000000..25fb7f9b
--- /dev/null
+++ b/dev/Kernel/KernelKit/PEFCodeMgr.h
@@ -0,0 +1,72 @@
+/* -------------------------------------------
+
+ Copyright (C) 2024, Amlal EL Mahrouss, all rights reserved.
+
+------------------------------------------- */
+
+#ifndef _INC_CODE_MANAGER_PEF_H_
+#define _INC_CODE_MANAGER_PEF_H_
+
+#include <KernelKit/PEF.h>
+#include <NewKit/ErrorOr.h>
+#include <NewKit/KString.h>
+#include <KernelKit/FileMgr.h>
+
+#ifndef INC_PROCESS_SCHEDULER_H
+#include <KernelKit/UserProcessScheduler.h>
+#endif
+
+#define kPefApplicationMime "application/vnd-zka-executable"
+
+namespace Kernel
+{
+ ///
+ /// \name PEFLoader
+ /// \brief PEF loader class.
+ ///
+ class PEFLoader : public LoaderInterface
+ {
+ private:
+ explicit PEFLoader() = delete;
+
+ public:
+ explicit PEFLoader(const VoidPtr blob);
+ explicit PEFLoader(const Char* path);
+ ~PEFLoader() override;
+
+ public:
+ ZKA_COPY_DEFAULT(PEFLoader);
+
+ public:
+ const Char* Path() override;
+ const Char* AsString() override;
+ const Char* MIME() override;
+
+ public:
+ ErrorOr<VoidPtr> FindStart() override;
+ VoidPtr FindSymbol(const Char* name, Int32 kind) override;
+ ErrorOr<VoidPtr> GetBlob() override;
+
+ public:
+ bool IsLoaded() noexcept;
+
+ private:
+#ifdef __FSKIT_INCLUDES_NEFS__
+ OwnPtr<FileStream<Char, NeFileSystemMgr>> fFile;
+#else
+ OwnPtr<FileStream<Char>> fFile;
+#endif // __FSKIT_INCLUDES_NEFS__
+
+ Ref<KString> fPath;
+ VoidPtr fCachedBlob;
+ bool fFatBinary;
+ bool fBad;
+ };
+
+ namespace Utils
+ {
+ ProcessID rtl_create_process(PEFLoader& exec, const Int32& procKind) noexcept;
+ } // namespace Utils
+} // namespace Kernel
+
+#endif // ifndef _INC_CODE_MANAGER_PEF_H_
diff --git a/dev/Kernel/KernelKit/Semaphore.h b/dev/Kernel/KernelKit/Semaphore.h
new file mode 100644
index 00000000..7d149027
--- /dev/null
+++ b/dev/Kernel/KernelKit/Semaphore.h
@@ -0,0 +1,43 @@
+/* -------------------------------------------
+
+ Copyright (C) 2024, Amlal EL Mahrouss, all rights reserved.
+
+------------------------------------------- */
+
+#pragma once
+
+#include <NewKit/Defines.h>
+#include <KernelKit/Timer.h>
+#include <CompilerKit/CompilerKit.h>
+
+namespace Kernel
+{
+ class UserProcess;
+
+ typedef UserProcess& UserProcessRef;
+
+ /// @brief Access control class, which locks a task until one is done.
+ class Semaphore final
+ {
+ public:
+ explicit Semaphore() = default;
+ ~Semaphore() = default;
+
+ public:
+ bool IsLocked() const;
+ bool Unlock() noexcept;
+
+ public:
+ void WaitForProcess() noexcept;
+
+ public:
+ bool Lock(UserProcess& process);
+ bool LockOrWait(UserProcess& process, TimerInterface* timer);
+
+ public:
+ ZKA_COPY_DEFAULT(Semaphore);
+
+ private:
+ UserProcessRef fLockingProcess;
+ };
+} // namespace Kernel
diff --git a/dev/Kernel/KernelKit/ThreadLocalStorage.h b/dev/Kernel/KernelKit/ThreadLocalStorage.h
new file mode 100644
index 00000000..bce26b26
--- /dev/null
+++ b/dev/Kernel/KernelKit/ThreadLocalStorage.h
@@ -0,0 +1,69 @@
+/* -------------------------------------------
+
+ Copyright (C) 2024, Amlal EL Mahrouss, all rights reserved.
+
+------------------------------------------- */
+
+#ifndef KERNELKIT_TLS_H
+#define KERNELKIT_TLS_H
+
+#include <NewKit/Defines.h>
+#include <NewKit/ErrorOr.h>
+
+///! @brief Thread Local Storage for minoskrnl.
+
+#define kCookieMag0Idx 0
+#define kCookieMag1Idx 1
+#define kCookieMag2Idx 2
+
+#define kCookieMag0 'Z'
+#define kCookieMag1 'K'
+#define kCookieMag2 'A'
+
+#define kTLSCookieLen (3U)
+
+struct THREAD_INFORMATION_BLOCK;
+
+/// @brief Thread Information Block.
+/// Located in GS on AMD64, other architectures have their own stuff. (64x0, 32x0, ARM64)
+struct PACKED THREAD_INFORMATION_BLOCK final
+{
+ Kernel::Char Cookie[kTLSCookieLen]{0}; //! Thread magic number.
+ Kernel::VoidPtr Record{nullptr}; //! Thread information record.
+};
+
+///! @brief Cookie Sanity check.
+Kernel::Boolean tls_check_tib(THREAD_INFORMATION_BLOCK* the_tib);
+
+///! @brief new ptr syscall.
+template <typename T>
+T* tls_new_ptr(void) noexcept;
+
+///! @brief delete ptr syscall.
+template <typename T>
+Kernel::Boolean tls_delete_ptr(T* ptr) noexcept;
+
+//! @brief Delete process pointer.
+//! @param obj The pointer to delete.
+template <typename T>
+inline Kernel::Bool tls_delete_ptr(Kernel::ErrorOr<T> obj) noexcept;
+
+//! @brief Delete process pointer.
+//! @param obj The pointer to delete.
+template <typename T>
+inline Kernel::Bool tls_delete_ptr(Kernel::ErrorOr<T*> obj) noexcept;
+
+template <typename T, typename... Args>
+T* tls_new_class(Args&&... args);
+
+/// @brief TLS install TIB and PIB. (syscall)
+EXTERN_C Kernel::Void rt_install_tib(THREAD_INFORMATION_BLOCK* TIB, THREAD_INFORMATION_BLOCK* PIB);
+
+/// @brief TLS check (syscall)
+EXTERN_C Kernel::Bool tls_check_syscall_impl(Kernel::VoidPtr TIB) noexcept;
+
+#include <KernelKit/ThreadLocalStorage.inl>
+
+// last rev 7/7/24
+
+#endif /* ifndef KERNELKIT_TLS_H */
diff --git a/dev/Kernel/KernelKit/ThreadLocalStorage.inl b/dev/Kernel/KernelKit/ThreadLocalStorage.inl
new file mode 100644
index 00000000..6573209a
--- /dev/null
+++ b/dev/Kernel/KernelKit/ThreadLocalStorage.inl
@@ -0,0 +1,99 @@
+/* -------------------------------------------
+
+ Copyright (C) 2024, Amlal EL Mahrouss, all rights reserved.
+
+------------------------------------------- */
+
+//! @file ThreadLocalStorage.inl
+//! @brief Allocate resources from the process's heap storage.
+
+#ifndef INC_PROCESS_SCHEDULER_H
+#include <KernelKit/UserProcessScheduler.h>
+#endif
+
+template <typename T>
+inline T* tls_new_ptr(void) noexcept
+{
+ using namespace Kernel;
+
+ auto ref_process = UserProcessScheduler::The().GetCurrentProcess();
+ MUST_PASS(ref_process);
+
+ auto pointer = ref_process.Leak().New(sizeof(T));
+
+ if (pointer.Error())
+ return nullptr;
+
+ return reinterpret_cast<T*>(pointer.Leak().Leak());
+}
+
+//! @brief Delete process pointer.
+//! @param obj The pointer to delete.
+template <typename T>
+inline Kernel::Bool tls_delete_ptr(T* obj) noexcept
+{
+ using namespace Kernel;
+
+ if (!obj)
+ return No;
+
+ auto ref_process = UserProcessScheduler::The().GetCurrentProcess();
+ MUST_PASS(ref_process);
+
+ ErrorOr<T*> obj_wrapped{obj};
+
+ return ref_process.Leak().Delete(obj_wrapped, sizeof(T));
+}
+
+//! @brief Delete process pointer.
+//! @param obj The pointer to delete.
+template <typename T>
+inline Kernel::Bool tls_delete_ptr(Kernel::ErrorOr<T> obj) noexcept
+{
+ return tls_delete_ptr(obj.Leak());
+}
+
+//! @brief Delete process pointer.
+//! @param obj The pointer to delete.
+template <typename T>
+inline Kernel::Bool tls_delete_ptr(Kernel::ErrorOr<T*> obj) noexcept
+{
+ return tls_delete_ptr(obj->Leak());
+}
+
+/// @brief Allocate a C++ class, and then call the constructor of it.
+/// @tparam T class type.
+/// @tparam ...Args varg class type.
+/// @param args arguments list.
+/// @return Class instance.
+template <typename T, typename... Args>
+T* tls_new_class(Args&&... args)
+{
+ using namespace Kernel;
+
+ T* obj = tls_new_ptr<T>();
+
+ if (obj)
+ {
+ *obj = T(forward(args)...);
+ return obj;
+ }
+
+ return nullptr;
+}
+
+/// @brief Delete a C++ class (call constructor first.)
+/// @tparam T
+/// @param obj
+/// @return
+template <typename T>
+inline Kernel::Bool tls_delete_class(T* obj)
+{
+ using namespace Kernel;
+
+ if (!obj)
+ return No;
+
+ obj->~T();
+ return tls_delete_ptr(obj);
+}
diff --git a/dev/Kernel/KernelKit/Timer.h b/dev/Kernel/KernelKit/Timer.h
new file mode 100644
index 00000000..2fa2dfa6
--- /dev/null
+++ b/dev/Kernel/KernelKit/Timer.h
@@ -0,0 +1,81 @@
+/* -------------------------------------------
+
+ Copyright (C) 2024, Amlal EL Mahrouss, all rights reserved.
+
+------------------------------------------- */
+
+#pragma once
+
+#include <ArchKit/ArchKit.h>
+#include <KernelKit/LPC.h>
+
+namespace Kernel
+{
+ class SoftwareTimer;
+ class TimerInterface;
+
+ class TimerInterface
+ {
+ public:
+ /// @brief Default constructor
+ explicit TimerInterface() = default;
+ virtual ~TimerInterface() = default;
+
+ public:
+ ZKA_COPY_DEFAULT(TimerInterface);
+
+ public:
+ virtual BOOL Wait() noexcept;
+ };
+
+ class SoftwareTimer final : public TimerInterface
+ {
+ public:
+ explicit SoftwareTimer(Int64 seconds);
+ ~SoftwareTimer() override;
+
+ public:
+ ZKA_COPY_DEFAULT(SoftwareTimer);
+
+ public:
+ BOOL Wait() noexcept override;
+
+ private:
+ IntPtr* fDigitalTimer{nullptr};
+ Int64 fWaitFor{0};
+ };
+
+ class HardwareTimer final : public TimerInterface
+ {
+ public:
+ explicit HardwareTimer(Int64 seconds);
+ ~HardwareTimer() override;
+
+ public:
+ ZKA_COPY_DEFAULT(HardwareTimer);
+
+ public:
+ BOOL Wait() noexcept override;
+
+ private:
+ IntPtr* fDigitalTimer{nullptr};
+ Int64 fWaitFor{0};
+ };
+
+ inline Int64 Milliseconds(Int64 time)
+ {
+ if (time < 0)
+ return 0;
+
+ // TODO: nanoseconds maybe?
+ return 1000 * 1000 * time;
+ }
+
+ inline Int64 Seconds(Int64 time)
+ {
+ if (time < 0)
+ return 0;
+
+ return 1000 * Milliseconds(time);
+ }
+} // namespace Kernel
diff --git a/dev/Kernel/KernelKit/User.h b/dev/Kernel/KernelKit/User.h
new file mode 100644
index 00000000..2fb832d4
--- /dev/null
+++ b/dev/Kernel/KernelKit/User.h
@@ -0,0 +1,86 @@
+/* -------------------------------------------
+
+ Copyright (C) 2024, Amlal EL Mahrouss, all rights reserved.
+
+------------------------------------------- */
+
+#ifndef INC_USER_H
+#define INC_USER_H
+
+#include <CompilerKit/CompilerKit.h>
+#include <KernelKit/LPC.h>
+#include <NewKit/KString.h>
+#include <NewKit/Defines.h>
+
+///! We got the Super, standard user (%s format) and guest user,
+///! all are used to make authorization operations on the OS.
+#define kSuperUser "OS AUTHORITY/SUPER/%s"
+#define kGuestUser "OS AUTHORITY/GUEST/%s"
+#define kFmtUser "OS AUTHORITY/STD/%s"
+
+#define kUsersDir "/usr/"
+
+#define kMaxUserNameLen (255U)
+#define kMaxUserTokenLen (255U)
+
+namespace Kernel
+{
+ class User;
+
+ enum class UserRingKind
+ {
+ kRingInvalid = 0,
+ kRingStdUser = 1,
+ kRingSuperUser = 2,
+ kRingGuestUser = 5,
+ kRingCount = 3,
+ };
+
+ typedef Char* UserPublicKey;
+
+ /// @brief User class.
+ class User final
+ {
+ public:
+ explicit User() = delete;
+
+ User(const Int32& sel, const Char* username);
+ User(const UserRingKind& kind, const Char* username);
+
+ ~User();
+
+ public:
+ ZKA_COPY_DEFAULT(User);
+
+ public:
+ bool operator==(const User& lhs);
+ bool operator!=(const User& lhs);
+
+ public:
+ /// @brief Get software ring
+ const UserRingKind& Ring() noexcept;
+
+ /// @brief Get user name
+ Char* Name() noexcept;
+
+ /// @brief Is he a standard user?
+ Bool IsStdUser() noexcept;
+
+ /// @brief Is she a super user?
+ Bool IsSuperUser() noexcept;
+
+ /// @brief Saves a password from the public key.
+ Bool Save(const UserPublicKey password) noexcept;
+
+ /// @brief Checks if a password matches the **password**.
+ /// @param password the password to check.
+ Bool Matches(const UserPublicKey password) noexcept;
+
+ private:
+ UserRingKind mUserRing{UserRingKind::kRingStdUser};
+ Char mUserName[kMaxUserNameLen] = {0};
+ Char mUserKey[kMaxUserTokenLen] = {0};
+ };
+} // namespace Kernel
+
+#endif /* ifndef INC_USER_H */
diff --git a/dev/Kernel/KernelKit/UserProcessScheduler.h b/dev/Kernel/KernelKit/UserProcessScheduler.h
new file mode 100644
index 00000000..0682a9cd
--- /dev/null
+++ b/dev/Kernel/KernelKit/UserProcessScheduler.h
@@ -0,0 +1,341 @@
+/* -------------------------------------------
+
+ Copyright (C) 2024, Amlal EL Mahrouss, all rights reserved.
+
+------------------------------------------- */
+
+#ifndef INC_PROCESS_SCHEDULER_H
+#define INC_PROCESS_SCHEDULER_H
+
+#include <ArchKit/ArchKit.h>
+#include <KernelKit/LockDelegate.h>
+#include <KernelKit/User.h>
+#include <NewKit/MutableArray.h>
+
+#define kSchedMinMicroTime (AffinityKind::kStandard)
+#define kSchedInvalidPID (-1)
+#define kSchedProcessLimitPerTeam (32U)
+
+#define kSchedMaxMemoryLimit gib_cast(128)
+#define kSchedMaxStackSz mib_cast(8)
+
+#define kProcessInvalidID (-1)
+#define kProcessNameLen (128U)
+
+////////////////////////////////////////////////////
+// The current date is: Thu 11/28/2024 //
+////////////////////////////////////////////////////
+
+namespace Kernel
+{
+ //! @note Forward class declarations.
+
+ class IDylibObject;
+ class UserProcess;
+ class UserProcessTeam;
+ class UserProcessScheduler;
+ class UserProcessHelper;
+
+ //! @brief Local Process identifier.
+ typedef Int64 ProcessID;
+
+ //! @brief Local Process status enum.
+ enum class ProcessStatusKind : Int32
+ {
+ kInvalid,
+ kStarting,
+ kRunning,
+ kKilled,
+ kFrozen,
+ kFinished,
+ kCount,
+ };
+
+ //! @brief Affinity is the amount of nano-seconds this process is going
+ //! to run.
+ enum class AffinityKind : Int32
+ {
+ kRealTime = 500,
+ kVeryHigh = 250,
+ kHigh = 200,
+ kStandard = 1000,
+ kLowUsage = 1500,
+ kVeryLowUsage = 2000,
+ };
+
+ // operator overloading.
+
+ inline bool operator<(AffinityKind lhs, AffinityKind rhs)
+ {
+ Int32 lhs_int = static_cast<Int>(lhs);
+ Int32 rhs_int = static_cast<Int>(rhs);
+
+ return lhs_int < rhs_int;
+ }
+
+ inline bool operator>(AffinityKind lhs, AffinityKind rhs)
+ {
+ Int32 lhs_int = static_cast<Int>(lhs);
+ Int32 rhs_int = static_cast<Int>(rhs);
+
+ return lhs_int > rhs_int;
+ }
+
+ inline bool operator<=(AffinityKind lhs, AffinityKind rhs)
+ {
+ Int32 lhs_int = static_cast<Int>(lhs);
+ Int32 rhs_int = static_cast<Int>(rhs);
+
+ return lhs_int <= rhs_int;
+ }
+
+ inline bool operator>=(AffinityKind lhs, AffinityKind rhs)
+ {
+ Int32 lhs_int = static_cast<Int>(lhs);
+ Int32 rhs_int = static_cast<Int>(rhs);
+
+ return lhs_int >= rhs_int;
+ }
+
+ // end of operator overloading.
+
+ enum class ProcessSubsystem : Int32
+ {
+ kProcessSubsystemSecurity = 100,
+ kProcessSubsystemApplication,
+ kProcessSubsystemService,
+ kProcessSubsystemDriver,
+ kProcessSubsystemInvalid = 255,
+ kProcessSubsystemCount = 4,
+ };
+
+ using ProcessTime = UInt64;
+ using PID = Int64;
+
+ // for permission manager, tells where we run the code.
+ enum class ProcessLevelRing : Int32
+ {
+ kRingStdUser = 1,
+ kRingSuperUser = 2,
+ kRingGuestUser = 5,
+ kRingCount = 5,
+ };
+
+ /// @brief Helper type to describe a code image.
+ using ImagePtr = VoidPtr;
+
+ struct UserProcessImage final
+ {
+ explicit UserProcessImage() = default;
+
+ ImagePtr fCode;
+ ImagePtr fBlob;
+
+ Bool HasCode()
+ {
+ return this->fCode != nullptr;
+ }
+
+ Bool HasImage()
+ {
+ return this->fBlob != nullptr;
+ }
+ };
+
+ /// @name UserProcess
+ /// @brief User process class, holds information about the running process/thread.
+ class UserProcess final
+ {
+ public:
+ explicit UserProcess();
+ ~UserProcess();
+
+ public:
+ ZKA_COPY_DEFAULT(UserProcess);
+
+ public:
+ Char Name[kProcessNameLen] = {"Process"};
+ ProcessSubsystem SubSystem{ProcessSubsystem::kProcessSubsystemInvalid};
+ User* Owner{nullptr};
+ HAL::StackFramePtr StackFrame{nullptr};
+ AffinityKind Affinity{AffinityKind::kStandard};
+ ProcessStatusKind Status{ProcessStatusKind::kFinished};
+ UInt8* StackReserve{nullptr};
+ UserProcessImage Image{};
+ SizeT StackSize{kSchedMaxStackSz};
+ IDylibObject* DylibDelegate{nullptr};
+ SizeT MemoryCursor{0UL};
+ SizeT MemoryLimit{kSchedMaxMemoryLimit};
+ SizeT UsedMemory{0UL};
+
+ struct ProcessMemoryHeapList final
+ {
+ VoidPtr MemoryEntry{nullptr};
+ SizeT MemoryEntrySize{0UL};
+ SizeT MemoryEntryPad{0UL};
+
+ struct ProcessMemoryHeapList* MemoryPrev{nullptr};
+ struct ProcessMemoryHeapList* MemoryNext{nullptr};
+ };
+
+ struct UserProcessSignal final
+ {
+ UIntPtr SignalIP;
+ ProcessStatusKind PreviousStatus;
+ UIntPtr SignalID;
+ };
+
+ UserProcessSignal ProcessSignal;
+ ProcessMemoryHeapList* ProcessMemoryHeap{nullptr};
+ UserProcessTeam* ProcessParentTeam;
+
+ VoidPtr VMRegister{0UL};
+
+ enum
+ {
+ kInvalidExecutableKind,
+ kExectuableKind,
+ kExectuableDylibKind,
+ kExectuableKindCount,
+ };
+
+ ProcessTime PTime{0}; //! @brief Process allocated tine.
+
+ PID ProcessId{kSchedInvalidPID};
+ Int32 Kind{kExectuableKind};
+
+ public:
+ //! @brief boolean operator, check status.
+ operator bool();
+
+ ///! @brief Crashes the app, exits with code ~0.
+ Void Crash();
+
+ ///! @brief Exits the app.
+ Void Exit(const Int32& exit_code = 0);
+
+ ///! @brief TLS allocate.
+ ///! @param sz size of new ptr.
+ ErrorOr<VoidPtr> New(const SizeT& sz, const SizeT& pad_amount = 0);
+
+ ///! @brief TLS free.
+ ///! @param ptr the pointer to free.
+ ///! @param sz the size of it.
+ template <typename T>
+ Boolean Delete(ErrorOr<T*> ptr, const SizeT& sz);
+
+ ///! @brief Wakes up threads.
+ Void Wake(const Bool wakeup = false);
+
+ public:
+ //! @brief Gets the local exit code.
+ const UInt32& GetExitCode() noexcept;
+
+ ///! @brief Get the process's name
+ ///! @example 'C Runtime Library'
+ const Char* GetName() noexcept;
+
+ //! @brief return local error code of process.
+ //! @return Int32 local error code.
+ Int32& GetLocalCode() noexcept;
+
+ const User* GetOwner() noexcept;
+ const ProcessStatusKind& GetStatus() noexcept;
+ const AffinityKind& GetAffinity() noexcept;
+
+ private:
+ UInt32 fLastExitCode{0};
+ Int32 fLocalCode{0};
+
+ friend UserProcessScheduler;
+ friend UserProcessHelper;
+ };
+
+ /// \brief Processs Team (contains multiple processes inside it.)
+ /// Equivalent to a process batch
+ class UserProcessTeam final
+ {
+ public:
+ explicit UserProcessTeam();
+ ~UserProcessTeam() = default;
+
+ ZKA_COPY_DEFAULT(UserProcessTeam);
+
+ Array<UserProcess, kSchedProcessLimitPerTeam>& AsArray();
+ Ref<UserProcess>& AsRef();
+ ProcessID& Id() noexcept;
+
+ public:
+ Array<UserProcess, kSchedProcessLimitPerTeam> mProcessList;
+ Ref<UserProcess> mCurrentProcess;
+ ProcessID mTeamId{0};
+ ProcessID mProcessCount{0};
+ };
+
+ typedef Array<UserProcess, kSchedProcessLimitPerTeam> UserThreadArray;
+
+ using UserProcessRef = UserProcess&;
+
+ /// @brief Process scheduler class.
+ /// The main class which you call to schedule user processes.
+ class UserProcessScheduler final : public ISchedulable
+ {
+ friend class UserProcessHelper;
+
+ public:
+ explicit UserProcessScheduler() = default;
+ ~UserProcessScheduler() override = default;
+
+ ZKA_COPY_DEFAULT(UserProcessScheduler)
+
+ operator bool();
+ bool operator!();
+
+ public:
+ UserProcessTeam& CurrentTeam();
+
+ public:
+ ProcessID Spawn(const Char* name, VoidPtr code, VoidPtr image);
+ const Bool Remove(ProcessID process_id);
+
+ const Bool IsUser() override;
+ const Bool IsKernel() override;
+ const Bool HasMP() override;
+
+ public:
+ Ref<UserProcess>& GetCurrentProcess();
+ const SizeT Run() noexcept;
+
+ public:
+ STATIC UserProcessScheduler& The();
+
+ private:
+ UserProcessTeam mTeam{};
+ };
+
+ /*
+ * \brief UserProcess helper class, which contains needed utilities for the scheduler.
+ */
+
+ class UserProcessHelper final
+ {
+ public:
+ STATIC Bool Switch(VoidPtr image_ptr, UInt8* stack_ptr, HAL::StackFramePtr frame_ptr, const PID& new_pid);
+ STATIC Bool CanBeScheduled(const UserProcess& process);
+ STATIC ErrorOr<PID> TheCurrentPID();
+ STATIC SizeT StartScheduling();
+ };
+
+ const UInt32& sched_get_exit_code(void) noexcept;
+} // namespace Kernel
+
+#include <KernelKit/ThreadLocalStorage.h>
+#include <KernelKit/UserProcessScheduler.inl>
+
+////////////////////////////////////////////////////
+
+// END
+
+////////////////////////////////////////////////////
+
+#endif /* ifndef INC_PROCESS_SCHEDULER_H */
diff --git a/dev/Kernel/KernelKit/UserProcessScheduler.inl b/dev/Kernel/KernelKit/UserProcessScheduler.inl
new file mode 100644
index 00000000..6f1f3f4a
--- /dev/null
+++ b/dev/Kernel/KernelKit/UserProcessScheduler.inl
@@ -0,0 +1,51 @@
+/* -------------------------------------------
+
+ Copyright (C) 2024, Amlal EL Mahrouss, all rights reserved.
+
+ FILE: UserProcessScheduler.inl
+ PURPOSE: Low level/Ring-3 Process scheduler.
+
+------------------------------------------- */
+
+namespace Kernel
+{
+ /***********************************************************************************/
+ /** @brief Free pointer from usage. */
+ /***********************************************************************************/
+
+ template <typename T>
+ Boolean UserProcess::Delete(ErrorOr<T*> ptr, const SizeT& sz)
+ {
+ if (!ptr ||
+ sz == 0)
+ return No;
+
+ ProcessMemoryHeapList* entry = this->ProcessMemoryHeap;
+
+ while (entry != nullptr)
+ {
+ if (entry->MemoryEntry == ptr.Leak().Leak())
+ {
+ this->UsedMemory -= entry->MemoryEntrySize;
+
+#ifdef __ZKA_AMD64__
+ auto pd = hal_read_cr3();
+ hal_write_cr3(this->VMRegister);
+
+ auto ret = mm_delete_heap(entry->MemoryEntry);
+
+ hal_write_cr3(pd);
+
+ return ret;
+#else
+ Bool ret = mm_delete_heap(ptr.Leak().Leak());
+ return ret;
+#endif
+ }
+
+ entry = entry->MemoryNext;
+ }
+
+ return No;
+ }
+} // namespace Kernel
diff --git a/dev/Kernel/KernelKit/XCOFF.h b/dev/Kernel/KernelKit/XCOFF.h
new file mode 100644
index 00000000..2bc45dfa
--- /dev/null
+++ b/dev/Kernel/KernelKit/XCOFF.h
@@ -0,0 +1,51 @@
+/* -------------------------------------------
+
+ Copyright (C) 2024, Amlal EL Mahrouss, all rights reserved.
+
+ File: XCOFF.h
+ Purpose: XCOFF for Kernel.
+
+ Revision History:
+
+ 04/07/24: Added file (amlel)
+
+------------------------------------------- */
+
+#ifndef INC_XOCFF_H
+#define INC_XOCFF_H
+
+#include <NewKit/Defines.h>
+
+#define kXCOFF64Magic (0x01F7)
+
+#define kXCOFFRelFlg (0x0001)
+#define kXCOFFExecutable (0x0002)
+#define kXCOFFLnno (0x0004)
+#define kXCOFFLSyms (0x0008)
+
+struct XCoffFileHeader;
+struct XCoffForkHeader;
+
+/// @brief XCoff file header, meant for POWER apps.
+typedef struct XCoffFileHeader
+{
+ Kernel::UInt16 fMagic;
+ Kernel::UInt16 fTarget;
+ Kernel::UInt16 fNumSecs;
+ Kernel::UInt32 fTimeDat;
+ Kernel::UIntPtr fSymPtr;
+ Kernel::UInt32 fNumSyms;
+ Kernel::UInt16 fOptHdr; // ?: Number of bytes in optional header
+} XCoffFileHeader64;
+
+#define cForkNameLen (255)
+
+/// @brief This the executable manifest fork.
+typedef struct XCoffForkHeader
+{
+ Kernel::Char fPropertiesXMLFork[cForkNameLen];
+ Kernel::Char fDynamicLoaderFork[cForkNameLen];
+ Kernel::Char fCodeSignFork[cForkNameLen];
+} XCoffForkHeader;
+
+#endif // ifndef INC_XOCFF_H