summaryrefslogtreecommitdiffhomepage
path: root/dev/kernel
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal@nekernel.org>2025-05-29 10:51:53 +0200
committerGitHub <noreply@github.com>2025-05-29 10:51:53 +0200
commit5c0bb7ee7b1b0fee02cc179fb21f4c57a61d6c2d (patch)
treecb17577bcdc9714c97a84ce417a075117097f146 /dev/kernel
parentd608230b1350b064ceb01e6572519b108f6139b0 (diff)
parent3167f59dbb401d6a79b1524537e04218baf49ee3 (diff)
Merge pull request #32 from nekernel-org/dev
0.0.2e3
Diffstat (limited to 'dev/kernel')
-rw-r--r--dev/kernel/ArchKit/ArchKit.h22
-rw-r--r--dev/kernel/CFKit/GUIDWizard.h14
-rw-r--r--dev/kernel/CFKit/GUIDWrapper.h6
-rw-r--r--dev/kernel/CFKit/Property.h8
-rw-r--r--dev/kernel/CompilerKit/Detail.h2
-rw-r--r--dev/kernel/CompilerKit/Version.h8
-rw-r--r--dev/kernel/DmaKit/DmaPool.h88
-rw-r--r--dev/kernel/FSKit/Defines.h2
-rw-r--r--dev/kernel/FSKit/Ext2.h4
-rw-r--r--dev/kernel/FSKit/HeFS.h21
-rw-r--r--dev/kernel/FSKit/NeFS.h4
-rw-r--r--dev/kernel/FirmwareKit/CoreBoot/BootNet.h2
-rw-r--r--dev/kernel/FirmwareKit/CoreBoot/CoreBoot.h2
-rw-r--r--dev/kernel/FirmwareKit/EFI/EFI.h26
-rw-r--r--dev/kernel/FirmwareKit/EFI/NS.h2
-rw-r--r--dev/kernel/FirmwareKit/EPM.h2
-rw-r--r--dev/kernel/FirmwareKit/GPT.h8
-rw-r--r--dev/kernel/FirmwareKit/Handover.h10
-rw-r--r--dev/kernel/FirmwareKit/VEPM.h4
-rw-r--r--dev/kernel/GfxKit/FB.h17
-rw-r--r--dev/kernel/HALKit/AMD64/CPUID.h2
-rw-r--r--dev/kernel/HALKit/AMD64/HalACPIFactoryInterface.cc4
-rw-r--r--dev/kernel/HALKit/AMD64/HalAPICController.cc38
-rw-r--r--dev/kernel/HALKit/AMD64/HalAPICDmaWrapper.cc39
-rw-r--r--dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc246
-rw-r--r--dev/kernel/HALKit/AMD64/HalApplicationProcessorGNU.s8
-rw-r--r--dev/kernel/HALKit/AMD64/HalApplicationProcessorStartup.asm79
-rw-r--r--dev/kernel/HALKit/AMD64/HalApplicationProcessorStartup.s14
-rw-r--r--dev/kernel/HALKit/AMD64/HalCommonAPI.asm59
-rw-r--r--dev/kernel/HALKit/AMD64/HalControlRegisterAPI.s (renamed from dev/kernel/HALKit/AMD64/HalControlRegister.s)0
-rw-r--r--dev/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc (renamed from dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc)147
-rw-r--r--dev/kernel/HALKit/AMD64/HalCoreSystemCalls.cc4
-rw-r--r--dev/kernel/HALKit/AMD64/HalDebugOutput.cc4
-rw-r--r--dev/kernel/HALKit/AMD64/HalDebugProtocol.cc (renamed from dev/kernel/HALKit/AMD64/HalDebugPort.cc)7
-rw-r--r--dev/kernel/HALKit/AMD64/HalDescriptorLoader.cc57
-rw-r--r--dev/kernel/HALKit/AMD64/HalHandoverStub.asm (renamed from dev/kernel/HALKit/AMD64/HalBootHeader.asm)2
-rw-r--r--dev/kernel/HALKit/AMD64/HalInterruptAPI.asm91
-rw-r--r--dev/kernel/HALKit/AMD64/HalKernelMain.cc118
-rw-r--r--dev/kernel/HALKit/AMD64/HalKernelPanic.cc13
-rw-r--r--dev/kernel/HALKit/AMD64/HalPagingMgr.cc (renamed from dev/kernel/HALKit/AMD64/HalPagingMgrAMD64.cc)4
-rw-r--r--dev/kernel/HALKit/AMD64/HalProcessor.cc (renamed from dev/kernel/HALKit/AMD64/HalProcessorAMD64.cc)14
-rw-r--r--dev/kernel/HALKit/AMD64/HalSchedulerCorePrimitives.cc (renamed from dev/kernel/HALKit/AMD64/HalSchedulerCorePrimitivesAMD64.cc)2
-rw-r--r--dev/kernel/HALKit/AMD64/HalTimer.cc (renamed from dev/kernel/HALKit/AMD64/HalTimerAMD64.cc)4
-rw-r--r--dev/kernel/HALKit/AMD64/HalUtilsAPI.asm2
-rw-r--r--dev/kernel/HALKit/AMD64/Hypervisor.h2
-rw-r--r--dev/kernel/HALKit/AMD64/Network/Generic+Basic+RTL8139.cc114
-rw-r--r--dev/kernel/HALKit/AMD64/Paging.h29
-rw-r--r--dev/kernel/HALKit/AMD64/Processor.h73
-rw-r--r--dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc9
-rw-r--r--dev/kernel/HALKit/AMD64/Storage/PIO+Generic+Next.cc280
-rw-r--r--dev/kernel/HALKit/AMD64/Storage/PIO+Generic.cc36
-rwxr-xr-xdev/kernel/HALKit/AMD64/make_ap_blob.sh3
-rw-r--r--dev/kernel/HALKit/ARM64/ApplicationProcessor.h7
-rw-r--r--dev/kernel/HALKit/ARM64/HalACPIFactoryInterface.cc4
-rw-r--r--dev/kernel/HALKit/ARM64/HalApplicationProcessor.cc115
-rw-r--r--dev/kernel/HALKit/ARM64/HalApplicationProcessorStartup.s12
-rw-r--r--dev/kernel/HALKit/ARM64/HalCommonAPI.s (renamed from dev/kernel/HALKit/ARM64/HalFlushTLB.S)0
-rw-r--r--dev/kernel/HALKit/ARM64/HalDebugOutput.cc4
-rw-r--r--dev/kernel/HALKit/ARM64/HalInterruptAPI.s3
-rw-r--r--dev/kernel/HALKit/ARM64/HalKernelMain.cc59
-rw-r--r--dev/kernel/HALKit/ARM64/HalKernelPanic.cc6
-rw-r--r--dev/kernel/HALKit/ARM64/HalPagingMgr.cc28
-rw-r--r--dev/kernel/HALKit/ARM64/HalPagingMgrARM64.cc78
-rw-r--r--dev/kernel/HALKit/ARM64/HalSchedulerCore.cc (renamed from dev/kernel/HALKit/ARM64/HalSchedulerCoreARM64.cc)0
-rw-r--r--dev/kernel/HALKit/ARM64/HalSchedulerCorePrimitives.cc (renamed from dev/kernel/HALKit/ARM64/HalSchedulerCorePrimitivesARM64.cc)2
-rw-r--r--dev/kernel/HALKit/ARM64/HalTimer.cc (renamed from dev/kernel/HALKit/ARM64/HalTimerARM64.cc)1
-rw-r--r--dev/kernel/HALKit/ARM64/Paging.h6
-rw-r--r--dev/kernel/HALKit/ARM64/Processor.h58
-rw-r--r--dev/kernel/HALKit/POWER/AP.h2
-rw-r--r--dev/kernel/HALKit/POWER/HalApplicationProcessor.cc2
-rw-r--r--dev/kernel/HALKit/POWER/Processor.h6
-rw-r--r--dev/kernel/HALKit/RISCV/AP.h2
-rw-r--r--dev/kernel/HALKit/RISCV/HalApplicationProcessor.cc2
-rw-r--r--dev/kernel/KernelKit/BinaryMutex.h2
-rw-r--r--dev/kernel/KernelKit/CodeMgr.h8
-rw-r--r--dev/kernel/KernelKit/CoreProcessScheduler.h94
-rw-r--r--dev/kernel/KernelKit/DebugOutput.h16
-rw-r--r--dev/kernel/KernelKit/Defines.h9
-rw-r--r--dev/kernel/KernelKit/DeviceMgr.h21
-rw-r--r--dev/kernel/KernelKit/DriveMgr.h22
-rw-r--r--dev/kernel/KernelKit/FileMgr.h74
-rw-r--r--dev/kernel/KernelKit/HardwareThreadScheduler.h25
-rw-r--r--dev/kernel/KernelKit/HeapMgr.h (renamed from dev/kernel/KernelKit/MemoryMgr.h)45
-rw-r--r--dev/kernel/KernelKit/HeapMgr.inl35
-rw-r--r--dev/kernel/KernelKit/IDylibObject.h17
-rw-r--r--dev/kernel/KernelKit/IFS.h25
-rw-r--r--dev/kernel/KernelKit/IPEFDylibObject.h10
-rw-r--r--dev/kernel/KernelKit/KPC.h17
-rw-r--r--dev/kernel/KernelKit/KernelTaskScheduler.h14
-rw-r--r--dev/kernel/KernelKit/LoaderInterface.h4
-rw-r--r--dev/kernel/KernelKit/LockDelegate.h8
-rw-r--r--dev/kernel/KernelKit/MSDOS.h2
-rw-r--r--dev/kernel/KernelKit/PCI/DMA.h11
-rw-r--r--dev/kernel/KernelKit/PCI/Database.h2
-rw-r--r--dev/kernel/KernelKit/PCI/Device.h2
-rw-r--r--dev/kernel/KernelKit/PCI/Express.h2
-rw-r--r--dev/kernel/KernelKit/PCI/IO.h6
-rw-r--r--dev/kernel/KernelKit/PCI/Iterator.h6
-rw-r--r--dev/kernel/KernelKit/PCI/PCI.h2
-rw-r--r--dev/kernel/KernelKit/PE.h2
-rw-r--r--dev/kernel/KernelKit/PECodeMgr.h4
-rw-r--r--dev/kernel/KernelKit/PEF.h2
-rw-r--r--dev/kernel/KernelKit/PEFCodeMgr.h4
-rw-r--r--dev/kernel/KernelKit/Semaphore.h2
-rw-r--r--dev/kernel/KernelKit/ThreadLocalStorage.h4
-rw-r--r--dev/kernel/KernelKit/ThreadLocalStorage.inl4
-rw-r--r--dev/kernel/KernelKit/Timer.h12
-rw-r--r--dev/kernel/KernelKit/UserMgr.h (renamed from dev/kernel/KernelKit/User.h)16
-rw-r--r--dev/kernel/KernelKit/UserProcessScheduler.h66
-rw-r--r--dev/kernel/KernelKit/UserProcessScheduler.inl18
-rw-r--r--dev/kernel/KernelKit/XCOFF.h2
-rw-r--r--dev/kernel/KernelKit/ZXD.h43
-rw-r--r--dev/kernel/NeKit/Array.h (renamed from dev/kernel/NewKit/Array.h)14
-rw-r--r--dev/kernel/NeKit/ArrayList.h (renamed from dev/kernel/NewKit/ArrayList.h)2
-rw-r--r--dev/kernel/NeKit/Atom.h (renamed from dev/kernel/NewKit/Atom.h)2
-rw-r--r--dev/kernel/NeKit/Crc32.h (renamed from dev/kernel/NewKit/Crc32.h)2
-rw-r--r--dev/kernel/NeKit/CxxAbi.h (renamed from dev/kernel/NewKit/CxxAbi.h)2
-rw-r--r--dev/kernel/NeKit/Defines.h (renamed from dev/kernel/NewKit/Defines.h)2
-rw-r--r--dev/kernel/NeKit/ErrorOr.h (renamed from dev/kernel/NewKit/ErrorOr.h)4
-rw-r--r--dev/kernel/NeKit/Function.h (renamed from dev/kernel/NewKit/Function.h)20
-rw-r--r--dev/kernel/NeKit/Json.h (renamed from dev/kernel/NewKit/Json.h)8
-rw-r--r--dev/kernel/NeKit/KString.h (renamed from dev/kernel/NewKit/KString.h)8
-rw-r--r--dev/kernel/NeKit/KernelPanic.h (renamed from dev/kernel/NewKit/KernelPanic.h)2
-rw-r--r--dev/kernel/NeKit/Macros.h (renamed from dev/kernel/NewKit/Macros.h)9
-rw-r--r--dev/kernel/NeKit/MutableArray.h (renamed from dev/kernel/NewKit/MutableArray.h)4
-rw-r--r--dev/kernel/NeKit/NeKit.h20
-rw-r--r--dev/kernel/NeKit/New.h (renamed from dev/kernel/NewKit/New.h)2
-rw-r--r--dev/kernel/NeKit/OwnPtr.h (renamed from dev/kernel/NewKit/OwnPtr.h)6
-rw-r--r--dev/kernel/NeKit/PageMgr.h (renamed from dev/kernel/NewKit/PageMgr.h)4
-rw-r--r--dev/kernel/NeKit/Pair.h (renamed from dev/kernel/NewKit/Pair.h)2
-rw-r--r--dev/kernel/NeKit/Pmm.h (renamed from dev/kernel/NewKit/Pmm.h)4
-rw-r--r--dev/kernel/NeKit/Ref.h (renamed from dev/kernel/NewKit/Ref.h)12
-rw-r--r--dev/kernel/NeKit/Stream.h (renamed from dev/kernel/NewKit/Stream.h)4
-rw-r--r--dev/kernel/NeKit/Utils.h (renamed from dev/kernel/NewKit/Utils.h)10
-rw-r--r--dev/kernel/NeKit/Variant.h (renamed from dev/kernel/NewKit/Variant.h)6
-rw-r--r--dev/kernel/NetworkKit/IP.h6
-rw-r--r--dev/kernel/NetworkKit/IPC.h4
-rw-r--r--dev/kernel/NetworkKit/LTE.h4
-rw-r--r--dev/kernel/NetworkKit/MAC.h6
-rw-r--r--dev/kernel/NetworkKit/NetworkDevice.h13
-rw-r--r--dev/kernel/NetworkKit/NetworkDevice.inl17
-rw-r--r--dev/kernel/NewKit/NewKit.h20
-rw-r--r--dev/kernel/SignalKit/Signals.h2
-rw-r--r--dev/kernel/StorageKit/AHCI.h2
-rw-r--r--dev/kernel/StorageKit/ATA.h4
-rw-r--r--dev/kernel/StorageKit/DmaPool.h92
-rw-r--r--dev/kernel/StorageKit/PRDT.h2
-rw-r--r--dev/kernel/SwapKit/DiskSwap.h4
-rw-r--r--dev/kernel/amd64-ci.make4
-rw-r--r--dev/kernel/amd64-desktop.make8
-rw-r--r--dev/kernel/arm64-desktop.make2
-rw-r--r--dev/kernel/kernel_rsrc.rsrc6
-rw-r--r--dev/kernel/src/ACPIFactoryInterface.cc13
-rw-r--r--dev/kernel/src/Array.cc2
-rw-r--r--dev/kernel/src/ArrayList.cc2
-rw-r--r--dev/kernel/src/Atom.cc2
-rw-r--r--dev/kernel/src/BitMapMgr.cc32
-rw-r--r--dev/kernel/src/CodeMgr.cc2
-rw-r--r--dev/kernel/src/Crc32.cc2
-rw-r--r--dev/kernel/src/CxxAbi-AMD64.cc8
-rw-r--r--dev/kernel/src/CxxAbi-ARM64.cc2
-rw-r--r--dev/kernel/src/Defines.cc2
-rw-r--r--dev/kernel/src/DeviceMgr.cc2
-rw-r--r--dev/kernel/src/DriveMgr.cc12
-rw-r--r--dev/kernel/src/ErrorOr.cc2
-rw-r--r--dev/kernel/src/FS/Ext2+FileMgr.cc2
-rw-r--r--dev/kernel/src/FS/Ext2+FileSystemParser.cc10
-rw-r--r--dev/kernel/src/FS/HeFS+FileMgr.cc2
-rw-r--r--dev/kernel/src/FS/HeFS+FileSystemParser.cc295
-rw-r--r--dev/kernel/src/FS/NeFS+FileMgr.cc2
-rw-r--r--dev/kernel/src/FS/NeFS+FileSystemParser.cc43
-rw-r--r--dev/kernel/src/FileMgr.cc2
-rw-r--r--dev/kernel/src/GUIDWizard.cc2
-rw-r--r--dev/kernel/src/HardwareThreadScheduler.cc49
-rw-r--r--dev/kernel/src/HeapMgr.cc (renamed from dev/kernel/src/MemoryMgr.cc)92
-rw-r--r--dev/kernel/src/IFS.cc (renamed from dev/kernel/src/DriveMgr+IO.cc)16
-rw-r--r--dev/kernel/src/IPEFDylibObject.cc4
-rw-r--r--dev/kernel/src/IndexableProperty.cc4
-rw-r--r--dev/kernel/src/Json.cc2
-rw-r--r--dev/kernel/src/KPC.cc6
-rw-r--r--dev/kernel/src/KString.cc4
-rw-r--r--dev/kernel/src/MutableArray.cc2
-rw-r--r--dev/kernel/src/Network/IPAddr.cc2
-rw-r--r--dev/kernel/src/Network/IPCMsg.cc1
-rw-r--r--dev/kernel/src/Network/NetworkDevice.cc8
-rw-r--r--dev/kernel/src/New+Delete.cc16
-rw-r--r--dev/kernel/src/OwnPtr.cc2
-rw-r--r--dev/kernel/src/PEFCodeMgr.cc32
-rw-r--r--dev/kernel/src/PRDT.cc2
-rw-r--r--dev/kernel/src/PageMgr.cc2
-rw-r--r--dev/kernel/src/Pmm.cc2
-rw-r--r--dev/kernel/src/Ref.cc2
-rw-r--r--dev/kernel/src/Stream.cc2
-rw-r--r--dev/kernel/src/Swap/DiskSwap.cc2
-rw-r--r--dev/kernel/src/ThreadLocalStorage.cc2
-rw-r--r--dev/kernel/src/UserMgr.cc (renamed from dev/kernel/src/User.cc)83
-rw-r--r--dev/kernel/src/UserProcessScheduler.cc381
-rw-r--r--dev/kernel/src/UserProcessTeam.cc8
-rw-r--r--dev/kernel/src/UtfUtils.cc14
-rw-r--r--dev/kernel/src/Utils.cc2
-rw-r--r--dev/kernel/src/Variant.cc2
201 files changed, 2081 insertions, 2260 deletions
diff --git a/dev/kernel/ArchKit/ArchKit.h b/dev/kernel/ArchKit/ArchKit.h
index 41a36e69..09839d98 100644
--- a/dev/kernel/ArchKit/ArchKit.h
+++ b/dev/kernel/ArchKit/ArchKit.h
@@ -6,9 +6,9 @@
#pragma once
-#include <NewKit/Array.h>
-#include <NewKit/Defines.h>
-#include <NewKit/Function.h>
+#include <NeKit/Array.h>
+#include <NeKit/Defines.h>
+#include <NeKit/Function.h>
#include <FirmwareKit/Handover.h>
@@ -29,8 +29,8 @@
#define kMaxDispatchCallCount (512U)
namespace Kernel {
-inline SSizeT rt_hash_seed(const Char* seed, int mul) {
- SSizeT hash = 0;
+inline SizeT rt_hash_seed(const Char* seed, UInt32 mul) {
+ SizeT hash = 0;
for (SSizeT idx = 0; seed[idx] != 0; ++idx) {
hash += seed[idx];
@@ -69,7 +69,7 @@ namespace HAL {
typedef Kernel::Void (*rt_syscall_proc)(Kernel::VoidPtr);
-struct HalSyscallEntry final {
+struct HAL_DISPATCH_ENTRY final {
Kernel::Int64 fHash;
Kernel::Bool fHooked;
rt_syscall_proc fProc;
@@ -77,8 +77,12 @@ struct HalSyscallEntry final {
operator bool() { return fHooked; }
};
-inline Kernel::Array<HalSyscallEntry, kMaxDispatchCallCount> kSysCalls;
+inline Kernel::Array<HAL_DISPATCH_ENTRY, kMaxDispatchCallCount> kSysCalls;
-inline Kernel::Array<HalSyscallEntry, kMaxDispatchCallCount> kKernCalls;
+inline Kernel::Array<HAL_DISPATCH_ENTRY, kMaxDispatchCallCount> kKernCalls;
-EXTERN_C Kernel::HAL::StackFramePtr mp_get_current_context(Kernel::Int64 pid);
+#ifdef __NE_VIRTUAL_MEMORY_SUPPORT__
+
+inline Kernel::VoidPtr kKernelVM = nullptr;
+
+#endif // __NE_VIRTUAL_MEMORY_SUPPORT__ \ No newline at end of file
diff --git a/dev/kernel/CFKit/GUIDWizard.h b/dev/kernel/CFKit/GUIDWizard.h
index ae62b8fc..c7cb18ac 100644
--- a/dev/kernel/CFKit/GUIDWizard.h
+++ b/dev/kernel/CFKit/GUIDWizard.h
@@ -7,13 +7,13 @@
#pragma once
#include <CFKit/GUIDWrapper.h>
-#include <NewKit/Array.h>
-#include <NewKit/ArrayList.h>
-#include <NewKit/Defines.h>
-#include <NewKit/ErrorOr.h>
-#include <NewKit/KString.h>
-#include <NewKit/Ref.h>
-#include <NewKit/Stream.h>
+#include <NeKit/Array.h>
+#include <NeKit/ArrayList.h>
+#include <NeKit/Defines.h>
+#include <NeKit/ErrorOr.h>
+#include <NeKit/KString.h>
+#include <NeKit/Ref.h>
+#include <NeKit/Stream.h>
namespace CF::XRN::Version1 {
using namespace Kernel;
diff --git a/dev/kernel/CFKit/GUIDWrapper.h b/dev/kernel/CFKit/GUIDWrapper.h
index cc01bfad..a3920357 100644
--- a/dev/kernel/CFKit/GUIDWrapper.h
+++ b/dev/kernel/CFKit/GUIDWrapper.h
@@ -6,9 +6,9 @@
#pragma once
-#include <NewKit/Defines.h>
-#include <NewKit/Ref.h>
-#include <NewKit/Stream.h>
+#include <NeKit/Defines.h>
+#include <NeKit/Ref.h>
+#include <NeKit/Stream.h>
/* GUID for C++ classes. */
diff --git a/dev/kernel/CFKit/Property.h b/dev/kernel/CFKit/Property.h
index 4dde15f9..9d35dc60 100644
--- a/dev/kernel/CFKit/Property.h
+++ b/dev/kernel/CFKit/Property.h
@@ -8,10 +8,10 @@
#define CFKIT_PROPS_H
#include <CFKit/GUIDWrapper.h>
-#include <NewKit/Array.h>
-#include <NewKit/Defines.h>
-#include <NewKit/Function.h>
-#include <NewKit/KString.h>
+#include <NeKit/Array.h>
+#include <NeKit/Defines.h>
+#include <NeKit/Function.h>
+#include <NeKit/KString.h>
#define kMaxPropLen (256U)
diff --git a/dev/kernel/CompilerKit/Detail.h b/dev/kernel/CompilerKit/Detail.h
index 863ca145..a86f4dd3 100644
--- a/dev/kernel/CompilerKit/Detail.h
+++ b/dev/kernel/CompilerKit/Detail.h
@@ -7,7 +7,7 @@
#pragma once
#ifdef __NEOSKRNL__
-#include <NewKit/Defines.h>
+#include <NeKit/Defines.h>
#endif // ifdef __NEOSKRNL__
#define NE_COPY_DELETE(KLASS) \
diff --git a/dev/kernel/CompilerKit/Version.h b/dev/kernel/CompilerKit/Version.h
index 93378863..4250531a 100644
--- a/dev/kernel/CompilerKit/Version.h
+++ b/dev/kernel/CompilerKit/Version.h
@@ -2,8 +2,8 @@
#pragma once
-#define BOOTLOADER_VERSION "v0.0.1"
-#define KERNEL_VERSION "v0.0.1"
+#define BOOTLOADER_VERSION "v0.0.2-bootz"
+#define KERNEL_VERSION "v0.0.2-krnl"
-#define BOOTLOADER_VERSION_BCD 0x0001
-#define KERNEL_VERSION_BCD 0x0001
+#define BOOTLOADER_VERSION_BCD (0x0002)
+#define KERNEL_VERSION_BCD (0x0002)
diff --git a/dev/kernel/DmaKit/DmaPool.h b/dev/kernel/DmaKit/DmaPool.h
new file mode 100644
index 00000000..ec98745d
--- /dev/null
+++ b/dev/kernel/DmaKit/DmaPool.h
@@ -0,0 +1,88 @@
+/* -------------------------------------------
+
+ Copyright (C) 2025, Amlal El Mahrouss , all rights reserved.
+
+ File: FileMgr.h
+ Purpose: Kernel file manager.
+
+------------------------------------------- */
+
+#pragma once
+
+#include <HALKit/AMD64/Processor.h>
+#include <KernelKit/DebugOutput.h>
+
+#ifdef __NE_AMD64__
+#define kNeDMAPoolStart (0x1000000)
+#define kNeDMAPoolSize (0x1000000)
+
+namespace Kernel {
+/// @brief DMA pool base pointer, here we're sure that AHCI or whatever tricky standard sees it.
+inline UInt8* kDmaPoolPtr = (UInt8*) kNeDMAPoolStart;
+inline const UInt8* kDmaPoolEnd = (UInt8*) (kNeDMAPoolStart + kNeDMAPoolSize);
+
+/***********************************************************************************/
+/// @brief allocate from the rtl_dma_alloc system.
+/// @param size the size of the chunk to allocate.
+/// @param align alignement of pointer.
+/***********************************************************************************/
+inline VoidPtr rtl_dma_alloc(SizeT size, SizeT align) {
+ if (!size) {
+ return nullptr;
+ }
+
+ UIntPtr addr = (UIntPtr) kDmaPoolPtr;
+
+ /// here we just align the address according to a `align` variable, i'd rather be a power of two
+ /// really.
+ addr = (addr + (align - 1)) & ~(align - 1);
+
+ if ((addr + size) >= reinterpret_cast<UIntPtr>(kDmaPoolEnd)) {
+ err_global_get() = kErrorDmaExhausted;
+ return nullptr;
+ }
+
+ kDmaPoolPtr = (UInt8*) (addr + size);
+
+ HAL::mm_memory_fence((VoidPtr)addr);
+
+ return (VoidPtr) addr;
+}
+
+/***********************************************************************************/
+/// @brief Free DMA pointer.
+/***********************************************************************************/
+inline Void rtl_dma_free(SizeT size) {
+ if (!size) return;
+
+ auto ptr = (UInt8*) (kDmaPoolPtr - size);
+
+ if (!ptr || ptr < (UInt8*) kNeDMAPoolStart) {
+ err_global_get() = kErrorDmaExhausted;
+ return;
+ }
+
+ kDmaPoolPtr = ptr;
+
+ HAL::mm_memory_fence(ptr);
+}
+
+/***********************************************************************************/
+/// @brief Flush DMA pointer.
+/***********************************************************************************/
+inline Void rtl_dma_flush(VoidPtr ptr, SizeT size_buffer) {
+ if (ptr > kDmaPoolEnd) {
+ return;
+ }
+
+ if (!ptr || ptr < (UInt8*) kNeDMAPoolStart) {
+ err_global_get() = kErrorDmaExhausted;
+ return;
+ }
+
+ for (SizeT buf_idx = 0UL; buf_idx < size_buffer; ++buf_idx) {
+ HAL::mm_memory_fence((VoidPtr) ((UInt8*) ptr + buf_idx));
+ }
+}
+} // namespace Kernel
+#endif \ No newline at end of file
diff --git a/dev/kernel/FSKit/Defines.h b/dev/kernel/FSKit/Defines.h
index c4c4e497..9e22a638 100644
--- a/dev/kernel/FSKit/Defines.h
+++ b/dev/kernel/FSKit/Defines.h
@@ -6,7 +6,7 @@
#pragma once
-#include <NewKit/Defines.h>
+#include <NeKit/Defines.h>
#define FSKIT_VERSION "1.0.0"
#define FSKIT_VERSION_BCD 0x0100
diff --git a/dev/kernel/FSKit/Ext2.h b/dev/kernel/FSKit/Ext2.h
index 17645139..35129dcd 100644
--- a/dev/kernel/FSKit/Ext2.h
+++ b/dev/kernel/FSKit/Ext2.h
@@ -8,8 +8,8 @@
#include <CompilerKit/CompilerKit.h>
#include <KernelKit/DriveMgr.h>
-#include <NewKit/Defines.h>
-#include <NewKit/KString.h>
+#include <NeKit/Defines.h>
+#include <NeKit/KString.h>
#include <hint/CompilerHint.h>
/// @file Ext2.h
diff --git a/dev/kernel/FSKit/HeFS.h b/dev/kernel/FSKit/HeFS.h
index 04a265f5..08452a2b 100644
--- a/dev/kernel/FSKit/HeFS.h
+++ b/dev/kernel/FSKit/HeFS.h
@@ -8,10 +8,10 @@
#include <CompilerKit/CompilerKit.h>
#include <KernelKit/DriveMgr.h>
-#include <KernelKit/User.h>
-#include <NewKit/Crc32.h>
-#include <NewKit/Defines.h>
-#include <NewKit/KString.h>
+#include <KernelKit/UserMgr.h>
+#include <NeKit/Crc32.h>
+#include <NeKit/Defines.h>
+#include <NeKit/KString.h>
#include <hint/CompilerHint.h>
/// @file HeFS.h
@@ -370,7 +370,7 @@ inline const Char* hefs_file_flags_to_string(UInt32 flags) noexcept {
}
} // namespace Kernel::Detail
-namespace Kernel::HeFS {
+namespace Kernel {
/// @brief HeFS filesystem parser class.
/// @details This class is used to parse the HeFS filesystem.
class HeFileSystemParser final {
@@ -417,7 +417,10 @@ class HeFileSystemParser final {
const Utf8Char* dir, const BOOL delete_or_create);
};
-/// @brief Initialize HeFS inside the main disk.
-/// @return Whether it successfuly formated it or not.
-Boolean fs_init_hefs(Void);
-} // namespace Kernel::HeFS
+namespace HeFS {
+
+ /// @brief Initialize HeFS inside the main disk.
+ /// @return Whether it successfuly formated it or not.
+ Boolean fs_init_hefs(Void) noexcept;
+} // namespace HeFS
+} // namespace Kernel
diff --git a/dev/kernel/FSKit/NeFS.h b/dev/kernel/FSKit/NeFS.h
index 588cbe69..f265c4a6 100644
--- a/dev/kernel/FSKit/NeFS.h
+++ b/dev/kernel/FSKit/NeFS.h
@@ -18,8 +18,8 @@ default.
#include <CompilerKit/CompilerKit.h>
#include <KernelKit/DriveMgr.h>
-#include <NewKit/Defines.h>
-#include <NewKit/KString.h>
+#include <NeKit/Defines.h>
+#include <NeKit/KString.h>
#include <hint/CompilerHint.h>
/**
diff --git a/dev/kernel/FirmwareKit/CoreBoot/BootNet.h b/dev/kernel/FirmwareKit/CoreBoot/BootNet.h
index 6639d9e3..b05f382e 100644
--- a/dev/kernel/FirmwareKit/CoreBoot/BootNet.h
+++ b/dev/kernel/FirmwareKit/CoreBoot/BootNet.h
@@ -6,7 +6,7 @@
#pragma once
-#include <NewKit/Defines.h>
+#include <NeKit/Defines.h>
#define kBootNetINetMagic "NETB"
#define kBootNetINetMagicLength (4)
diff --git a/dev/kernel/FirmwareKit/CoreBoot/CoreBoot.h b/dev/kernel/FirmwareKit/CoreBoot/CoreBoot.h
index 2b274f21..9e756a70 100644
--- a/dev/kernel/FirmwareKit/CoreBoot/CoreBoot.h
+++ b/dev/kernel/FirmwareKit/CoreBoot/CoreBoot.h
@@ -6,7 +6,7 @@
#pragma once
-#include <NewKit/Defines.h>
+#include <NeKit/Defines.h>
namespace Firmware::Detail::CoreBoot {
using namespace Kernel;
diff --git a/dev/kernel/FirmwareKit/EFI/EFI.h b/dev/kernel/FirmwareKit/EFI/EFI.h
index e2fa3843..ed22f1e9 100644
--- a/dev/kernel/FirmwareKit/EFI/EFI.h
+++ b/dev/kernel/FirmwareKit/EFI/EFI.h
@@ -11,7 +11,7 @@
@brief Implementation of the main EFI protocols.
*/
-#include <NewKit/Defines.h>
+#include <NeKit/Defines.h>
using namespace Kernel;
@@ -42,7 +42,7 @@ struct EfiDevicePathProtocol;
struct EfiBootServices;
struct EfiMemoryDescriptor;
struct EfiSystemTable;
-struct EfiGUID;
+struct EFI_GUID;
struct EfiFileDevicePathProtocol;
struct EfiHandle;
struct EfiGraphicsOutputProtocol;
@@ -85,9 +85,9 @@ typedef UInt64(EFI_API* EfiCopyMem)(VoidPtr DstBuf, VoidPtr SrcBuf, SizeT Length
typedef UInt64(EFI_API* EfiSetMem)(VoidPtr DstBuf, Char Byte, SizeT Length);
-typedef UInt64(EFI_API* EfiHandleProtocol)(EfiHandlePtr Handle, EfiGUID* Guid, VoidPtr* Device);
+typedef UInt64(EFI_API* EfiHandleProtocol)(EfiHandlePtr Handle, EFI_GUID* Guid, VoidPtr* Device);
-typedef UInt64(EFI_API* EfiLocateDevicePath)(EfiGUID* Protocol, EfiDevicePathProtocol** DevicePath,
+typedef UInt64(EFI_API* EfiLocateDevicePath)(EFI_GUID* Protocol, EfiDevicePathProtocol** DevicePath,
EfiHandlePtr Device);
typedef UInt64(EFI_API* EfiStartImage)(EfiHandlePtr Handle, VoidPtr ArgsSize, VoidPtr ArgsPtr);
@@ -495,12 +495,12 @@ typedef UInt64(EFI_API* EfiGetMemoryMap)(UInt32* MapSize, EfiMemoryDescriptor* D
/**
* @brief GUID type, something you can also find in CFKit.
*/
-typedef struct EfiGUID EFI_FINAL {
+typedef struct EFI_GUID EFI_FINAL {
UInt32 Data1;
UInt16 Data2;
UInt16 Data3;
UInt8 Data4[8];
-} EfiGUID;
+} EFI_GUID;
/***
* Protocol stuff...
@@ -519,10 +519,10 @@ typedef struct EfiGUID EFI_FINAL {
#define EFI_OPEN_PROTOCOL_BY_DRIVER 0x00000010
#define EFI_OPEN_PROTOCOL_EXCLUSIVE 0x00000020
-typedef UInt64(EFI_API* EfiLocateProtocol)(EfiGUID* Protocol, VoidPtr Registration,
+typedef UInt64(EFI_API* EfiLocateProtocol)(EFI_GUID* Protocol, VoidPtr Registration,
VoidPtr* Interface);
-typedef UInt64(EFI_API* EfiOpenProtocol)(EfiHandlePtr Handle, EfiGUID* Guid, VoidPtr* Interface,
+typedef UInt64(EFI_API* EfiOpenProtocol)(EfiHandlePtr Handle, EFI_GUID* Guid, VoidPtr* Interface,
EfiHandlePtr AgentHandle, EfiHandlePtr ControllerHandle,
UInt32 Attributes);
@@ -633,10 +633,10 @@ struct EfiSimpleFilesystemProtocol {
typedef struct EfiRuntimeServices {
EfiTableHeader SystemTable;
VoidPtr GetTime, SetTime, GetWakeupTime, SetWakeupTime, SetVirtualAddressMap, ConvertPointer;
- UInt64(EFI_API* GetVariable)(const WideChar* Name, EfiGUID VendorGUID, UInt32* Attributes,
+ UInt64(EFI_API* GetVariable)(const WideChar* Name, EFI_GUID VendorGUID, UInt32* Attributes,
UInt32* DataSize, VoidPtr Data);
VoidPtr GetNextVariable;
- UInt64(EFI_API* SetVariable)(const WideChar* Name, EfiGUID VendorGUID, UInt32* Attributes,
+ UInt64(EFI_API* SetVariable)(const WideChar* Name, EFI_GUID VendorGUID, UInt32* Attributes,
UInt32* DataSize, VoidPtr Data);
VoidPtr GetNextHighMonotonicCount;
VoidPtr ResetSystem;
@@ -663,7 +663,7 @@ typedef struct EfiSystemTable {
UInt64 NumberOfTableEntries;
/// The configuration table (contains the RSD PTR entry.)
struct {
- EfiGUID VendorGUID;
+ EFI_GUID VendorGUID;
VoidPtr VendorTable;
} * ConfigurationTable;
} EfiSystemTable;
@@ -792,9 +792,9 @@ typedef struct EfiFileProtocol {
EfiStatusType(EFI_API* SetPosition)(EfiFileProtocol* Self, UInt64* Position);
- EfiStatusType(EFI_API* GetInfo)(struct EfiFileProtocol*, struct EfiGUID*, UInt32*, void*);
+ EfiStatusType(EFI_API* GetInfo)(struct EfiFileProtocol*, struct EFI_GUID*, UInt32*, void*);
- EfiStatusType(EFI_API* SetInfo)(struct EfiFileProtocol*, struct EfiGUID*, UInt32*, void*);
+ EfiStatusType(EFI_API* SetInfo)(struct EfiFileProtocol*, struct EFI_GUID*, UInt32*, void*);
EfiStatusType(EFI_API* Flush)(EfiFileProtocol*);
diff --git a/dev/kernel/FirmwareKit/EFI/NS.h b/dev/kernel/FirmwareKit/EFI/NS.h
index f5a28e10..910b2c36 100644
--- a/dev/kernel/FirmwareKit/EFI/NS.h
+++ b/dev/kernel/FirmwareKit/EFI/NS.h
@@ -6,7 +6,7 @@
#pragma once
-#include <NewKit/Defines.h>
+#include <NeKit/Defines.h>
namespace Firmware::Detail::EFI {
using namespace Kernel;
diff --git a/dev/kernel/FirmwareKit/EPM.h b/dev/kernel/FirmwareKit/EPM.h
index 27d635f3..05291929 100644
--- a/dev/kernel/FirmwareKit/EPM.h
+++ b/dev/kernel/FirmwareKit/EPM.h
@@ -11,7 +11,7 @@
#ifndef FIRMWAREKIT_EPM_H
#define FIRMWAREKIT_EPM_H
-#include <NewKit/Defines.h>
+#include <NeKit/Defines.h>
#define kEPMNameLength (32)
#define kEPMFilesystemLength (16)
diff --git a/dev/kernel/FirmwareKit/GPT.h b/dev/kernel/FirmwareKit/GPT.h
index 7e5a910b..df0ed286 100644
--- a/dev/kernel/FirmwareKit/GPT.h
+++ b/dev/kernel/FirmwareKit/GPT.h
@@ -7,7 +7,7 @@
#pragma once
#include <FirmwareKit/EFI/EFI.h>
-#include <NewKit/Defines.h>
+#include <NeKit/Defines.h>
#define kSectorAlignGPT_PartTbl (420U)
#define kSectorAlignGPT_PartEntry (72U)
@@ -29,7 +29,7 @@ struct PACKED GPT_PARTITION_TABLE final {
UInt64 LBAAltHeader;
UInt64 FirstGPTEntry;
UInt64 LastGPTEntry;
- EfiGUID Guid;
+ EFI_GUID Guid;
UInt64 StartingLBA;
UInt32 NumPartitionEntries;
UInt32 SizeOfEntries;
@@ -38,8 +38,8 @@ struct PACKED GPT_PARTITION_TABLE final {
};
struct PACKED GPT_PARTITION_ENTRY {
- EfiGUID PartitionTypeGUID;
- EfiGUID UniquePartitionGUID;
+ EFI_GUID PartitionTypeGUID;
+ EFI_GUID UniquePartitionGUID;
UInt64 StartLBA;
UInt64 EndLBA;
UInt64 Attributes;
diff --git a/dev/kernel/FirmwareKit/Handover.h b/dev/kernel/FirmwareKit/Handover.h
index d3ccc724..d74194ed 100644
--- a/dev/kernel/FirmwareKit/Handover.h
+++ b/dev/kernel/FirmwareKit/Handover.h
@@ -18,7 +18,7 @@
#pragma once
#include <FirmwareKit/EFI/EFI.h>
-#include <NewKit/Defines.h>
+#include <NeKit/Defines.h>
#define kHandoverMagic (0xBADCC)
#define kHandoverVersion (0x0117)
@@ -61,8 +61,12 @@ struct BootInfoHeader final {
VoidPtr f_KernelImage;
SizeT f_KernelSz;
- VoidPtr f_StartupImage;
- SizeT f_StartupSz;
+
+ VoidPtr f_LibSystemImage;
+ SizeT f_LibSystemSz;
+
+ VoidPtr f_StackTop;
+ SizeT f_StackSz;
WideChar f_FirmwareVendorName[32];
SizeT f_FirmwareVendorLen;
diff --git a/dev/kernel/FirmwareKit/VEPM.h b/dev/kernel/FirmwareKit/VEPM.h
index ca6c83bf..30f6c04d 100644
--- a/dev/kernel/FirmwareKit/VEPM.h
+++ b/dev/kernel/FirmwareKit/VEPM.h
@@ -12,7 +12,7 @@
/// @brief The Virtual Explicit Partition Map scheme extension.
-#ifdef __NE_VEPM__
+#if defined(__NE_VEPM__)
#ifdef kEPMMagic
#undef kEPMMagic
#endif // kEPMMagic
@@ -26,7 +26,7 @@ inline EPM_GUID kVEPMGuidEPM = {
/// @brief VEPM GUID.
/// @note This is the GUID used to identify a VEPM partition (EFI version)
-inline EfiGUID kVEPMGuidEFI = {
+inline EFI_GUID kVEPMGuidEFI = {
0x9a1b3f2e, 0x4c3f, 0x4d52, {0xa7, 0x83, 0x9c, 0x21, 0x7b, 0x5e, 0x4d, 0xac}};
#define kVEPMGuidStr "9a1b3f2e-4c3f-4d52-a783-9c217b5e4dac"
diff --git a/dev/kernel/GfxKit/FB.h b/dev/kernel/GfxKit/FB.h
index 33895ce6..e30f1800 100644
--- a/dev/kernel/GfxKit/FB.h
+++ b/dev/kernel/GfxKit/FB.h
@@ -13,16 +13,21 @@ namespace Kernel {
class FBDeviceInterface;
struct FBDevicePacket;
+typedef UInt32 FBCoord2x2;
+typedef UInt32 FBDim2x2;
+typedef UInt32 FBColorProfile;
+typedef UInt32 FBFlags;
+
/// @brief Framebuffer device interface packet.
/// @details This structure is used to send and receive data from the framebuffer device.
/// @note The structure is packed to ensure that the data is aligned correctly for the device.
struct PACKED FBDevicePacket final {
- UInt32 fX;
- UInt32 fY;
- UInt32 fWidth;
- UInt32 fHeight;
- UInt32 fColor;
- UInt32 fFlags;
+ FBCoord2x2 fX;
+ FBCoord2x2 fY;
+ FBDim2x2 fWidth;
+ FBDim2x2 fHeight;
+ FBColorProfile fColor;
+ FBFlags fFlags;
};
/// @brief Framebuffer device interface.
diff --git a/dev/kernel/HALKit/AMD64/CPUID.h b/dev/kernel/HALKit/AMD64/CPUID.h
index 8250dfad..cc3bd25e 100644
--- a/dev/kernel/HALKit/AMD64/CPUID.h
+++ b/dev/kernel/HALKit/AMD64/CPUID.h
@@ -13,7 +13,7 @@
#pragma once
-#include <NewKit/Defines.h>
+#include <NeKit/Defines.h>
EXTERN_C {
#include <cpuid.h>
diff --git a/dev/kernel/HALKit/AMD64/HalACPIFactoryInterface.cc b/dev/kernel/HALKit/AMD64/HalACPIFactoryInterface.cc
index f4dd1347..1d289db8 100644
--- a/dev/kernel/HALKit/AMD64/HalACPIFactoryInterface.cc
+++ b/dev/kernel/HALKit/AMD64/HalACPIFactoryInterface.cc
@@ -6,8 +6,8 @@
#include <ArchKit/ArchKit.h>
#include <HALKit/AMD64/Processor.h>
-#include <KernelKit/MemoryMgr.h>
-#include <NewKit/KString.h>
+#include <KernelKit/HeapMgr.h>
+#include <NeKit/KString.h>
#include <modules/ACPI/ACPIFactoryInterface.h>
namespace Kernel {
diff --git a/dev/kernel/HALKit/AMD64/HalAPICController.cc b/dev/kernel/HALKit/AMD64/HalAPICController.cc
deleted file mode 100644
index 758e2f52..00000000
--- a/dev/kernel/HALKit/AMD64/HalAPICController.cc
+++ /dev/null
@@ -1,38 +0,0 @@
-/* -------------------------------------------
-
- Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved.
-
-------------------------------------------- */
-
-#include <HALKit/AMD64/Processor.h>
-#include <modules/ACPI/ACPIFactoryInterface.h>
-
-#define cIOAPICRegVal (4)
-#define cIOAPICRegReg (0)
-
-namespace Kernel::HAL {
-APICController::APICController(VoidPtr base) : fApic(base) {}
-
-/// @brief Read from APIC controller.
-/// @param reg register.
-UInt32 APICController::Read(UInt32 reg) noexcept {
- MUST_PASS(this->fApic);
-
- UInt32 volatile* io_apic = (UInt32 volatile*) this->fApic;
- io_apic[cIOAPICRegReg] = (reg & 0xFF);
-
- return io_apic[cIOAPICRegVal];
-}
-
-/// @brief Write to APIC controller.
-/// @param reg register.
-/// @param value value.
-Void APICController::Write(UInt32 reg, UInt32 value) noexcept {
- MUST_PASS(this->fApic);
-
- UInt32 volatile* io_apic = (UInt32 volatile*) this->fApic;
-
- io_apic[cIOAPICRegReg] = (reg & 0xFF);
- io_apic[cIOAPICRegVal] = value;
-}
-} // namespace Kernel::HAL
diff --git a/dev/kernel/HALKit/AMD64/HalAPICDmaWrapper.cc b/dev/kernel/HALKit/AMD64/HalAPICDmaWrapper.cc
new file mode 100644
index 00000000..6aba5b0e
--- /dev/null
+++ b/dev/kernel/HALKit/AMD64/HalAPICDmaWrapper.cc
@@ -0,0 +1,39 @@
+/* -------------------------------------------
+
+ Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved.
+
+------------------------------------------- */
+
+#include <HALKit/AMD64/Processor.h>
+#include <modules/ACPI/ACPIFactoryInterface.h>
+
+namespace Kernel::HAL {
+/***********************************************************************************/
+/// Constructors.
+/***********************************************************************************/
+LAPICDmaWrapper::LAPICDmaWrapper(VoidPtr base) : fApic(base) {}
+LAPICDmaWrapper::~LAPICDmaWrapper() = default;
+
+/***********************************************************************************/
+/// @brief Read from APIC controller.
+/// @param reg register.
+/***********************************************************************************/
+UInt32 LAPICDmaWrapper::Read(UInt16 reg) noexcept {
+ MUST_PASS(this->fApic);
+
+ UInt32 volatile* io_apic = (UInt32 volatile*) this->fApic;
+ return io_apic[reg];
+}
+
+/***********************************************************************************/
+/// @brief Write to APIC controller.
+/// @param reg register.
+/// @param value value.
+/***********************************************************************************/
+Void LAPICDmaWrapper::Write(UInt16 reg, UInt32 value) noexcept {
+ MUST_PASS(this->fApic);
+
+ UInt32 volatile* io_apic = (UInt32 volatile*) this->fApic;
+ io_apic[reg] = value;
+}
+} // namespace Kernel::HAL
diff --git a/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc b/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc
index dd9a36ed..3e10d577 100644
--- a/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc
+++ b/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc
@@ -4,27 +4,34 @@
------------------------------------------- */
+#define APIC_MAG "APIC"
+
+#define APIC_ICR_LOW 0x300
+#define APIC_ICR_HIGH 0x310
+#define APIC_SIPI_VEC 0x00500
+#define APIC_EIPI_VEC 0x00400
+
+#define LAPIC_REG_TIMER_LVT 0x320
+#define LAPIC_REG_TIMER_INITCNT 0x380
+#define LAPIC_REG_TIMER_CURRCNT 0x390
+#define LAPIC_REG_TIMER_DIV 0x3E0
+#define LAPIC_REG_ENABLE 0x80
+#define LAPIC_REG_SPURIOUS 0xF0
+
+#define APIC_BASE_MSR 0x1B
+#define APIC_BASE_MSR_BSP 0x100
+#define APIC_BASE_MSR_ENABLE 0x800
+
#include <ArchKit/ArchKit.h>
#include <HALKit/AMD64/Processor.h>
#include <KernelKit/BinaryMutex.h>
#include <KernelKit/HardwareThreadScheduler.h>
#include <KernelKit/ProcessScheduler.h>
#include <KernelKit/Timer.h>
-#include <NewKit/KernelPanic.h>
+#include <NeKit/KernelPanic.h>
#include <modules/ACPI/ACPIFactoryInterface.h>
#include <modules/CoreGfx/TextGfx.h>
-#define kAPIC_Signature "APIC"
-
-#define kAPIC_ICR_Low 0x300
-#define kAPIC_ICR_High 0x310
-#define kAPIC_SIPI_Vector 0x00500
-#define kAPIC_EIPI_Vector 0x00400
-
-#define kAPIC_BASE_MSR 0x1B
-#define kAPIC_BASE_MSR_BSP 0x100
-#define kAPIC_BASE_MSR_ENABLE 0x800
-
/// @note: _hal_switch_context is internal
///////////////////////////////////////////////////////////////////////////////////////
@@ -39,83 +46,39 @@ struct HAL_HARDWARE_THREAD;
struct HAL_HARDWARE_THREAD final {
HAL::StackFramePtr mFramePtr;
- ProcessID mProcessID{0};
- UInt8 mCoreID{0};
+ ProcessID mThreadID{0};
};
+EXTERN_C Void sched_jump_to_task(HAL::StackFramePtr stack_frame);
+
STATIC HAL_APIC_MADT* kMADTBlock = nullptr;
STATIC Bool kSMPAware = false;
STATIC Int64 kSMPCount = 0;
-STATIC UIntPtr kApicBaseAddress = 0UL;
+EXTERN_C UIntPtr kApicBaseAddress;
+
+STATIC Int32 kSMPInterrupt = 0;
+STATIC UInt64 kAPICLocales[kMaxAPInsideSched] = {0};
+STATIC VoidPtr kRawMADT = nullptr;
-STATIC Int32 kSMPInterrupt = 0;
-STATIC UInt64 kAPICLocales[kSchedProcessLimitPerTeam] = {0};
-STATIC VoidPtr kRawMADT = nullptr;
+STATIC HAL_HARDWARE_THREAD kHWThread[kSchedProcessLimitPerTeam] = {{}};
/// @brief Multiple APIC Descriptor Table.
struct HAL_APIC_MADT final SDT_OBJECT {
UInt32 Address; // Madt address
- UInt8 Flags; // Madt flags
-
- struct {
- UInt8 Type;
- UInt8 Len;
-
- union APIC {
- struct IOAPIC {
- UInt8 IoID;
- UInt8 Zero;
- UInt32 IoAddress;
- UInt32 GISBase;
- } IOAPIC;
-
- struct LAPIC_NMI {
- UInt8 Source;
- UInt8 IRQSource;
- UInt32 GSI;
- UInt16 Flags;
- } LApicNMI;
-
- struct LAPIC {
- UInt8 ProcessorID;
- UInt16 Flags;
- UInt8 LINT;
- } LAPIC;
-
- struct LAPIC_OVERRIDE {
- UInt16 Reserved;
- UInt64 Address;
- } LApicOverride;
-
- struct LAPIC_X2 {
- UInt16 Reserved;
- UInt32 x2APICID;
- UInt32 Flags;
- UInt32 AcpiID;
- } LocalApicX2;
- } Apic;
- } List[1]; // Records List
+ UInt32 Flags; // Madt flags
+ UInt8 List[1]; // Records List
};
-///////////////////////////////////////////////////////////////////////////////////////
-
-/***********************************************************************************/
-/// @brief Send IPI command to APIC.
-/// @param apic_id programmable interrupt controller id.
-/// @param vector vector interrupt.
-/// @param target target APIC adress.
-/// @return
-/***********************************************************************************/
-
-Void hal_send_start_ipi(UInt32 target, UInt32 apic_id) {
- Kernel::ke_dma_write<UInt32>(target, kAPIC_ICR_High, apic_id << 24);
- Kernel::ke_dma_write<UInt32>(target, kAPIC_ICR_Low, 0x00000500 | 0x00004000 | 0x00000000);
+struct LAPIC final {
+ UInt8 Type;
+ UInt8 Length;
+ UInt8 ProcessorID;
+ UInt8 APICID;
+ UInt32 Flags;
+};
- while (Kernel::ke_dma_read<UInt32>(target, kAPIC_ICR_Low) & 0x1000) {
- ;
- }
-}
+///////////////////////////////////////////////////////////////////////////////////////
/***********************************************************************************/
/// @brief Send end IPI for CPU.
@@ -124,36 +87,40 @@ Void hal_send_start_ipi(UInt32 target, UInt32 apic_id) {
/// @param target
/// @return
/***********************************************************************************/
-Void hal_send_sipi(UInt32 target, UInt32 apic_id, UInt8 vector) {
- Kernel::ke_dma_write<UInt32>(target, kAPIC_ICR_High, apic_id << 24);
- Kernel::ke_dma_write<UInt32>(target, kAPIC_ICR_Low,
- 0x00000600 | 0x00004000 | 0x00000000 | vector);
+Void hal_send_ipi_msg(UInt32 target, UInt32 apic_id, UInt8 vector) {
+ Kernel::ke_dma_write<UInt32>(target, APIC_ICR_HIGH, apic_id << 24);
+ Kernel::ke_dma_write<UInt32>(target, APIC_ICR_LOW, 0x00000600 | 0x00004000 | 0x00000000 | vector);
- while (Kernel::ke_dma_read<UInt32>(target, kAPIC_ICR_Low) & 0x1000) {
+ while (Kernel::ke_dma_read<UInt32>(target, APIC_ICR_LOW) & 0x1000) {
NE_UNUSED(0);
}
}
-STATIC HAL_HARDWARE_THREAD kHWThread[kSchedProcessLimitPerTeam] = {{}};
-
-EXTERN_C HAL::StackFramePtr mp_get_current_context(Int64 pid) {
- const auto process_index = pid % kSchedProcessLimitPerTeam;
+/***********************************************************************************/
+/// @brief Get current stack frame for a thread.
+/// @param thrdid The thread ID.
+/***********************************************************************************/
- return kHWThread[process_index].mFramePtr;
+EXTERN_C HAL::StackFramePtr mp_get_current_task(ThreadID thrdid) {
+ if (thrdid > kSMPCount) return nullptr;
+ return kHWThread[thrdid].mFramePtr;
}
-EXTERN_C BOOL mp_register_process(HAL::StackFramePtr stack_frame, ProcessID pid) {
- MUST_PASS(stack_frame);
+/***********************************************************************************/
+/// @brief Register current stack frame for a thread.
+/// @param stack_frame The current stack frame.
+/// @param thrdid The thread ID.
+/***********************************************************************************/
- const auto process_index = pid % kSchedProcessLimitPerTeam;
+EXTERN_C BOOL mp_register_task(HAL::StackFramePtr stack_frame, ThreadID thrdid) {
+ if (thrdid > kSMPCount) return NO;
+ if (!stack_frame) return NO;
- kHWThread[process_index].mFramePtr = stack_frame;
- kHWThread[process_index].mProcessID = pid;
+ kHWThread[thrdid].mFramePtr = stack_frame;
- kHWThread[process_index].mCoreID = kAPICLocales[0];
+ HardwareThreadScheduler::The()[thrdid].Leak()->Busy(NO);
- hal_send_sipi(kApicBaseAddress, kHWThread[process_index].mCoreID,
- (UInt8) (((UIntPtr) stack_frame->BP) >> 12));
+ sched_jump_to_task(kHWThread[thrdid].mFramePtr);
return YES;
}
@@ -162,24 +129,16 @@ EXTERN_C BOOL mp_register_process(HAL::StackFramePtr stack_frame, ProcessID pid)
/// @brief Is the current config SMP aware?
/// @return True if YES, False if not.
/***********************************************************************************/
+
Bool mp_is_smp(Void) noexcept {
return kSMPAware;
}
/***********************************************************************************/
-/// @brief Assembly symbol to bootstrap AP.
-/***********************************************************************************/
-EXTERN_C Char* hal_ap_blob_start;
-
-/***********************************************************************************/
-/// @brief Assembly symbol to bootstrap AP.
-/***********************************************************************************/
-EXTERN_C Char* hal_ap_blob_end;
-
-/***********************************************************************************/
/// @brief Fetch and enable SMP scheduler.
/// @param vendor_ptr SMP containing structure.
/***********************************************************************************/
+
Void mp_init_cores(VoidPtr vendor_ptr) noexcept {
if (!vendor_ptr) return;
@@ -188,51 +147,80 @@ Void mp_init_cores(VoidPtr vendor_ptr) noexcept {
return;
}
- auto hw_and_pow_int = PowerFactoryInterface(vendor_ptr);
- kRawMADT = hw_and_pow_int.Find(kAPIC_Signature).Leak().Leak();
+ PowerFactoryInterface hw_and_pow_int{vendor_ptr};
+ auto pwr = hw_and_pow_int.Find(APIC_MAG);
+
+ if (pwr.HasError()) {
+ kSMPAware = NO;
+ return;
+ }
+
+ kRawMADT = pwr.Leak().Leak();
kMADTBlock = reinterpret_cast<HAL_APIC_MADT*>(kRawMADT);
kSMPAware = NO;
if (kMADTBlock) {
- SizeT index = 1;
-
kSMPInterrupt = 0;
kSMPCount = 0;
- kout << "SMP: Starting APs...\r";
+ UInt32 lo = 0U, hi = 0U;
- kApicBaseAddress = kMADTBlock->Address;
+ hal_get_msr(APIC_BASE_MSR, &lo, &hi);
- while (Yes) {
- /// @note Anything bigger than x2APIC type doesn't exist.
- if (kMADTBlock->List[index].Type > 9 || kSMPCount > kSchedProcessLimitPerTeam) break;
+ UInt64 apic_base = ((UInt64) hi << 32) | lo;
- switch (kMADTBlock->List[index].Type) {
- case 0x00: {
- if (kMADTBlock->List[kSMPCount].Apic.LAPIC.ProcessorID < 1) break;
+ apic_base |= APIC_BASE_MSR_ENABLE; // Enable APIC.
- kAPICLocales[kSMPCount] = kMADTBlock->List[kSMPCount].Apic.LAPIC.ProcessorID;
- (Void)(kout << "SMP: APIC ID: " << number(kAPICLocales[kSMPCount]) << kendl);
+ lo = apic_base & 0xFFFFFFFF;
+ hi = apic_base >> 32;
+ hal_set_msr(APIC_BASE_MSR, lo, hi);
+
+ kApicBaseAddress = apic_base & 0xFFFFF000;
+
+ LAPICDmaWrapper controller{(VoidPtr) kApicBaseAddress};
+
+ controller.Write(LAPIC_REG_ENABLE, 0);
+ controller.Write(LAPIC_REG_SPURIOUS, 0x1FF); // Enable bit, spurious interrupt vector register.
+ controller.Write(LAPIC_REG_TIMER_DIV, 0b0011);
+ controller.Write(LAPIC_REG_TIMER_LVT, 0x20 | (1 << 17));
+ controller.Write(LAPIC_REG_TIMER_INITCNT, 1000000);
+
+ volatile UInt8* entry_ptr = reinterpret_cast<volatile UInt8*>(kMADTBlock->List);
+ volatile UInt8* end_ptr = ((UInt8*) kMADTBlock) + kMADTBlock->Length;
+
+ while (entry_ptr < end_ptr) {
+ UInt8 type = *entry_ptr;
+ UInt8 length = *(entry_ptr + 1);
+
+ // Avoid infinite loop on bad APIC tables.
+ if (length < 2) break;
+
+ if (type == 0) {
+ volatile LAPIC* entry_struct = (volatile LAPIC*) entry_ptr;
+
+ if (entry_struct->Flags & 0x1) {
+ kAPICLocales[kSMPCount] = entry_struct->ProcessorID;
+ kHWThread[kSMPCount].mThreadID = kAPICLocales[kSMPCount];
+
++kSMPCount;
- break;
+
+ kout << "Kind: LAPIC: ON\r";
+
+ // 0x7c00, as recommended by the Intel SDM.
+ hal_send_ipi_msg(kApicBaseAddress, entry_struct->ProcessorID, 0x7c);
+ } else {
+ kout << "Kind: LAPIC: OFF\r";
}
- default:
- break;
+ } else {
+ kout << "Kind: UNKNOWN\r";
}
- ++index;
+ entry_ptr += length;
}
- (Void)(kout << "SMP: Number of APs: " << number(kSMPCount) << kendl);
-
- // Kernel is now SMP aware.
- // That means that the scheduler is now available (on MP Kernels)
-
- kSMPAware = true;
-
- /// TODO: Notify Boot AP that it must start.
+ kSMPAware = kSMPCount > 1;
}
}
} // namespace Kernel::HAL
diff --git a/dev/kernel/HALKit/AMD64/HalApplicationProcessorGNU.s b/dev/kernel/HALKit/AMD64/HalApplicationProcessorGNU.s
deleted file mode 100644
index a8ad3b76..00000000
--- a/dev/kernel/HALKit/AMD64/HalApplicationProcessorGNU.s
+++ /dev/null
@@ -1,8 +0,0 @@
-.data
-
-.global hal_ap_blob_start /* Export the start symbol */
-.global hal_ap_blob_end /* Export the end symbol */
-
-hal_ap_blob_start:
- .incbin "HALKit/AMD64/HalApplicationProcessorStartup.bin"
-hal_ap_blob_end:
diff --git a/dev/kernel/HALKit/AMD64/HalApplicationProcessorStartup.asm b/dev/kernel/HALKit/AMD64/HalApplicationProcessorStartup.asm
deleted file mode 100644
index 09a59e4f..00000000
--- a/dev/kernel/HALKit/AMD64/HalApplicationProcessorStartup.asm
+++ /dev/null
@@ -1,79 +0,0 @@
-;; /*
-;; * ========================================================
-;; *
-;; * NeKernel
-;; * Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved.
-;; *
-;; * 25/03/25: FIX: Fix warning regarding resb being used inside a non-bss area (using no-op instead).
-;; *
-;; * ========================================================
-;; */
-
-[bits 16]
-[org 0x7c000]
-
-hal_ap_start:
- mov ax, 0x0
- mov ss, ax
- mov esp, 0x7000
-
- cli
- mov eax, cr0
- or eax, 1
- mov cr0, eax
- jmp .hal_ap_start_flush
-.hal_ap_start_flush:
- mov ax, 0x10
- mov ds, ax
- mov es, ax
- mov fs, ax
- mov gs, ax
- mov ss, ax
-
- mov eax, cr4
- or eax, 1 << 5
- mov cr4, eax
-
- mov eax, cr3
- mov cr3, eax
-
- mov ecx, 0xC0000080
- rdmsr
- or eax, 1
- wrmsr
-
- mov eax, cr0
- or eax, (1 << 31)
- mov cr0, eax
-
- jmp 0x08:hal_ap_64bit_entry
-hal_ap_end:
-
-hal_ap_length:
- dq hal_ap_end - hal_ap_start
-
-[bits 64]
-
-hal_ap_64bit_entry:
- mov ax, 0x23
- mov ds, ax
- mov es, ax
- mov fs, ax
- mov gs, ax
- mov ss, ax
- mov rsp, [hal_ap_64bit_entry_stack_end]
-
- push 0x33
- push qword [hal_ap_64bit_entry_loop]
- o64 pushf
- push rsp
- push 0x33
-
- o64 iret
-
-hal_ap_64bit_entry_loop:
- jmp $
-
-hal_ap_64bit_entry_stack:
- times 8196*2 nop
-hal_ap_64bit_entry_stack_end: \ No newline at end of file
diff --git a/dev/kernel/HALKit/AMD64/HalApplicationProcessorStartup.s b/dev/kernel/HALKit/AMD64/HalApplicationProcessorStartup.s
new file mode 100644
index 00000000..903038ea
--- /dev/null
+++ b/dev/kernel/HALKit/AMD64/HalApplicationProcessorStartup.s
@@ -0,0 +1,14 @@
+.text
+
+.global hal_ap_blob_start
+.global hal_ap_blob_length
+
+hal_ap_blob_start:
+ cli
+ hlt
+ jmp hal_ap_blob_start
+
+.data
+
+hal_ap_blob_length:
+ .long 4
diff --git a/dev/kernel/HALKit/AMD64/HalCommonAPI.asm b/dev/kernel/HALKit/AMD64/HalCommonAPI.asm
index c1dfc66a..be150dde 100644
--- a/dev/kernel/HALKit/AMD64/HalCommonAPI.asm
+++ b/dev/kernel/HALKit/AMD64/HalCommonAPI.asm
@@ -56,6 +56,8 @@ extern hal_system_call_enter
global mp_system_call_handler
mp_system_call_handler:
+ push rbp
+ mov rbp, rsp
push r8
push r9
@@ -77,6 +79,59 @@ mp_system_call_handler:
pop r9
pop r8
- o64 sysret
+ pop rbp
-[bits 16]
+ o64 iret
+
+
+section .text
+
+global sched_jump_to_task
+
+sched_jump_to_task:
+ push rbp
+ mov rbp, rsp
+
+ mov ax, 0x30
+ mov ds, ax
+ mov es, ax
+ mov fs, ax
+ mov gs, ax
+
+ mov ax, 0x18
+ ltr ax
+
+ push 0x30
+ mov rdx, [rcx + 0x08]
+ push rdx
+ o64 pushf
+ push 0x28
+ mov rdx, [rcx + 0x00]
+ push rdx
+
+ call sched_recover_registers
+
+ o64 iret
+
+global sched_idle_task
+
+sched_idle_task:
+ jmp $
+ ret
+
+sched_recover_registers:
+ push rbp
+ mov rbp, rsp
+
+ mov r8, [rcx + 0x10]
+ mov r9, [rcx + 0x18]
+ mov r10, [rcx + 0x20]
+ mov r11, [rcx + 0x28]
+ mov r12, [rcx + 0x30]
+ mov r13, [rcx + 0x38]
+ mov r14, [rcx + 0x40]
+ mov r15, [rcx + 0x48]
+
+ pop rbp
+
+ ret \ No newline at end of file
diff --git a/dev/kernel/HALKit/AMD64/HalControlRegister.s b/dev/kernel/HALKit/AMD64/HalControlRegisterAPI.s
index 631d1d55..631d1d55 100644
--- a/dev/kernel/HALKit/AMD64/HalControlRegister.s
+++ b/dev/kernel/HALKit/AMD64/HalControlRegisterAPI.s
diff --git a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc
index 84c35615..01456ae5 100644
--- a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc
+++ b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc
@@ -6,108 +6,90 @@
#include <ArchKit/ArchKit.h>
#include <KernelKit/ProcessScheduler.h>
-#include <NewKit/KString.h>
+#include <NeKit/KString.h>
#include <SignalKit/Signals.h>
-STATIC BOOL kIsScheduling = NO;
+EXTERN_C Kernel::Void idt_handle_breakpoint(Kernel::UIntPtr rip);
-/// @brief Handle GPF fault.
-/// @param rsp
-EXTERN_C void idt_handle_gpf(Kernel::UIntPtr rsp) {
- auto process = Kernel::UserProcessScheduler::The().CurrentProcess();
+EXTERN_C Kernel::UIntPtr kApicBaseAddress;
- if (process.Leak().Status != Kernel::ProcessStatusKind::kRunning) return;
+STATIC BOOL kIsRunning = NO;
- kIsScheduling = NO;
+/// @brief Notify APIC and PIC that we're done with the interrupt.
+/// @note
+STATIC void hal_idt_send_eoi(UInt8 vector) {
+ ((volatile UInt32*) kApicBaseAddress)[0xB0 / 4] = 0;
- Kernel::kout << "Kernel: General Protection Fault.\r";
+ if (vector >= kPICCommand && vector <= 0x2F) {
+ if (vector >= 0x28) {
+ Kernel::HAL::rt_out8(kPIC2Command, kPICCommand);
+ }
+ Kernel::HAL::rt_out8(kPICCommand, kPICCommand);
+ }
+}
+
+/// @brief Handle GPF fault.
+/// @param rsp
+EXTERN_C Kernel::Void idt_handle_gpf(Kernel::UIntPtr rsp) {
+ auto& process = Kernel::UserProcessScheduler::The().TheCurrentProcess();
+ process.Leak().Crash();
+
+ hal_idt_send_eoi(13);
process.Leak().Signal.SignalArg = rsp;
process.Leak().Signal.SignalID = SIGKILL;
process.Leak().Signal.Status = process.Leak().Status;
-
- Kernel::kout << "Kernel: SIGKILL status.\r";
-
- process.Leak().Status = Kernel::ProcessStatusKind::kKilled;
-
- process.Leak().Crash();
}
/// @brief Handle page fault.
/// @param rsp
EXTERN_C void idt_handle_pf(Kernel::UIntPtr rsp) {
- auto process = Kernel::UserProcessScheduler::The().CurrentProcess();
-
- if (process.Leak().Status != Kernel::ProcessStatusKind::kRunning) return;
-
- kIsScheduling = NO;
+ auto& process = Kernel::UserProcessScheduler::The().TheCurrentProcess();
+ process.Leak().Crash();
- Kernel::kout << "Kernel: Page Fault.\r";
- Kernel::kout << "Kernel: SIGKILL\r";
+ hal_idt_send_eoi(14);
process.Leak().Signal.SignalArg = rsp;
process.Leak().Signal.SignalID = SIGKILL;
process.Leak().Signal.Status = process.Leak().Status;
-
- process.Leak().Status = Kernel::ProcessStatusKind::kKilled;
-
- process.Leak().Crash();
-}
-
-namespace Kernel::Detail {
-constexpr static Int32 kTimeoutCount = 100000UL;
}
/// @brief Handle scheduler interrupt.
EXTERN_C void idt_handle_scheduler(Kernel::UIntPtr rsp) {
NE_UNUSED(rsp);
- static Kernel::Int64 try_count_before_brute = Kernel::Detail::kTimeoutCount;
-
- while (kIsScheduling) {
- --try_count_before_brute;
+ hal_idt_send_eoi(32);
- if (try_count_before_brute < 1) break;
- }
+ while (kIsRunning)
+ ;
- try_count_before_brute = Kernel::Detail::kTimeoutCount;
- kIsScheduling = YES;
+ kIsRunning = YES;
Kernel::UserProcessHelper::StartScheduling();
- kIsScheduling = NO;
+ kIsRunning = NO;
}
/// @brief Handle math fault.
/// @param rsp
EXTERN_C void idt_handle_math(Kernel::UIntPtr rsp) {
- auto process = Kernel::UserProcessScheduler::The().CurrentProcess();
-
- if (process.Leak().Status != Kernel::ProcessStatusKind::kRunning) return;
-
- kIsScheduling = NO;
+ auto& process = Kernel::UserProcessScheduler::The().TheCurrentProcess();
+ process.Leak().Crash();
- Kernel::kout << "Kernel: Math error (division by zero?).\r";
+ hal_idt_send_eoi(8);
process.Leak().Signal.SignalArg = rsp;
process.Leak().Signal.SignalID = SIGKILL;
process.Leak().Signal.Status = process.Leak().Status;
-
- Kernel::kout << "Kernel: SIGKILL status.\r";
-
- process.Leak().Status = Kernel::ProcessStatusKind::kKilled;
-
- process.Leak().Crash();
}
/// @brief Handle any generic fault.
/// @param rsp
EXTERN_C void idt_handle_generic(Kernel::UIntPtr rsp) {
- auto process = Kernel::UserProcessScheduler::The().CurrentProcess();
-
- if (process.Leak().Status != Kernel::ProcessStatusKind::kRunning) return;
+ auto& process = Kernel::UserProcessScheduler::The().TheCurrentProcess();
+ process.Leak().Crash();
- kIsScheduling = NO;
+ hal_idt_send_eoi(30);
Kernel::kout << "Kernel: Generic Process Fault.\r";
@@ -116,57 +98,32 @@ EXTERN_C void idt_handle_generic(Kernel::UIntPtr rsp) {
process.Leak().Signal.Status = process.Leak().Status;
Kernel::kout << "Kernel: SIGKILL status.\r";
-
- process.Leak().Status = Kernel::ProcessStatusKind::kKilled;
-
- process.Leak().Crash();
}
EXTERN_C Kernel::Void idt_handle_breakpoint(Kernel::UIntPtr rip) {
- auto process = Kernel::UserProcessScheduler::The().CurrentProcess();
+ auto& process = Kernel::UserProcessScheduler::The().TheCurrentProcess();
- if (process.Leak().Status != Kernel::ProcessStatusKind::kRunning) {
- Kernel::kout << "Kernel: SIGTRAP\r";
-
- while (YES)
- ;
- }
-
- kIsScheduling = NO;
-
- (Void)(Kernel::kout << "Kernel: Process RIP: " << Kernel::hex_number(rip) << Kernel::kendl);
- Kernel::kout << "Kernel: SIGTRAP\r";
+ hal_idt_send_eoi(3);
process.Leak().Signal.SignalArg = rip;
process.Leak().Signal.SignalID = SIGTRAP;
process.Leak().Signal.Status = process.Leak().Status;
- Kernel::kout << "Kernel: SIGTRAP status.\r";
-
process.Leak().Status = Kernel::ProcessStatusKind::kFrozen;
}
/// @brief Handle #UD fault.
/// @param rsp
EXTERN_C void idt_handle_ud(Kernel::UIntPtr rsp) {
- auto process = Kernel::UserProcessScheduler::The().CurrentProcess();
-
- if (process.Leak().Status != Kernel::ProcessStatusKind::kRunning) return;
-
- kIsScheduling = NO;
+ auto& process = Kernel::UserProcessScheduler::The().TheCurrentProcess();
+ process.Leak().Crash();
- Kernel::kout << "Kernel: Undefined Opcode.\r";
+ hal_idt_send_eoi(6);
process.Leak().Signal.SignalArg = rsp;
process.Leak().Signal.SignalID = SIGKILL;
process.Leak().Signal.Status = process.Leak().Status;
-
- Kernel::kout << "Kernel: SIGKILL status.\r";
-
- process.Leak().Status = Kernel::ProcessStatusKind::kKilled;
-
- process.Leak().Crash();
}
/// @brief Enter syscall from assembly.
@@ -174,20 +131,14 @@ EXTERN_C void idt_handle_ud(Kernel::UIntPtr rsp) {
/// @return nothing.
EXTERN_C Kernel::Void hal_system_call_enter(Kernel::UIntPtr rcx_syscall_index,
Kernel::UIntPtr rdx_syscall_struct) {
- if (rcx_syscall_index < kSysCalls.Count()) {
- Kernel::kout << "syscall: Enter Syscall.\r";
+ hal_idt_send_eoi(50);
+ if (rcx_syscall_index < kSysCalls.Count()) {
if (kSysCalls[rcx_syscall_index].fHooked) {
if (kSysCalls[rcx_syscall_index].fProc) {
(kSysCalls[rcx_syscall_index].fProc)((Kernel::VoidPtr) rdx_syscall_struct);
- } else {
- Kernel::kout << "syscall: syscall isn't valid at all! (is nullptr)\r";
}
- } else {
- Kernel::kout << "syscall: syscall isn't hooked at all! (is set to false)\r";
}
-
- Kernel::kout << "syscall: Exit Syscall.\r";
}
}
@@ -196,19 +147,13 @@ EXTERN_C Kernel::Void hal_system_call_enter(Kernel::UIntPtr rcx_syscall_index,
/// @return nothing.
EXTERN_C Kernel::Void hal_kernel_call_enter(Kernel::UIntPtr rcx_kerncall_index,
Kernel::UIntPtr rdx_kerncall_struct) {
- if (rcx_kerncall_index < kKernCalls.Count()) {
- Kernel::kout << "kerncall: Enter Kernel Call List.\r";
+ hal_idt_send_eoi(51);
+ if (rcx_kerncall_index < kKernCalls.Count()) {
if (kKernCalls[rcx_kerncall_index].fHooked) {
if (kKernCalls[rcx_kerncall_index].fProc) {
(kKernCalls[rcx_kerncall_index].fProc)((Kernel::VoidPtr) rdx_kerncall_struct);
- } else {
- Kernel::kout << "kerncall: Kernel call isn't valid at all! (is nullptr)\r";
}
- } else {
- Kernel::kout << "kerncall: Kernel call isn't hooked at all! (is set to false)\r";
}
-
- Kernel::kout << "kerncall: Exit Kernel Call List.\r";
}
}
diff --git a/dev/kernel/HALKit/AMD64/HalCoreSystemCalls.cc b/dev/kernel/HALKit/AMD64/HalCoreSystemCalls.cc
index 8581950f..11e773a8 100644
--- a/dev/kernel/HALKit/AMD64/HalCoreSystemCalls.cc
+++ b/dev/kernel/HALKit/AMD64/HalCoreSystemCalls.cc
@@ -3,3 +3,7 @@
Copyright (C) 2025, Amlal El Mahrouss, all rights reserved.
------------------------------------------- */
+
+#include <ArchKit/ArchKit.h>
+
+using namespace Kernel;
diff --git a/dev/kernel/HALKit/AMD64/HalDebugOutput.cc b/dev/kernel/HALKit/AMD64/HalDebugOutput.cc
index 5d14f214..b0463eb5 100644
--- a/dev/kernel/HALKit/AMD64/HalDebugOutput.cc
+++ b/dev/kernel/HALKit/AMD64/HalDebugOutput.cc
@@ -6,8 +6,8 @@
#include <ArchKit/ArchKit.h>
#include <KernelKit/DebugOutput.h>
-#include <NewKit/New.h>
-#include <NewKit/Utils.h>
+#include <NeKit/New.h>
+#include <NeKit/Utils.h>
#include <modules/CoreGfx/CoreGfx.h>
#include <modules/CoreGfx/TextGfx.h>
diff --git a/dev/kernel/HALKit/AMD64/HalDebugPort.cc b/dev/kernel/HALKit/AMD64/HalDebugProtocol.cc
index e7448aa3..8a1249ea 100644
--- a/dev/kernel/HALKit/AMD64/HalDebugPort.cc
+++ b/dev/kernel/HALKit/AMD64/HalDebugProtocol.cc
@@ -9,11 +9,8 @@
#include <ArchKit/ArchKit.h>
#include <KernelKit/DebugOutput.h>
+#include <NetworkKit/NetworkDevice.h>
// after that we have start of additional data.
-namespace Kernel {
-void rt_debug_listen(DebuggerPortHeader* theHook) noexcept {
- NE_UNUSED(theHook);
-}
-} // namespace Kernel
+namespace Kernel {} // namespace Kernel
diff --git a/dev/kernel/HALKit/AMD64/HalDescriptorLoader.cc b/dev/kernel/HALKit/AMD64/HalDescriptorLoader.cc
index 2fb6ad4c..f9749946 100644
--- a/dev/kernel/HALKit/AMD64/HalDescriptorLoader.cc
+++ b/dev/kernel/HALKit/AMD64/HalDescriptorLoader.cc
@@ -8,56 +8,10 @@
#include <FSKit/NeFS.h>
#include <HALKit/AMD64/Processor.h>
-#define kPITDefaultTicks (1000U)
-
namespace Kernel::HAL {
namespace Detail {
STATIC ::Kernel::Detail::AMD64::InterruptDescriptorAMD64 kInterruptVectorTable[kKernelIdtSize] =
{};
-
- STATIC ATTRIBUTE(unused) void hal_set_irq_mask(UInt8 irql) [[maybe_unused]] {
- UInt16 port;
- UInt8 value;
-
- if (irql < 8) {
- port = kPICData;
- } else {
- port = kPIC2Data;
- irql -= 8;
- }
-
- value = rt_in8(port) | (1 << irql);
- rt_out8(port, value);
- }
-
- STATIC void hal_clear_irq_mask(UInt8 irql) [[maybe_unused]] {
- UInt16 port;
- UInt8 value;
-
- if (irql < 8) {
- port = kPICData;
- } else {
- port = kPIC2Data;
- irql -= 8;
- }
-
- value = rt_in8(port) & ~(1 << irql);
- rt_out8(port, value);
- }
-
- STATIC Void hal_enable_pit(UInt16 ticks) noexcept {
- if (ticks == 0) ticks = kPITDefaultTicks;
-
- // Configure PIT to receieve scheduler interrupts.
-
- UInt16 kPITCommDivisor = kPITFrequency / ticks; // 100 Hz.
-
- HAL::rt_out8(kPITControlPort, 0x36); // Command to PIT
- HAL::rt_out8(kPITChannel0Port, kPITCommDivisor & 0xFF); // Send low byte
- HAL::rt_out8(kPITChannel0Port, (kPITCommDivisor >> 8) & 0xFF); // Send high byte
-
- hal_clear_irq_mask(32);
- }
} // namespace Detail
/// @brief Loads the provided Global Descriptor Table.
@@ -70,11 +24,10 @@ Void GDTLoader::Load(Register64& gdt) {
}
Void IDTLoader::Load(Register64& idt) {
+#ifndef __NE_MODULAR_KERNEL_COMPONENTS__
rt_cli();
- const Int16 kPITTickForScheduler = kPITDefaultTicks;
-
- volatile ::Kernel::UIntPtr** ptr_ivt = (volatile ::Kernel::UIntPtr**) idt.Base;
+ volatile UIntPtr** ptr_ivt = (volatile UIntPtr**) idt.Base;
for (SizeT idt_indx = 0; idt_indx < kKernelIdtSize; ++idt_indx) {
Detail::kInterruptVectorTable[idt_indx].Selector = kIDTSelector;
@@ -92,13 +45,11 @@ Void IDTLoader::Load(Register64& idt) {
idt.Base = (UIntPtr) &Detail::kInterruptVectorTable[0];
idt.Limit = sizeof(::Kernel::Detail::AMD64::InterruptDescriptorAMD64) * (kKernelIdtSize);
- Detail::hal_enable_pit(kPITTickForScheduler);
-
-#ifndef __NE_MODULAR_KERNEL_COMPONENTS__
hal_load_idt(idt);
+ rt_sti();
#endif // __NE_MODULAR_KERNEL_COMPONENTS__
- rt_sti();
+ return;
}
/// @brief Loads the Global Descriptor Table into the CPU.
diff --git a/dev/kernel/HALKit/AMD64/HalBootHeader.asm b/dev/kernel/HALKit/AMD64/HalHandoverStub.asm
index 21f8621b..a337a223 100644
--- a/dev/kernel/HALKit/AMD64/HalBootHeader.asm
+++ b/dev/kernel/HALKit/AMD64/HalHandoverStub.asm
@@ -4,8 +4,6 @@
;; * NeKernel
;; * Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved.
;; *
-;; * 25/03/25: Rename HalBootHeader.asm to HalBootHeader.asm, expose struct symbols; remove unused external symbol.
-;; *
;; * ========================================================
;; */
diff --git a/dev/kernel/HALKit/AMD64/HalInterruptAPI.asm b/dev/kernel/HALKit/AMD64/HalInterruptAPI.asm
index cc34b99f..a0ff40dc 100644
--- a/dev/kernel/HALKit/AMD64/HalInterruptAPI.asm
+++ b/dev/kernel/HALKit/AMD64/HalInterruptAPI.asm
@@ -30,6 +30,8 @@ __NE_INT_%1:
std
+ add rsp, 8
+
o64 iret
%endmacro
@@ -45,15 +47,12 @@ extern ke_io_write
extern idt_handle_ud
extern idt_handle_generic
extern idt_handle_breakpoint
+extern idt_handle_math
section .text
__NE_INT_0:
cld
-
- mov al, 0x20
- out 0x20, al
-
push rcx
call idt_handle_generic
pop rcx
@@ -64,10 +63,6 @@ __NE_INT_0:
__NE_INT_1:
cld
-
- mov al, 0x20
- out 0x20, al
-
push rcx
call idt_handle_generic
pop rcx
@@ -78,10 +73,6 @@ __NE_INT_1:
__NE_INT_2:
cld
-
- mov al, 0x20
- out 0x20, al
-
push rcx
call idt_handle_generic
pop rcx
@@ -93,12 +84,8 @@ __NE_INT_2:
;; @brief Triggers a breakpoint and freeze the process. RIP is also fetched.
__NE_INT_3:
cld
-
- mov al, 0x20
- out 0x20, al
-
push rcx
- call idt_handle_generic
+ call idt_handle_breakpoint
pop rcx
std
@@ -108,10 +95,6 @@ __NE_INT_3:
__NE_INT_4:
cld
- mov al, 0x20
- out 0x20, al
-
-
push rcx
call idt_handle_generic
pop rcx
@@ -122,10 +105,6 @@ __NE_INT_4:
__NE_INT_5:
cld
-
- mov al, 0x20
- out 0x20, al
-
std
o64 iret
@@ -133,12 +112,8 @@ __NE_INT_5:
;; Invalid opcode interrupt
__NE_INT_6:
cld
-
- mov al, 0x20
- out 0x20, al
-
push rcx
- call idt_handle_generic
+ call idt_handle_ud
pop rcx
std
@@ -147,10 +122,6 @@ __NE_INT_6:
__NE_INT_7:
cld
-
- mov al, 0x20
- out 0x20, al
-
push rcx
call idt_handle_generic
pop rcx
@@ -163,12 +134,8 @@ __NE_INT_7:
__NE_INT_8:
cld
- mov al, 0x20
- out 0xA0, al
- out 0x20, al
-
push rcx
- call idt_handle_generic
+ call idt_handle_math
pop rcx
std
@@ -184,25 +151,18 @@ IntExp 12
__NE_INT_13:
cld
- mov al, 0x20
- out 0xA0, al
- out 0x20, al
-
push rcx
call idt_handle_gpf
pop rcx
std
+ add rsp, 8
+
o64 iret
__NE_INT_14:
cld
-
- mov al, 0x20
- out 0xA0, al
- out 0x20, al
-
push rcx
call idt_handle_pf
pop rcx
@@ -232,14 +192,11 @@ IntExp 30
IntNormal 31
[extern idt_handle_scheduler]
+[extern kApicBaseAddress]
__NE_INT_32:
cld
- mov al, 0x20
- out 0xA0, al
- out 0x20, al
-
push rax
mov rcx, rsp
call idt_handle_scheduler
@@ -257,7 +214,20 @@ IntNormal 36
IntNormal 37
IntNormal 38
IntNormal 39
-IntNormal 40
+
+[extern rtl_rtl8139_interrupt_handler]
+
+__NE_INT_40:
+ cld
+
+ push rax
+ mov rcx, rsp
+ call rtl_rtl8139_interrupt_handler
+ pop rax
+
+ std
+
+ o64 iret
IntNormal 41
@@ -276,15 +246,13 @@ IntNormal 49
__NE_INT_50:
cld
- mov al, 0x20
- out 0xA0, al
- out 0x20, al
-
push rax
mov rax, hal_system_call_enter
mov rcx, r8
mov rdx, r9
+ mov r8, r10
+ mov r9, r11
call rax
pop rax
@@ -296,15 +264,13 @@ __NE_INT_50:
__NE_INT_51:
cld
- mov al, 0x20
- out 0xA0, al
- out 0x20, al
-
push rax
mov rax, hal_kernel_call_enter
mov rcx, r8
mov rdx, r9
+ mov r8, r10
+ mov r9, r11
call rax
pop rax
@@ -399,3 +365,6 @@ kInterruptVectorTable:
dq __NE_INT_%+i
%assign i i+1
%endrep
+
+kApicBaseAddress:
+ dq 0 \ No newline at end of file
diff --git a/dev/kernel/HALKit/AMD64/HalKernelMain.cc b/dev/kernel/HALKit/AMD64/HalKernelMain.cc
index 2747439a..446a1e85 100644
--- a/dev/kernel/HALKit/AMD64/HalKernelMain.cc
+++ b/dev/kernel/HALKit/AMD64/HalKernelMain.cc
@@ -14,26 +14,24 @@
#include <KernelKit/Timer.h>
#include <NetworkKit/IPC.h>
#include <StorageKit/AHCI.h>
+#include <generic_kits/BenchKit/X64Chrono.h>
#include <modules/ACPI/ACPIFactoryInterface.h>
#include <modules/CoreGfx/TextGfx.h>
#ifndef __NE_MODULAR_KERNEL_COMPONENTS__
EXTERN_C Kernel::VoidPtr kInterruptVectorTable[];
-STATIC Kernel::Void hal_pre_init_scheduler() noexcept {
- for (Kernel::SizeT i = 0U;
- i < Kernel::UserProcessScheduler::The().CurrentTeam().AsArray().Count(); ++i) {
- Kernel::UserProcessScheduler::The().CurrentTeam().AsArray()[i] = Kernel::USER_PROCESS();
- }
-}
-
/// @brief Kernel init function.
/// @param handover_hdr Handover boot header.
EXTERN_C Int32 hal_init_platform(Kernel::HEL::BootInfoHeader* handover_hdr) {
+ using namespace Kernel;
+
if (handover_hdr->f_Magic != kHandoverMagic && handover_hdr->f_Version != kHandoverVersion) {
return kEfiFail;
}
+ HAL::rt_sti();
+
kHandoverHeader = handover_hdr;
FB::fb_clear_video();
@@ -43,26 +41,31 @@ EXTERN_C Int32 hal_init_platform(Kernel::HEL::BootInfoHeader* handover_hdr) {
Boot::ExitBootServices(handover_hdr->f_HardwareTables.f_ImageKey,
handover_hdr->f_HardwareTables.f_ImageHandle);
- kKernelCR3 = kHandoverHeader->f_PageStart;
+ kKernelVM = kHandoverHeader->f_PageStart;
- hal_write_cr3(kKernelCR3);
+ hal_write_cr3(kKernelVM);
/************************************** */
/* INITIALIZE BIT MAP. */
/************************************** */
- kKernelBitMpSize = kHandoverHeader->f_BitMapSize;
- kKernelBitMpStart = reinterpret_cast<Kernel::VoidPtr>(
- reinterpret_cast<Kernel::UIntPtr>(kHandoverHeader->f_BitMapStart));
+ kKernelBitMpSize = kHandoverHeader->f_BitMapSize;
+ kKernelBitMpStart =
+ reinterpret_cast<VoidPtr>(reinterpret_cast<UIntPtr>(kHandoverHeader->f_BitMapStart));
/************************************** */
/* INITIALIZE GDT AND SEGMENTS. */
/************************************** */
- STATIC CONST auto kGDTEntriesCount = 6;
+ STATIC CONST auto kGDTEntriesCount = 8;
+
+ STATIC HAL::Detail::NE_TSS kKernelTSS{};
- /* GDT, mostly descriptors for user and kernel segments. */
- STATIC Kernel::HAL::Detail::NE_GDT_ENTRY ALIGN(0x08) kGDTArray[kGDTEntriesCount] = {
+ kKernelTSS.fRsp0 = (UInt64) kHandoverHeader->f_StackTop;
+ kKernelTSS.fIopb = sizeof(HAL::Detail::NE_TSS);
+
+ /* The GDT, mostly descriptors for user and kernel segments. */
+ STATIC HAL::Detail::NE_GDT_ENTRY ALIGN(0x08) kGDTArray[kGDTEntriesCount] = {
{.fLimitLow = 0,
.fBaseLow = 0,
.fBaseMid = 0,
@@ -81,6 +84,8 @@ EXTERN_C Int32 hal_init_platform(Kernel::HEL::BootInfoHeader* handover_hdr) {
.fAccessByte = 0x92,
.fFlags = 0xCF,
.fBaseHigh = 0}, // Kernel data
+ {}, // TSS data low
+ {}, // TSS data high
{.fLimitLow = 0x0,
.fBaseLow = 0,
.fBaseMid = 0,
@@ -95,63 +100,70 @@ EXTERN_C Int32 hal_init_platform(Kernel::HEL::BootInfoHeader* handover_hdr) {
.fBaseHigh = 0}, // User data
};
+ kGDTArray[3].fLimitLow = sizeof(HAL::Detail::NE_TSS) - 1;
+ kGDTArray[3].fBaseLow = ((UIntPtr) &kKernelTSS) & 0xFFFF;
+ kGDTArray[3].fBaseMid = (((UIntPtr) &kKernelTSS) >> 16) & 0xFF;
+ kGDTArray[3].fAccessByte = 0x89; // Present, type 9 = 64-bit available TSS
+ kGDTArray[3].fFlags = 0x20 | ((((UIntPtr) &kKernelTSS) >> 24) & 0x0F);
+ kGDTArray[3].fBaseHigh = (((UIntPtr) &kKernelTSS) >> 24) & 0xFF;
+
+ kGDTArray[4].fLimitLow = ((UIntPtr) &kKernelTSS >> 32) & 0xFFFF;
+ kGDTArray[4].fBaseLow = 0;
+ kGDTArray[4].fBaseMid = 0;
+ kGDTArray[4].fAccessByte = 0;
+ kGDTArray[4].fFlags = 0;
+ kGDTArray[4].fBaseHigh = 0;
+
// Load memory descriptors.
- Kernel::HAL::Register64 gdt_reg;
+ HAL::Register64 gdt_reg;
- gdt_reg.Base = reinterpret_cast<Kernel::UIntPtr>(kGDTArray);
- gdt_reg.Limit = (sizeof(Kernel::HAL::Detail::NE_GDT_ENTRY) * kGDTEntriesCount) - 1;
+ gdt_reg.Base = reinterpret_cast<UIntPtr>(kGDTArray);
+ gdt_reg.Limit = (sizeof(HAL::Detail::NE_GDT_ENTRY) * kGDTEntriesCount) - 1;
//! GDT will load hal_read_init after it successfully loads the segments.
- Kernel::HAL::GDTLoader gdt_loader;
+ HAL::GDTLoader gdt_loader;
gdt_loader.Load(gdt_reg);
return kEfiFail;
}
EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept {
- hal_pre_init_scheduler();
-
-#ifdef __FSKIT_INCLUDES_HEFS__
- Kernel::HeFS::fs_init_hefs();
-#elif defined(__FSKIT_INCLUDES_NEFS__)
- Kernel::NeFS::fs_init_nefs();
-#endif
+ using namespace Kernel;
- Kernel::HAL::mp_init_cores(kHandoverHeader->f_HardwareTables.f_VendorPtr);
-
- Kernel::HAL::Register64 idt_reg;
- idt_reg.Base = (Kernel::UIntPtr) kInterruptVectorTable;
-
- Kernel::HAL::IDTLoader idt_loader;
-
- idt_loader.Load(idt_reg);
-
- /// after the scheduler runs, we must look over teams, every 5000s in order to schedule every
- /// process according to their affinity fairly.
+ for (SizeT index = 0UL; index < HardwareThreadScheduler::The().Capacity(); ++index) {
+ HardwareThreadScheduler::The()[index].Leak()->Kind() = ThreadKind::kAPStandard;
+ HardwareThreadScheduler::The()[index].Leak()->ID() = index;
+ HardwareThreadScheduler::The()[index].Leak()->Busy(NO);
+ }
- auto constexpr kSchedTeamSwitchMS = 5U; /// @brief Team switch time in milliseconds.
+ for (SizeT index = 0UL; index < UserProcessScheduler::The().TheCurrentTeam().AsArray().Count();
+ ++index) {
+ UserProcessScheduler::The().TheCurrentTeam().AsArray()[index].Status =
+ ProcessStatusKind::kInvalid;
+ }
- Kernel::HardwareTimer timer(rtl_milliseconds(kSchedTeamSwitchMS));
+ rtl_create_user_process(sched_idle_task, "MgmtSrv"); //! Mgmt command server.
+ rtl_create_user_process(sched_idle_task, "LaunchSrv"); //! launchd
+ rtl_create_user_process(sched_idle_task, "SecSrv"); //! Login Server
- STATIC Kernel::Array<UserProcessTeam, kSchedTeamCount> kTeams;
+ HAL::mp_init_cores(kHandoverHeader->f_HardwareTables.f_VendorPtr);
- static SizeT team_index = 0U;
+#ifdef __FSKIT_INCLUDES_HEFS__
+ HeFS::fs_init_hefs();
+#endif
- /// @brief This just loops over the teams and switches between them.
- /// @details Not even round-robin, just a simple loop in this boot core we're at.
- while (YES) {
- if (team_index > (kSchedTeamCount - 1)) {
- team_index = 0U;
- }
+#ifdef __FSKIT_INCLUDES_NEFS__
+ NeFS::fs_init_nefs();
+#endif
- kTeams[team_index].Id() = team_index;
+ HAL::Register64 idt_reg;
+ idt_reg.Base = reinterpret_cast<UIntPtr>(kInterruptVectorTable);
- while (!UserProcessScheduler::The().SwitchTeam(kTeams[team_index]))
- ;
+ HAL::IDTLoader idt_loader;
- timer.Wait();
+ idt_loader.Load(idt_reg);
- ++team_index;
- }
+ while (YES)
+ ;
}
#endif // ifndef __NE_MODULAR_KERNEL_COMPONENTS__
diff --git a/dev/kernel/HALKit/AMD64/HalKernelPanic.cc b/dev/kernel/HALKit/AMD64/HalKernelPanic.cc
index 7ec235bd..374c7302 100644
--- a/dev/kernel/HALKit/AMD64/HalKernelPanic.cc
+++ b/dev/kernel/HALKit/AMD64/HalKernelPanic.cc
@@ -9,9 +9,9 @@
#include <KernelKit/DebugOutput.h>
#include <KernelKit/FileMgr.h>
#include <KernelKit/Timer.h>
-#include <NewKit/KString.h>
-#include <NewKit/KernelPanic.h>
-#include <NewKit/Utils.h>
+#include <NeKit/KString.h>
+#include <NeKit/KernelPanic.h>
+#include <NeKit/Utils.h>
#include <modules/CoreGfx/CoreGfx.h>
#include <modules/CoreGfx/TextGfx.h>
@@ -31,6 +31,7 @@ class RecoveryFactory final {
/***********************************************************************************/
Void ke_panic(const Kernel::Int32& id, const Char* message) {
(Void)(kout << "*** STOP ***\r");
+
(Void)(kout << "Kernel_Panic_MSG: " << message << kendl);
(Void)(kout << "Kernel_Panic_ID: " << hex_number(id) << kendl);
(Void)(kout << "Kernel_Panic_CR2: " << hex_number((UIntPtr) hal_read_cr2()) << kendl);
@@ -46,8 +47,10 @@ Void RecoveryFactory::Recover() noexcept {
void ke_runtime_check(bool expr, const Char* file, const Char* line) {
if (!expr) {
- (Void)(kout << "Kernel_Panic_File: " << file << kendl);
- (Void)(kout << "Kernel_Panic_Line: " << line << kendl);
+ (Void)(kout << "*** CHECK ***\r");
+
+ (Void)(kout << "Kernel_Panic_FILE: " << file << kendl);
+ (Void)(kout << "Kernel_Panic_LINE: " << line << kendl);
ke_panic(RUNTIME_CHECK_FAILED, file); // Runtime Check failed
}
diff --git a/dev/kernel/HALKit/AMD64/HalPagingMgrAMD64.cc b/dev/kernel/HALKit/AMD64/HalPagingMgr.cc
index 4681b5e5..048cb7c2 100644
--- a/dev/kernel/HALKit/AMD64/HalPagingMgrAMD64.cc
+++ b/dev/kernel/HALKit/AMD64/HalPagingMgr.cc
@@ -57,7 +57,7 @@ STATIC Void mmi_page_status(Detail::PTE* pte) {
/// @param virt a valid virtual address.
/// @return Physical address.
/***********************************************************************************/
-UIntPtr mm_get_phys_address(VoidPtr virt) {
+EXTERN_C UIntPtr mm_get_page_addr(VoidPtr virt) {
const UInt64 kVMAddr = (UInt64) virt;
const UInt64 kMask9Bits = 0x1FFULL;
const UInt64 kPageOffsetMask = 0xFFFULL;
@@ -102,7 +102,7 @@ UIntPtr mm_get_phys_address(VoidPtr virt) {
/// @brief clflush+mfence helper function.
/***********************************************************************************/
EXTERN_C Int32 mm_memory_fence(VoidPtr virtual_address) {
- if (!virtual_address || !mm_get_phys_address(virtual_address)) return kErrorInvalidData;
+ if (!virtual_address || !mm_get_page_addr(virtual_address)) return kErrorInvalidData;
asm volatile("clflush (%0)" : : "r"(virtual_address) : "memory");
asm volatile("mfence" ::: "memory");
diff --git a/dev/kernel/HALKit/AMD64/HalProcessorAMD64.cc b/dev/kernel/HALKit/AMD64/HalProcessor.cc
index 66f27c24..6ebbea08 100644
--- a/dev/kernel/HALKit/AMD64/HalProcessorAMD64.cc
+++ b/dev/kernel/HALKit/AMD64/HalProcessor.cc
@@ -16,6 +16,20 @@
*/
namespace Kernel::HAL {
+inline Bool hal_has_msr() noexcept {
+ static UInt32 eax, unused, edx; // eax, edx
+
+ __get_cpuid(1, &eax, &unused, &unused, &edx);
+
+ // edx returns the flag for MSR (which is 1 shifted to 5.)
+ return edx & (1 << 5);
+}
+
+Void hal_get_msr(UInt32 msr, UInt32* lo, UInt32* hi) noexcept {
+ if (!lo || !hi) return;
+ asm volatile("rdmsr" : "=a"(*lo), "=d"(*hi) : "c"(msr));
+}
+
Void hal_set_msr(UInt32 msr, UInt32 lo, UInt32 hi) noexcept {
asm volatile("wrmsr" : : "a"(lo), "d"(hi), "c"(msr));
}
diff --git a/dev/kernel/HALKit/AMD64/HalSchedulerCorePrimitivesAMD64.cc b/dev/kernel/HALKit/AMD64/HalSchedulerCorePrimitives.cc
index 8f7ffdaf..0c468e14 100644
--- a/dev/kernel/HALKit/AMD64/HalSchedulerCorePrimitivesAMD64.cc
+++ b/dev/kernel/HALKit/AMD64/HalSchedulerCorePrimitives.cc
@@ -25,7 +25,7 @@ EXTERN_C Void __zka_pure_call(USER_PROCESS* process) {
EXTERN_C Bool hal_check_stack(HAL::StackFramePtr stack_ptr) {
if (!stack_ptr) return No;
- return stack_ptr->SP != 0 && stack_ptr->BP != 0;
+ return stack_ptr->SP != 0 && stack_ptr->IP != 0;
}
/// @brief Wakes up thread.
diff --git a/dev/kernel/HALKit/AMD64/HalTimerAMD64.cc b/dev/kernel/HALKit/AMD64/HalTimer.cc
index 79165289..13573880 100644
--- a/dev/kernel/HALKit/AMD64/HalTimerAMD64.cc
+++ b/dev/kernel/HALKit/AMD64/HalTimer.cc
@@ -17,6 +17,8 @@
// timer slot 0
+#define kHPETSignature ("HPET")
+
#define kHPETCounterRegValue (0x00)
#define kHPETConfigRegValue (0x20)
#define kHPETCompRegValue (0x24)
@@ -46,7 +48,7 @@ using namespace Kernel;
HardwareTimer::HardwareTimer(UInt64 ms) : fWaitFor(ms) {
auto power = PowerFactoryInterface(kHandoverHeader->f_HardwareTables.f_VendorPtr);
- auto hpet = (Detail::HPET_BLOCK*) power.Find("HPET").Leak().Leak();
+ auto hpet = (Detail::HPET_BLOCK*) power.Find(kHPETSignature).Leak().Leak();
MUST_PASS(hpet);
fDigitalTimer = (UInt8*) hpet->address.Address;
diff --git a/dev/kernel/HALKit/AMD64/HalUtilsAPI.asm b/dev/kernel/HALKit/AMD64/HalUtilsAPI.asm
index ab639992..11336229 100644
--- a/dev/kernel/HALKit/AMD64/HalUtilsAPI.asm
+++ b/dev/kernel/HALKit/AMD64/HalUtilsAPI.asm
@@ -22,5 +22,3 @@ rt_install_tib:
ret
;; //////////////////////////////////////////////////// ;;
-
-[extern kApicMadtAddressesCount]
diff --git a/dev/kernel/HALKit/AMD64/Hypervisor.h b/dev/kernel/HALKit/AMD64/Hypervisor.h
index df88b02b..5702c8e2 100644
--- a/dev/kernel/HALKit/AMD64/Hypervisor.h
+++ b/dev/kernel/HALKit/AMD64/Hypervisor.h
@@ -6,7 +6,7 @@
#pragma once
-#include <NewKit/Defines.h>
+#include <NeKit/Defines.h>
namespace Kernel {
MAKE_STRING_ENUM(HYPERVISOR)
diff --git a/dev/kernel/HALKit/AMD64/Network/Generic+Basic+RTL8139.cc b/dev/kernel/HALKit/AMD64/Network/Generic+Basic+RTL8139.cc
new file mode 100644
index 00000000..3ccbfa24
--- /dev/null
+++ b/dev/kernel/HALKit/AMD64/Network/Generic+Basic+RTL8139.cc
@@ -0,0 +1,114 @@
+/* -------------------------------------------
+
+Copyright (C) 2025, Amlal El Mahrouss, all rights reserved.
+
+------------------------------------------- */
+
+#include <DmaKit/DmaPool.h>
+#include <HALKit/AMD64/Processor.h>
+#include <modules/ACPI/ACPIFactoryInterface.h>
+
+using namespace Kernel;
+using namespace Kernel::HAL;
+
+STATIC UInt16 kRTLIOBase = 0xFFFF;
+
+STATIC BOOL kTXEnabled = NO;
+
+STATIC UInt32 kRXOffset = 0UL;
+
+STATIC constexpr CONST UInt32 kRXBufferSize = 8192 + 16 + 1500;
+
+STATIC UInt8* kRXUpperLayer = nullptr;
+STATIC UInt8* kRXBuffer = nullptr;
+
+/***********************************************************************************/
+///@brief RTL8139 Init routine.
+/***********************************************************************************/
+
+EXTERN_C Void rtl_init_nic_rtl8139(UInt16 io_base) noexcept {
+ if (kTXEnabled) return;
+
+ kRTLIOBase = io_base;
+
+ MUST_PASS(io_base != 0xFFFF);
+
+ kRXBuffer = reinterpret_cast<UInt8*>(rtl_dma_alloc(sizeof(UInt8) * kRXBufferSize, 0));
+
+ MUST_PASS(kRXBuffer);
+
+ /// Reset first.
+
+ rt_out8(io_base + 0x37, 0x10);
+
+ UInt16 timeout = 0U;
+
+ while (rt_in8(io_base + 0x37) & 0x10) {
+ ++timeout;
+ if (timeout > 0x1000) break;
+ }
+
+ if (timeout <= 0x1000) {
+ ke_panic(RUNTIME_CHECK_BAD_BEHAVIOR, "RTL8139: Reset failed");
+ return;
+ }
+
+ rt_out32(io_base + 0x30, (UInt32) (UIntPtr) kRXBuffer);
+
+ rt_out8(io_base + 0x37, 0x0C);
+
+ rt_out32(io_base + 0x44, 0xF | (1 << 7));
+
+ rt_out16(io_base + 0x3C, 0x0005);
+
+ kTXEnabled = YES;
+}
+
+/***********************************************************************************/
+/// @brief RTL8139 I/O interrupt handler.
+/// @note This function is called when the device interrupts to retrieve network data.
+/***********************************************************************************/
+
+EXTERN_C void rtl_rtl8139_interrupt_handler() {
+ if (kRTLIOBase == 0xFFFF) return;
+
+ UInt16 status = rt_in16(kRTLIOBase + 0x3E);
+ rt_out16(kRTLIOBase + 0x3E, status);
+
+ if (status & 0x01) {
+ // While we receive data.
+ while ((rt_in8(kRTLIOBase + 0x37) & 0x01) == 0) {
+ // We grab an offset from the RX buffer.
+ UInt32 offset = kRXOffset % kRXBufferSize;
+
+ // If the offset is too high, we reset it.
+ if (offset >= (kRXBufferSize - 16)) {
+ kRXOffset = 0UL;
+ offset = 0UL;
+ }
+
+ volatile UInt8* packet = kRXBuffer + offset + 4;
+ UInt16 len = *(UInt16*) (kRXBuffer + offset + 2);
+
+ kRXUpperLayer[(offset + 4)] = *packet;
+ kRXOffset += (len + 4);
+
+ rt_out16(kRTLIOBase + 0x38, (UInt16) (kRXOffset - 16));
+ }
+ }
+
+ if (!(status & 0x04)) {
+ err_global_get() = kErrorNoNetwork;
+ }
+}
+
+/***********************************************************************************/
+/// @brief RTL8139 get upper layer function
+/// @return the upper layer.
+/// @retval nullptr if no upper layer is set.
+/// @retval pointer to the upper layer if set.
+/***********************************************************************************/
+
+EXTERN_C UInt8* rtl_rtl8139_get_upper_layer() {
+ return kRXUpperLayer;
+} \ No newline at end of file
diff --git a/dev/kernel/HALKit/AMD64/Paging.h b/dev/kernel/HALKit/AMD64/Paging.h
index cfba232c..079acde4 100644
--- a/dev/kernel/HALKit/AMD64/Paging.h
+++ b/dev/kernel/HALKit/AMD64/Paging.h
@@ -6,13 +6,15 @@
#pragma once
+#ifdef __NE_AMD64__
+
/** ---------------------------------------------------
* THIS FILE CONTAINS CODE FOR X86_64 PAGING.
------------------------------------------------------- */
-#include <NewKit/Defines.h>
+#include <NeKit/Defines.h>
#ifndef kPageMax
#define kPageMax (0x200)
@@ -63,6 +65,27 @@ auto mm_free_bitmap(VoidPtr page_ptr) -> Bool;
} // namespace Kernel::HAL
namespace Kernel {
-typedef VoidPtr PTE;
-typedef VoidPtr PDE;
+struct PTE {
+ UInt64 Present : 1;
+ UInt64 Wr : 1;
+ UInt64 User : 1;
+ UInt64 Pwt : 1; // Page-level Write-Through
+ UInt64 Pcd : 1; // Page-level Cache Disable
+ UInt64 Accessed : 1;
+ UInt64 Dirty : 1;
+ UInt64 Pat : 1; // Page Attribute Table (or PS for PDE)
+ UInt64 Global : 1;
+ UInt64 Ignored1 : 3; // Available to software
+ UInt64 PhysicalAddress : 40; // Physical page frame address (bits 12–51)
+ UInt64 Ignored2 : 7; // More software bits / reserved
+ UInt64 ProtectionKey : 4; // Optional (if PKU enabled)
+ UInt64 Reserved : 1; // Usually reserved
+ UInt64 Nx : 1; // No Execute
+};
+
+struct PDE {
+ ATTRIBUTE(aligned(kib_cast(4))) PTE fPTE[512];
+};
} // namespace Kernel
+
+#endif // __NE_AMD64__ \ No newline at end of file
diff --git a/dev/kernel/HALKit/AMD64/Processor.h b/dev/kernel/HALKit/AMD64/Processor.h
index e1ce8718..80dc7a1d 100644
--- a/dev/kernel/HALKit/AMD64/Processor.h
+++ b/dev/kernel/HALKit/AMD64/Processor.h
@@ -13,11 +13,15 @@
#pragma once
+#ifdef __NE_AMD64__
+
#include <FirmwareKit/Handover.h>
#include <HALKit/AMD64/Paging.h>
-#include <NewKit/Array.h>
-#include <NewKit/Defines.h>
-#include <NewKit/Utils.h>
+#include <NeKit/Array.h>
+#include <NeKit/Defines.h>
+#include <NeKit/Utils.h>
+
+#include <HALKit/AMD64/CPUID.h>
#define kPITControlPort (0x43)
#define kPITChannel0Port (0x40)
@@ -28,7 +32,8 @@
#define kPIC2Command (0xA0)
#define kPIC2Data (0xA1)
-#include <HALKit/AMD64/CPUID.h>
+#define kIOAPICRegVal (4)
+#define kIOAPICRegReg (0)
#define rtl_nop_op() asm volatile("nop")
@@ -70,7 +75,7 @@ enum {
kMMFlagsNX = 1 << 4,
kMMFlagsPCD = 1 << 5,
kMMFlagsPwt = 1 << 6,
- kMMFlagsCount = 4,
+ kMMFlagsCount = 6,
};
struct PACKED Register64 final {
@@ -83,18 +88,17 @@ using Reg = RawRegister;
using InterruptId = UInt16; /* For each element in the IVT */
/// @brief Stack frame (as retrieved from assembly.)
-struct PACKED StackFrame final {
- RawRegister R8{0};
- RawRegister R9{0};
- RawRegister R10{0};
- RawRegister FS{0};
- RawRegister R12{0};
- RawRegister R13{0};
- RawRegister R14{0};
- RawRegister R15{0};
- RawRegister GS{0};
- RawRegister SP{0};
- RawRegister BP{0};
+struct PACKED StackFrame {
+ Reg IP;
+ Reg SP;
+ Reg R8;
+ Reg R9;
+ Reg R10;
+ Reg R11;
+ Reg R12;
+ Reg R13;
+ Reg R14;
+ Reg R15;
};
typedef StackFrame* StackFramePtr;
@@ -170,16 +174,7 @@ Void mp_init_cores(VoidPtr vendor_ptr) noexcept;
/// @retval true it does exists.
/// @retval false it doesn't.
/***********************************************************************************/
-inline Bool hal_has_msr() noexcept {
- static UInt32 eax, unused, edx; // eax, edx
-
- __get_cpuid(1, &eax, &unused, &unused, &edx);
-
- // edx returns the flag for MSR (which is 1 shifted to 5.)
- return edx & (1 << 5);
-}
-
-UIntPtr mm_get_phys_address(VoidPtr virtual_address);
+Bool hal_has_msr() noexcept;
/***********************************************************************************/
/// @brief Get Model specific register inside core.
@@ -187,13 +182,7 @@ UIntPtr mm_get_phys_address(VoidPtr virtual_address);
/// @param lo low byte
/// @param hi high byte
/***********************************************************************************/
-inline UInt32 hal_get_msr(UInt32 msr, UInt32* lo, UInt32* hi) noexcept {
- if (!lo || !hi) return 0;
-
- asm volatile("rdmsr" : "=a"(*lo), "=d"(*hi) : "c"(msr));
-
- return *lo + *hi;
-}
+Void hal_get_msr(UInt32 msr, UInt32* lo, UInt32* hi) noexcept;
/// @brief Set Model-specific register.
/// @param msr MSR
@@ -236,16 +225,16 @@ namespace Detail {
};
} // namespace Detail
-class APICController final {
+class LAPICDmaWrapper final {
public:
- explicit APICController(VoidPtr base);
- ~APICController() = default;
+ explicit LAPICDmaWrapper(VoidPtr base);
+ ~LAPICDmaWrapper();
- NE_COPY_DEFAULT(APICController)
+ NE_COPY_DEFAULT(LAPICDmaWrapper)
public:
- UInt32 Read(UInt32 reg) noexcept;
- Void Write(UInt32 reg, UInt32 value) noexcept;
+ UInt32 Read(UInt16 reg) noexcept;
+ Void Write(UInt16 reg, UInt32 value) noexcept;
private:
VoidPtr fApic{nullptr};
@@ -273,6 +262,8 @@ EXTERN_C Void rt_sti();
EXTERN_C Void rt_cld();
EXTERN_C Void rt_std();
+EXTERN_C UIntPtr mm_get_page_addr(VoidPtr virtual_address);
+
EXTERN_C Int32 mm_memory_fence(VoidPtr virtual_address);
} // namespace Kernel::HAL
@@ -287,4 +278,4 @@ EXTERN_C ATTRIBUTE(naked) Kernel::Void hal_load_gdt(Kernel::HAL::Register64 ptr)
inline Kernel::VoidPtr kKernelBitMpStart = nullptr;
inline Kernel::UIntPtr kKernelBitMpSize = 0UL;
-inline Kernel::VoidPtr kKernelCR3 = nullptr; \ No newline at end of file
+#endif // __NE_AMD64__ */ \ No newline at end of file
diff --git a/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc b/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc
index 21483560..b30bfc32 100644
--- a/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc
+++ b/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc
@@ -15,6 +15,7 @@
*
*/
+#include <DmaKit/DmaPool.h>
#include <FirmwareKit/EPM.h>
#include <KernelKit/DeviceMgr.h>
#include <KernelKit/DriveMgr.h>
@@ -23,9 +24,8 @@
#include <KernelKit/PCI/Iterator.h>
#include <KernelKit/ProcessScheduler.h>
#include <KernelKit/Timer.h>
-#include <NewKit/Utils.h>
+#include <NeKit/Utils.h>
#include <StorageKit/AHCI.h>
-#include <StorageKit/DmaPool.h>
#include <modules/AHCI/AHCI.h>
#include <modules/ATA/ATA.h>
@@ -54,7 +54,6 @@
using namespace Kernel;
-STATIC HardwareTimer kSATATimer(rtl_milliseconds(5));
STATIC PCI::Device kSATADev;
STATIC HbaMemRef kSATAHba;
STATIC Lba kSATASectorCount = 0UL;
@@ -360,7 +359,7 @@ STATIC Bool drv_init_command_structures_ahci() {
return NO;
}
- UIntPtr clb_phys = HAL::mm_get_phys_address(clb_mem);
+ UIntPtr clb_phys = HAL::mm_get_page_addr(clb_mem);
kSATAHba->Ports[kSATAIndex].Clb = (UInt32) (clb_phys & 0xFFFFFFFF);
kSATAHba->Ports[kSATAIndex].Clbu = (UInt32) (clb_phys >> 32);
@@ -380,7 +379,7 @@ STATIC Bool drv_init_command_structures_ahci() {
return NO;
}
- UIntPtr ct_phys = HAL::mm_get_phys_address(ct_mem);
+ UIntPtr ct_phys = HAL::mm_get_page_addr(ct_mem);
header[i].Ctba = (UInt32) (ct_phys & 0xFFFFFFFF);
header[i].Ctbau = (UInt32) (ct_phys >> 32);
diff --git a/dev/kernel/HALKit/AMD64/Storage/PIO+Generic+Next.cc b/dev/kernel/HALKit/AMD64/Storage/PIO+Generic+Next.cc
deleted file mode 100644
index dd6b9aea..00000000
--- a/dev/kernel/HALKit/AMD64/Storage/PIO+Generic+Next.cc
+++ /dev/null
@@ -1,280 +0,0 @@
-/* -------------------------------------------
-
- Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved.
-
-------------------------------------------- */
-
-/**
- * @file PIO+Generic.cc
- * @author Amlal El Mahrouss (amlal@nekernel.org)
- * @brief ATA driver (PIO mode).
- * @version 0.1
- * @date 2024-02-02
- *
- * @copyright Copyright (c) Amlal El Mahrouss
- *
- */
-
-#if 0
-
-#include <ArchKit/ArchKit.h>
-#include <KernelKit/DriveMgr.h>
-#include <StorageKit/ATA.h>
-#include <modules/ATA/ATA.h>
-
-using namespace Kernel;
-using namespace Kernel::HAL;
-
-/// BUGS: 0
-
-#define kATADataLen 256
-
-STATIC Boolean kATADetected = false;
-STATIC UInt16 kATAIdentifyData[kATADataLen] = {0};
-STATIC Char kATADiskModel[50] = {"GENERIC PIO"};
-
-static Boolean drv_pio_std_wait_io(UInt16 IO) {
- for (int i = 0; i < 400; i++) rt_in8(IO + ATA_REG_STATUS);
-
-ATAWaitForIO_Retry:
- auto stat_rdy = rt_in8(IO + ATA_REG_STATUS);
-
- if ((stat_rdy & ATA_SR_BSY)) goto ATAWaitForIO_Retry;
-
-ATAWaitForIO_Retry2:
- stat_rdy = rt_in8(IO + ATA_REG_STATUS);
-
- if (stat_rdy & ATA_SR_ERR) return false;
-
- if (!(stat_rdy & ATA_SR_DRDY)) goto ATAWaitForIO_Retry2;
-
- return true;
-}
-
-STATIC Void drv_pio_std_select(UInt16 Bus) {
- if (Bus == ATA_PRIMARY_IO)
- rt_out8(Bus + ATA_REG_HDDEVSEL, ATA_PRIMARY_SEL);
- else
- rt_out8(Bus + ATA_REG_HDDEVSEL, ATA_SECONDARY_SEL);
-}
-
-Boolean drv_pio_std_init(UInt16 Bus, UInt8 Drive, UInt16& OutBus, UInt8& OutMaster) {
- UInt16 IO = Bus;
-
- NE_UNUSED(Drive);
-
- drv_pio_std_select(IO);
-
- // Bus init, NEIN bit.
- rt_out8(IO + ATA_REG_NEIN, 1);
-
- // identify until it's good.
-ATAInit_Retry:
- auto stat_rdy = rt_in8(IO + ATA_REG_STATUS);
-
- if (stat_rdy & ATA_SR_ERR) {
- return false;
- }
-
- if ((stat_rdy & ATA_SR_BSY)) goto ATAInit_Retry;
-
- OutBus = (Bus == ATA_PRIMARY_IO) ? ATA_PRIMARY_IO : ATA_SECONDARY_IO;
- OutMaster = (Bus == ATA_PRIMARY_IO) ? ATA_MASTER : ATA_SLAVE;
-
- drv_pio_std_select(IO);
-
- rt_out8(OutBus + ATA_REG_COMMAND, ATA_CMD_IDENTIFY);
-
- while (!(rt_in8(IO + ATA_REG_STATUS) & ATA_SR_DRQ));
-
-
- /// fetch serial info
- /// model, speed, number of sectors...
-
- for (SizeT i = 0ul; i < kATADataLen; ++i) {
- kATAIdentifyData[i] = rt_in16(OutBus + ATA_REG_DATA);
- }
-
- for (Int32 i = 0; i < 20; i++) {
- kATADiskModel[i * 2] = (kATAIdentifyData[27 + i] >> 8) & 0xFF;
- kATADiskModel[i * 2 + 1] = kATAIdentifyData[27 + i] & 0xFF;
- }
-
- kATADiskModel[40] = '\0';
-
- (Void)(kout << "Drive Model: " << kATADiskModel << kendl);
-
- return true;
-}
-
-Void drv_pio_std_read(UInt64 Lba, UInt16 IO, UInt8 Master, Char* Buf, SizeT SectorSz, SizeT Size) {
- Lba /= SectorSz;
-
- UInt8 Command = ((!Master) ? 0xE0 : 0xF0);
-
- drv_pio_std_wait_io(IO);
- drv_pio_std_select(IO);
-
- rt_out8(IO + ATA_REG_HDDEVSEL, (Command) | (((Lba) >> 24) & 0x0F));
-
- rt_out8(IO + ATA_REG_SEC_COUNT0, ((Size + SectorSz) / SectorSz));
-
- rt_out8(IO + ATA_REG_LBA0, (Lba) & 0xFF);
- rt_out8(IO + ATA_REG_LBA1, (Lba) >> 8);
- rt_out8(IO + ATA_REG_LBA2, (Lba) >> 16);
- rt_out8(IO + ATA_REG_LBA3, (Lba) >> 24);
-
- rt_out8(IO + ATA_REG_COMMAND, ATA_CMD_READ_PIO);
-
- while (!(rt_in8(IO + ATA_REG_STATUS) & ATA_SR_DRQ));
-
- for (SizeT IndexOff = 0; IndexOff < Size; IndexOff += 2) {
- drv_pio_std_wait_io(IO);
-
- auto in = rt_in16(IO + ATA_REG_DATA);
-
- Buf[IndexOff] = in & 0xFF;
- Buf[IndexOff + 1] = (in >> 8) & 0xFF;
- }
-}
-
-Void drv_pio_std_write(UInt64 Lba, UInt16 IO, UInt8 Master, Char* Buf, SizeT SectorSz, SizeT Size) {
- Lba /= SectorSz;
-
- UInt8 Command = ((!Master) ? 0xE0 : 0xF0);
-
- drv_pio_std_wait_io(IO);
- drv_pio_std_select(IO);
-
- rt_out8(IO + ATA_REG_HDDEVSEL, (Command) | (((Lba) >> 24) & 0x0F));
-
- rt_out8(IO + ATA_REG_SEC_COUNT0, ((Size + SectorSz) / SectorSz));
-
- rt_out8(IO + ATA_REG_LBA0, (Lba) & 0xFF);
- rt_out8(IO + ATA_REG_LBA1, (Lba) >> 8);
- rt_out8(IO + ATA_REG_LBA2, (Lba) >> 16);
- rt_out8(IO + ATA_REG_LBA3, (Lba) >> 24);
-
- rt_out8(IO + ATA_REG_COMMAND, ATA_CMD_WRITE_PIO);
-
- while (!(rt_in8(IO + ATA_REG_STATUS) & ATA_SR_DRQ));
-
- for (SizeT IndexOff = 0; IndexOff < Size; IndexOff += 2) {
- drv_pio_std_wait_io(IO);
-
- UInt8 low = (UInt8)Buf[IndexOff];
- UInt8 high = (IndexOff + 1 < Size) ? (UInt8)Buf[IndexOff + 1] : 0;
- UInt16 packed = (high << 8) | low;
-
- rt_out16(IO + ATA_REG_DATA, packed);
- }
-}
-
-/// @brief is ATA detected?
-Boolean drv_pio_std_detected(Void) {
- return kATADetected;
-}
-
-/***
- @brief Getter, gets the number of sectors inside the drive.
- */
-SizeT drv_pio_get_sector_count() {
- return (kATAIdentifyData[61] << 16) | kATAIdentifyData[60];
-}
-
-/// @brief Get the drive size.
-SizeT drv_pio_get_size() {
- return (drv_pio_get_sector_count()) * kATASectorSize;
-}
-
-namespace Kernel {
-/// @brief Initialize an PIO device (StorageKit function)
-/// @param is_master is the current PIO master?
-/// @return [io:master] for PIO device.
-BOOL sk_init_ata_device(BOOL is_master, UInt16& io, UInt8& master) {
- return drv_pio_std_init(ATA_SECONDARY_IO, is_master, io, master);
-}
-
-/// @brief Implementation details namespace.
-namespace Detail {
- /// @brief Read PIO device.
- /// @param self device
- /// @param mnt mounted disk.
- STATIC Void sk_io_read_pio(IDeviceObject<MountpointInterface*>* self, MountpointInterface* mnt) {
- ATADeviceInterface* dev = (ATADeviceInterface*) self;
-
- err_global_get() = kErrorDisk;
-
- if (!dev) return;
-
- auto disk = mnt->GetAddressOf(dev->GetIndex());
-
- if (!disk) return;
-
- err_global_get() = kErrorSuccess;
-
- drv_pio_std_read(disk->fPacket.fPacketLba, dev->GetIO(), dev->GetMaster(),
- (Char*) disk->fPacket.fPacketContent, kATASectorSize,
- disk->fPacket.fPacketSize);
- }
-
- /// @brief Write PIO device.
- /// @param self device
- /// @param mnt mounted disk.
- STATIC Void sk_io_write_pio(IDeviceObject<MountpointInterface*>* self, MountpointInterface* mnt) {
- ATADeviceInterface* dev = (ATADeviceInterface*) self;
-
- err_global_get() = kErrorDisk;
-
- if (!dev) return;
-
- auto disk = mnt->GetAddressOf(dev->GetIndex());
-
- if (!disk) return;
-
- err_global_get() = kErrorSuccess;
-
- drv_pio_std_write(disk->fPacket.fPacketLba, dev->GetIO(), dev->GetMaster(),
- (Char*) disk->fPacket.fPacketContent, kATASectorSize,
- disk->fPacket.fPacketSize);
- }
-} // namespace Detail
-
-/// @brief Acquires a new PIO device with drv_index in mind.
-/// @param drv_index The drive index to assign.
-/// @return A wrapped device interface if successful, or error code.
-ErrorOr<ATADeviceInterface> sk_acquire_ata_device(Int32 drv_index) {
- /// here we don't check if we probed ATA, since we'd need to grab IO after that.
- ATADeviceInterface device(Detail::sk_io_read_pio, Detail::sk_io_write_pio);
-
- device.SetIndex(drv_index);
-
- return ErrorOr<ATADeviceInterface>(device);
-}
-} // namespace Kernel
-
-#ifdef __ATA_PIO__
-
-Void drv_std_read(UInt64 Lba, UInt16 IO, UInt8 Master, Char* Buf, SizeT SectorSz, SizeT Size) {
- drv_pio_std_read(Lba, IO, Master, Buf, SectorSz, Size);
-}
-
-Void drv_std_write(UInt64 Lba, UInt16 IO, UInt8 Master, Char* Buf, SizeT SectorSz, SizeT Size) {
- drv_pio_std_write(Lba, IO, Master, Buf, SectorSz, Size);
-}
-
-SizeT drv_std_get_size() {
- return drv_pio_get_size();
-}
-
-SizeT drv_std_get_sector_count() {
- return drv_pio_get_sector_count();
-}
-
-Boolean drv_std_init(UInt16 Bus, UInt8 Drive, UInt16& OutBus, UInt8& OutMaster) {
- return drv_pio_std_init(Bus, Drive, OutBus, OutMaster);
-}
-
-#endif
-
-#endif \ No newline at end of file
diff --git a/dev/kernel/HALKit/AMD64/Storage/PIO+Generic.cc b/dev/kernel/HALKit/AMD64/Storage/PIO+Generic.cc
index aec21ee4..99e1c619 100644
--- a/dev/kernel/HALKit/AMD64/Storage/PIO+Generic.cc
+++ b/dev/kernel/HALKit/AMD64/Storage/PIO+Generic.cc
@@ -49,7 +49,7 @@ ATAWaitForIO_Retry2:
return true;
}
-static Void drv_pio_std_select(UInt16 Bus) {
+STATIC Void drv_pio_std_select(UInt16 Bus) {
if (Bus == ATA_PRIMARY_IO)
rt_out8(Bus + ATA_REG_HDDEVSEL, ATA_PRIMARY_SEL);
else
@@ -79,15 +79,18 @@ ATAInit_Retry:
OutBus = (Bus == ATA_PRIMARY_IO) ? ATA_PRIMARY_IO : ATA_SECONDARY_IO;
OutMaster = (Bus == ATA_PRIMARY_IO) ? ATA_MASTER : ATA_SLAVE;
+ drv_pio_std_select(IO);
+
rt_out8(OutBus + ATA_REG_COMMAND, ATA_CMD_IDENTIFY);
- drv_pio_std_wait_io(IO);
+ while (!(rt_in8(IO + ATA_REG_STATUS) & ATA_SR_DRQ))
+ ;
/// fetch serial info
/// model, speed, number of sectors...
for (SizeT i = 0ul; i < kATADataLen; ++i) {
- kATAIdentifyData[i] = HAL::rt_in16(OutBus + ATA_REG_DATA);
+ kATAIdentifyData[i] = rt_in16(OutBus + ATA_REG_DATA);
}
for (Int32 i = 0; i < 20; i++) {
@@ -99,10 +102,6 @@ ATAInit_Retry:
(Void)(kout << "Drive Model: " << kATADiskModel << kendl);
- // Why? the current disk driver writes whole word instead of a single byte (expected btw) so i'm
- // planning to finish +Next drivers for 0.0.3
- ke_panic(RUNTIME_CHECK_INVALID, "PIO driver is currently being reworked.");
-
return true;
}
@@ -125,9 +124,16 @@ Void drv_pio_std_read(UInt64 Lba, UInt16 IO, UInt8 Master, Char* Buf, SizeT Sect
rt_out8(IO + ATA_REG_COMMAND, ATA_CMD_READ_PIO);
- for (SizeT IndexOff = 0; IndexOff < Size; ++IndexOff) {
+ while (!(rt_in8(IO + ATA_REG_STATUS) & ATA_SR_DRQ))
+ ;
+
+ for (SizeT IndexOff = 0; IndexOff < Size; IndexOff += 2) {
drv_pio_std_wait_io(IO);
- Buf[IndexOff] = HAL::rt_in16(IO + ATA_REG_DATA);
+
+ auto in = rt_in16(IO + ATA_REG_DATA);
+
+ Buf[IndexOff] = in & 0xFF;
+ Buf[IndexOff + 1] = (in >> 8) & 0xFF;
}
}
@@ -150,9 +156,17 @@ Void drv_pio_std_write(UInt64 Lba, UInt16 IO, UInt8 Master, Char* Buf, SizeT Sec
rt_out8(IO + ATA_REG_COMMAND, ATA_CMD_WRITE_PIO);
- for (SizeT IndexOff = 0; IndexOff < Size; ++IndexOff) {
+ while (!(rt_in8(IO + ATA_REG_STATUS) & ATA_SR_DRQ))
+ ;
+
+ for (SizeT IndexOff = 0; IndexOff < Size; IndexOff += 2) {
drv_pio_std_wait_io(IO);
- rt_out16(IO + ATA_REG_DATA, Buf[IndexOff]);
+
+ UInt8 low = (UInt8) Buf[IndexOff];
+ UInt8 high = (IndexOff + 1 < Size) ? (UInt8) Buf[IndexOff + 1] : 0;
+ UInt16 packed = (high << 8) | low;
+
+ rt_out16(IO + ATA_REG_DATA, packed);
}
}
diff --git a/dev/kernel/HALKit/AMD64/make_ap_blob.sh b/dev/kernel/HALKit/AMD64/make_ap_blob.sh
deleted file mode 100755
index 3f079187..00000000
--- a/dev/kernel/HALKit/AMD64/make_ap_blob.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-# !/bin/sh
-
-nasm -f bin HalApplicationProcessorStartup.asm -o HalApplicationProcessorStartup.bin \ No newline at end of file
diff --git a/dev/kernel/HALKit/ARM64/ApplicationProcessor.h b/dev/kernel/HALKit/ARM64/ApplicationProcessor.h
index f48c1483..3d472bf0 100644
--- a/dev/kernel/HALKit/ARM64/ApplicationProcessor.h
+++ b/dev/kernel/HALKit/ARM64/ApplicationProcessor.h
@@ -7,12 +7,13 @@
#pragma once
#include <HALKit/ARM64/Processor.h>
-#include <NewKit/Defines.h>
+#include <NeKit/Defines.h>
/************************************************** */
-/* INITIALIZE THE GIC ON CPU. */
+/* INITIALIZE THE GIC ON THE CURRENT CORE. */
+/* WITH AN EXECUTION LEVEL IN MIND. */
/************************************************** */
namespace Kernel {
-BOOL mp_initialize_gic(Kernel::Void);
+Void mp_init_cores(Void) noexcept;
} \ No newline at end of file
diff --git a/dev/kernel/HALKit/ARM64/HalACPIFactoryInterface.cc b/dev/kernel/HALKit/ARM64/HalACPIFactoryInterface.cc
index 31f5a4f2..dc883239 100644
--- a/dev/kernel/HALKit/ARM64/HalACPIFactoryInterface.cc
+++ b/dev/kernel/HALKit/ARM64/HalACPIFactoryInterface.cc
@@ -5,8 +5,8 @@
------------------------------------------- */
#include <ArchKit/ArchKit.h>
-#include <KernelKit/MemoryMgr.h>
-#include <NewKit/KString.h>
+#include <KernelKit/HeapMgr.h>
+#include <NeKit/KString.h>
#include <modules/ACPI/ACPIFactoryInterface.h>
#include <modules/APM/APM.h>
diff --git a/dev/kernel/HALKit/ARM64/HalApplicationProcessor.cc b/dev/kernel/HALKit/ARM64/HalApplicationProcessor.cc
index 7e55aa07..02f09e23 100644
--- a/dev/kernel/HALKit/ARM64/HalApplicationProcessor.cc
+++ b/dev/kernel/HALKit/ARM64/HalApplicationProcessor.cc
@@ -4,89 +4,80 @@
------------------------------------------- */
+#define GICD_BASE 0x08000000
+#define GICC_BASE 0x08010000
+
+#define GICD_CTLR 0x000
+#define GICD_ISENABLER 0x100
+#define GICD_ICENABLER 0x180
+#define GICD_ISPENDR 0x200
+#define GICD_ICPENDR 0x280
+#define GICD_IPRIORITYR 0x400
+#define GICD_ITARGETSR 0x800
+#define GICD_ICFGR 0xC00
+
+#define GICC_CTLR 0x000
+#define GICC_PMR 0x004
+#define GICC_IAR 0x00C
+#define GICC_EOIR 0x010
+
#include <HALKit/ARM64/ApplicationProcessor.h>
#include <HALKit/ARM64/Processor.h>
#include <KernelKit/DebugOutput.h>
+#include <KernelKit/HardwareThreadScheduler.h>
#include <KernelKit/ProcessScheduler.h>
-
-#define GICD_BASE 0x08000000 // Distributor base address
-#define GICC_BASE 0x08010000 // CPU interface base address
-
-#define GICD_CTLR 0x000 // Distributor Control Register
-#define GICD_ISENABLER 0x100 // Interrupt Set-Enable Registers
-#define GICD_ICENABLER 0x180 // Interrupt Clear-Enable Registers
-#define GICD_ISPENDR 0x200 // Interrupt Set-Pending Registers
-#define GICD_ICPENDR 0x280 // Interrupt Clear-Pending Registers
-#define GICD_IPRIORITYR 0x400 // Interrupt Priority Registers
-#define GICD_ITARGETSR 0x800 // Interrupt Processor Targets Registers
-#define GICD_ICFGR 0xC00 // Interrupt Configuration Registers
-
-#define GICC_CTLR 0x000 // CPU Interface Control Register
-#define GICC_PMR 0x004 // Interrupt Priority Mask Register
-#define GICC_IAR 0x00C // Interrupt Acknowledge Register
-#define GICC_EOIR 0x010 // End of Interrupt Register
+#include <KernelKit/Timer.h>
// ================================================================= //
namespace Kernel {
-struct PROCESS_CONTROL_BLOCK final {
- HAL::StackFramePtr mFrame;
+struct HAL_HARDWARE_THREAD final {
+ HAL::StackFramePtr mFramePtr;
+ ProcessID mThreadID{0};
};
-STATIC PROCESS_CONTROL_BLOCK kProcessBlocks[kSchedProcessLimitPerTeam] = {0};
+STATIC HAL_HARDWARE_THREAD kHWThread[kMaxAPInsideSched] = {{nullptr}};
namespace Detail {
STATIC BOOL kGICEnabled = NO;
- STATIC void mp_hang_fn(void) {
- while (YES)
- ;
-
- dbg_break_point();
- }
-
- Void mp_setup_gic_el0(Void) {
- // enable distributor.
+ /***********************************************************************************/
+ /// @brief Enables the GIC with EL0 configuration.
+ /// @internal
+ /***********************************************************************************/
+ STATIC Void mp_setup_gic_el0(Void) {
ke_dma_write<UInt32>(GICD_BASE, GICD_CTLR, YES);
UInt32 gicc_ctlr = ke_dma_read<UInt32>(GICC_BASE, GICC_CTLR);
- const auto kEnableSignalInt = YES;
+ const UInt8 kEnableSignalInt = 0x1;
- gicc_ctlr |= kEnableSignalInt; // Enable signaling of interrupts
- gicc_ctlr |= (kEnableSignalInt << 1); // Allow Group 1 interrupts in EL0
+ gicc_ctlr |= kEnableSignalInt;
+ gicc_ctlr |= (kEnableSignalInt << 0x1);
ke_dma_write<UInt32>(GICC_BASE, GICC_CTLR, gicc_ctlr);
- // Set priority mask (accept all priorities)
ke_dma_write<UInt32>(GICC_BASE, GICC_PMR, 0xFF);
UInt32 icfgr = ke_dma_read<UInt32>(GICD_BASE, GICD_ICFGR + (0x20 / 0x10) * 4);
- icfgr |= (0x2 << ((32 % 16) * 2)); // Edge-triggered
- ke_dma_write<UInt32>(GICD_BASE, GICD_ICFGR + (0x20 / 0x10) * 4, icfgr);
+ icfgr |= (0x2 << ((32 % 16) * 2));
- // Target interrupt 32 to CPU 1
+ ke_dma_write<UInt32>(GICD_BASE, GICD_ICFGR + (0x20 / 0x10) * 4, icfgr);
ke_dma_write<UInt32>(GICD_BASE, GICD_ITARGETSR + (0x20 / 0x04) * 4, 0x2 << ((32 % 4) * 8));
-
- // Set interrupt 32 priority to lowest (0xFF)
ke_dma_write<UInt32>(GICD_BASE, GICD_IPRIORITYR + (0x20 / 0x04) * 4, 0xFF << ((32 % 4) * 8));
-
- // Enable interrupt 32 for AP.
ke_dma_write<UInt32>(GICD_BASE, GICD_ISENABLER + 4, 0x01);
}
- BOOL mp_handle_gic_interrupt_el0(Void) {
- // Read the interrupt ID
+ EXTERN_C BOOL mp_handle_gic_interrupt_el0(Void) {
UInt32 interrupt_id = ke_dma_read<UInt32>(GICC_BASE, GICC_IAR);
- // Check if it's a valid interrupt (not spurious)
if ((interrupt_id & 0x3FF) < 1020) {
auto interrupt = interrupt_id & 0x3FF;
const UInt16 kInterruptScheduler = 0x20;
- (Void)(kout << "Handling interrupt for AP: " << interrupt << kendl);
+ (Void)(kout << "SMP: AP: " << hex_number(interrupt) << kendl);
switch (interrupt) {
case kInterruptScheduler: {
@@ -103,31 +94,47 @@ namespace Detail {
return YES;
}
- // spurious interrupt
return NO;
}
} // namespace Detail
-EXTERN_C HAL::StackFramePtr mp_get_current_context(ProcessID pid) {
- return kProcessBlocks[pid % kSchedProcessLimitPerTeam].mFrame;
+/***********************************************************************************/
+/// @brief Get current stack frame for a thread.
+/// @param thrdid The thread ID.
+/***********************************************************************************/
+
+EXTERN_C HAL::StackFramePtr mp_get_current_task(ProcessID thrdid) {
+ return kHWThread[thrdid].mFramePtr;
}
-EXTERN_C Bool mp_register_process(HAL::StackFramePtr stack_frame, ProcessID pid) {
- MUST_PASS(stack_frame);
+/***********************************************************************************/
+/// @brief Register current stack frame for a thread.
+/// @param stack_frame The current stack frame.
+/// @param thrdid The thread ID.
+/***********************************************************************************/
- const auto process_index = pid % kSchedProcessLimitPerTeam;
+EXTERN_C Bool mp_register_task(HAL::StackFramePtr stack_frame, ProcessID thrdid) {
+ MUST_PASS(Detail::kGICEnabled);
- kProcessBlocks[process_index].mFrame = stack_frame;
+ if (!stack_frame) return NO;
+ if (thrdid > kMaxAPInsideSched) return NO;
+
+ const auto process_index = thrdid;
+
+ kHWThread[process_index].mFramePtr = stack_frame;
+ kHWThread[process_index].mThreadID = thrdid;
return YES;
}
-BOOL mp_initialize_gic(Void) {
+/***********************************************************************************/
+/// @brief Initialize the Global Interrupt Controller.
+/// @internal
+/***********************************************************************************/
+Void mp_init_cores(Void) noexcept {
if (!Detail::kGICEnabled) {
Detail::kGICEnabled = YES;
Detail::mp_setup_gic_el0();
}
-
- return Detail::kGICEnabled;
}
} // namespace Kernel \ No newline at end of file
diff --git a/dev/kernel/HALKit/ARM64/HalApplicationProcessorStartup.s b/dev/kernel/HALKit/ARM64/HalApplicationProcessorStartup.s
new file mode 100644
index 00000000..dca52571
--- /dev/null
+++ b/dev/kernel/HALKit/ARM64/HalApplicationProcessorStartup.s
@@ -0,0 +1,12 @@
+.text
+
+.global hal_ap_blob_start
+.global hal_ap_blob_length
+
+hal_ap_blob_start:
+ ret
+
+.data
+
+hal_ap_blob_length:
+ .long 4
diff --git a/dev/kernel/HALKit/ARM64/HalFlushTLB.S b/dev/kernel/HALKit/ARM64/HalCommonAPI.s
index e76b6e3f..e76b6e3f 100644
--- a/dev/kernel/HALKit/ARM64/HalFlushTLB.S
+++ b/dev/kernel/HALKit/ARM64/HalCommonAPI.s
diff --git a/dev/kernel/HALKit/ARM64/HalDebugOutput.cc b/dev/kernel/HALKit/ARM64/HalDebugOutput.cc
index 7ec90c6e..3c518e2f 100644
--- a/dev/kernel/HALKit/ARM64/HalDebugOutput.cc
+++ b/dev/kernel/HALKit/ARM64/HalDebugOutput.cc
@@ -6,8 +6,8 @@
#include <ArchKit/ArchKit.h>
#include <KernelKit/DebugOutput.h>
-#include <NewKit/New.h>
-#include <NewKit/Utils.h>
+#include <NeKit/New.h>
+#include <NeKit/Utils.h>
namespace Kernel {
EXTERN_C void ke_io_write(IDeviceObject<const Char*>* self, const Char* bytes) {
diff --git a/dev/kernel/HALKit/ARM64/HalInterruptAPI.s b/dev/kernel/HALKit/ARM64/HalInterruptAPI.s
new file mode 100644
index 00000000..cafebb7d
--- /dev/null
+++ b/dev/kernel/HALKit/ARM64/HalInterruptAPI.s
@@ -0,0 +1,3 @@
+/* (c) 2024-2025 Amlal El Mahrouss */
+
+.text
diff --git a/dev/kernel/HALKit/ARM64/HalKernelMain.cc b/dev/kernel/HALKit/ARM64/HalKernelMain.cc
index bf5849ef..20bd3d8a 100644
--- a/dev/kernel/HALKit/ARM64/HalKernelMain.cc
+++ b/dev/kernel/HALKit/ARM64/HalKernelMain.cc
@@ -7,20 +7,23 @@
#include <ArchKit/ArchKit.h>
#include <CFKit/Property.h>
#include <FirmwareKit/Handover.h>
+#include <HALKit/ARM64/ApplicationProcessor.h>
#include <HALKit/ARM64/Processor.h>
#include <KernelKit/CodeMgr.h>
#include <KernelKit/FileMgr.h>
-#include <KernelKit/MemoryMgr.h>
+#include <KernelKit/HardwareThreadScheduler.h>
+#include <KernelKit/HeapMgr.h>
#include <KernelKit/PEFCodeMgr.h>
#include <KernelKit/ProcessScheduler.h>
+#include <NeKit/Json.h>
#include <NetworkKit/IPC.h>
-#include <NewKit/Json.h>
#include <modules/ACPI/ACPIFactoryInterface.h>
#include <modules/CoreGfx/CoreGfx.h>
-#include <HALKit/ARM64/ApplicationProcessor.h>
-
+#ifndef __NE_MODULAR_KERNEL_COMPONENTS__
EXTERN_C void hal_init_platform(Kernel::HEL::BootInfoHeader* handover_hdr) {
+ using namespace Kernel;
+
/************************************************** */
/* INITIALIZE AND VALIDATE HEADER. */
/************************************************** */
@@ -32,6 +35,15 @@ EXTERN_C void hal_init_platform(Kernel::HEL::BootInfoHeader* handover_hdr) {
return;
}
+ FB::fb_clear_video();
+
+#ifdef __NE_ARM64_EFI__
+ fw_init_efi((EfiSystemTable*) handover_hdr->f_FirmwareCustomTables[1]);
+
+ Boot::ExitBootServices(handover_hdr->f_HardwareTables.f_ImageKey,
+ handover_hdr->f_HardwareTables.f_ImageHandle);
+#endif
+
/************************************** */
/* INITIALIZE BIT MAP. */
/************************************** */
@@ -42,31 +54,24 @@ EXTERN_C void hal_init_platform(Kernel::HEL::BootInfoHeader* handover_hdr) {
/// @note do initialize the interrupts after it.
- Kernel::mp_initialize_gic();
-
- /// after the scheduler runs, we must look over teams, every 5000s in order to schedule every
- /// process according to their affinity fairly.
-
- auto constexpr kSchedTeamSwitchMS = 5U; /// @brief Team switch time in milliseconds.
-
- Kernel::HardwareTimer timer(rtl_milliseconds(kSchedTeamSwitchMS));
-
- STATIC Kernel::Array<UserProcessTeam, kSchedTeamCount> kTeams;
-
- SizeT team_index = 0U;
+ for (SizeT index = 0UL; index < HardwareThreadScheduler::The().Capacity(); ++index) {
+ HardwareThreadScheduler::The()[index].Leak()->Kind() = ThreadKind::kAPStandard;
+ HardwareThreadScheduler::The()[index].Leak()->Busy(NO);
+ }
- /// @brief This just loops over the teams and switches between them.
- /// @details Not even round-robin, just a simple loop in this boot core we're at.
- while (YES) {
- if (team_index > (kSchedTeamCount - 1)) {
- team_index = 0U;
- }
+ for (SizeT index = 0UL; index < UserProcessScheduler::The().TheCurrentTeam().AsArray().Count();
+ ++index) {
+ UserProcessScheduler::The().TheCurrentTeam().AsArray()[index].Status =
+ ProcessStatusKind::kInvalid;
+ }
- while (!UserProcessScheduler::The().SwitchTeam(kTeams[team_index]))
- ;
+ rtl_create_user_process(sched_idle_task, "MgmtSrv"); //! Mgmt command server.
+ rtl_create_user_process(sched_idle_task, "LaunchSrv"); //! launchd
+ rtl_create_user_process(sched_idle_task, "SecSrv"); //! Login Server
- timer.Wait();
+ Kernel::mp_init_cores();
- ++team_index;
- }
+ while (YES)
+ ;
}
+#endif \ No newline at end of file
diff --git a/dev/kernel/HALKit/ARM64/HalKernelPanic.cc b/dev/kernel/HALKit/ARM64/HalKernelPanic.cc
index c3d3175c..5feb6c75 100644
--- a/dev/kernel/HALKit/ARM64/HalKernelPanic.cc
+++ b/dev/kernel/HALKit/ARM64/HalKernelPanic.cc
@@ -9,9 +9,9 @@
#include <KernelKit/DebugOutput.h>
#include <KernelKit/FileMgr.h>
#include <KernelKit/Timer.h>
-#include <NewKit/KString.h>
-#include <NewKit/KernelPanic.h>
-#include <NewKit/Utils.h>
+#include <NeKit/KString.h>
+#include <NeKit/KernelPanic.h>
+#include <NeKit/Utils.h>
#include <modules/CoreGfx/CoreGfx.h>
#include <modules/CoreGfx/TextGfx.h>
diff --git a/dev/kernel/HALKit/ARM64/HalPagingMgr.cc b/dev/kernel/HALKit/ARM64/HalPagingMgr.cc
new file mode 100644
index 00000000..faad6778
--- /dev/null
+++ b/dev/kernel/HALKit/ARM64/HalPagingMgr.cc
@@ -0,0 +1,28 @@
+/* -------------------------------------------
+
+ Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved.
+
+ File: HalPagingMgr.cc
+ Purpose: Platform Paging Manager.
+
+------------------------------------------- */
+
+#include <HALKit/ARM64/Paging.h>
+#include <HALKit/ARM64/Processor.h>
+
+namespace Kernel::HAL {
+typedef UInt32 PageTableIndex;
+
+/// @brief Maps or allocates a page from virtual_address.
+/// @param virtual_address a valid virtual address.
+/// @param phys_addr point to physical address.
+/// @param flags the flags to put on the page.
+/// @return Status code of page manipulation process.
+EXTERN_C Int32 mm_map_page(VoidPtr virtual_address, VoidPtr physical_address, UInt32 flags) {
+ if (!virtual_address || !flags) return kErrorInvalidData;
+
+ NE_UNUSED(physical_address);
+
+ return kErrorSuccess;
+}
+} // namespace Kernel::HAL
diff --git a/dev/kernel/HALKit/ARM64/HalPagingMgrARM64.cc b/dev/kernel/HALKit/ARM64/HalPagingMgrARM64.cc
deleted file mode 100644
index e0b67489..00000000
--- a/dev/kernel/HALKit/ARM64/HalPagingMgrARM64.cc
+++ /dev/null
@@ -1,78 +0,0 @@
-/* -------------------------------------------
-
- Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved.
-
- File: HalPagingMgr.cc
- Purpose: Platform Paging Manager.
-
-------------------------------------------- */
-
-#include <HALKit/ARM64/Paging.h>
-#include <HALKit/ARM64/Processor.h>
-
-namespace Kernel::HAL {
-typedef UInt32 PageTableIndex;
-
-/// \brief Page store type.
-struct NE_PAGE_STORE final {
- struct {
- PDE* fPde{nullptr};
- PTE* fPte{nullptr};
- VoidPtr fVAddr{nullptr};
- } fInternalStore;
-
- Bool fStoreOp{No}; // Store operation in progress.
-
- static NE_PAGE_STORE& The() {
- static NE_PAGE_STORE the;
- return the;
- }
-};
-
-/// \brief Retrieve the page status of a PTE.
-STATIC Void mmi_page_status(PTE* pte) {
- NE_UNUSED(pte);
-}
-
-STATIC Int32 mmi_map_page_table_entry(VoidPtr virtual_address, UInt32 flags, PTE* pt_entry);
-
-/// @brief Maps or allocates a page from virtual_address.
-/// @param virtual_address a valid virtual address.
-/// @param phys_addr point to physical address.
-/// @param flags the flags to put on the page.
-/// @return Status code of page manipulation process.
-EXTERN_C Int32 mm_map_page(VoidPtr virtual_address, VoidPtr physical_address, UInt32 flags) {
- if (!virtual_address || !flags) return kErrorSuccess;
-
- NE_PAGE_STORE& page_store = NE_PAGE_STORE::The();
-
- while (page_store.fStoreOp)
- ;
-
- page_store.fStoreOp = Yes;
-
- if (page_store.fInternalStore.fVAddr == virtual_address) {
- page_store.fStoreOp = No;
- return mmi_map_page_table_entry(page_store.fInternalStore.fVAddr, flags,
- page_store.fInternalStore.fPte);
- }
-
- return kErrorSuccess;
-}
-
-/// @brief Maps flags for a specific pte.
-/// @internal Internal function.
-STATIC Int32 mmi_map_page_table_entry(VoidPtr virtual_address, UInt32 flags, PTE* pt_entry) {
- NE_PAGE_STORE& page_store = NE_PAGE_STORE::The();
-
- // Update internal store, and tlbi the virtual address.
-
- page_store.fInternalStore.fPde = nullptr;
- page_store.fInternalStore.fPte = pt_entry;
- page_store.fInternalStore.fVAddr = virtual_address;
-
- page_store.fStoreOp = No;
-
- return kErrorSuccess;
-}
-} // namespace Kernel::HAL
diff --git a/dev/kernel/HALKit/ARM64/HalSchedulerCoreARM64.cc b/dev/kernel/HALKit/ARM64/HalSchedulerCore.cc
index b3f1b62a..b3f1b62a 100644
--- a/dev/kernel/HALKit/ARM64/HalSchedulerCoreARM64.cc
+++ b/dev/kernel/HALKit/ARM64/HalSchedulerCore.cc
diff --git a/dev/kernel/HALKit/ARM64/HalSchedulerCorePrimitivesARM64.cc b/dev/kernel/HALKit/ARM64/HalSchedulerCorePrimitives.cc
index a8f0b1e1..ee286639 100644
--- a/dev/kernel/HALKit/ARM64/HalSchedulerCorePrimitivesARM64.cc
+++ b/dev/kernel/HALKit/ARM64/HalSchedulerCorePrimitives.cc
@@ -25,6 +25,6 @@ EXTERN_C Void __zka_pure_call(USER_PROCESS* process) {
EXTERN_C Bool hal_check_stack(HAL::StackFramePtr stack_ptr) {
if (!stack_ptr) return No;
- return stack_ptr->SP != 0 && stack_ptr->BP != 0;
+ return stack_ptr->SP != 0 && stack_ptr->IP != 0;
}
} // namespace Kernel
diff --git a/dev/kernel/HALKit/ARM64/HalTimerARM64.cc b/dev/kernel/HALKit/ARM64/HalTimer.cc
index 32f64aec..2a595f11 100644
--- a/dev/kernel/HALKit/ARM64/HalTimerARM64.cc
+++ b/dev/kernel/HALKit/ARM64/HalTimer.cc
@@ -12,3 +12,4 @@
------------------------------------------- */
#include <ArchKit/ArchKit.h>
+#include <KernelKit/Timer.h> \ No newline at end of file
diff --git a/dev/kernel/HALKit/ARM64/Paging.h b/dev/kernel/HALKit/ARM64/Paging.h
index 2eb02bc1..5001871b 100644
--- a/dev/kernel/HALKit/ARM64/Paging.h
+++ b/dev/kernel/HALKit/ARM64/Paging.h
@@ -12,7 +12,9 @@
------------------------------------------------------- */
-#include <NewKit/Defines.h>
+#ifdef __NE_ARM64__
+
+#include <NeKit/Defines.h>
#ifndef kPageMax
#define kPageMax (0x200)
@@ -101,3 +103,5 @@ typedef HAL::PDE_4KB PDE;
} // namespace Kernel
EXTERN_C void hal_flush_tlb();
+
+#endif // __NE_ARM64__ \ No newline at end of file
diff --git a/dev/kernel/HALKit/ARM64/Processor.h b/dev/kernel/HALKit/ARM64/Processor.h
index 1d9d2af2..068b798d 100644
--- a/dev/kernel/HALKit/ARM64/Processor.h
+++ b/dev/kernel/HALKit/ARM64/Processor.h
@@ -6,12 +6,14 @@
#pragma once
+#ifdef __NE_ARM64__
+
#include <FirmwareKit/Handover.h>
-#include <NewKit/Array.h>
-#include <NewKit/Defines.h>
-#include <NewKit/Utils.h>
+#include <NeKit/Array.h>
+#include <NeKit/Defines.h>
+#include <NeKit/Utils.h>
-#define kCPUBackendName "ARMv8"
+#define kCPUBackendName "aarch64"
namespace Kernel::HAL {
struct PACKED Register64 final {
@@ -21,11 +23,11 @@ struct PACKED Register64 final {
/// @brief Memory Manager mapping flags.
enum {
- kMMFlagsPresent = 1 << 0,
- kMMFlagsWr = 1 << 1,
- kMMFlagsUser = 1 << 2,
- kMMFlagsNX = 1 << 3,
- kMMFlagsPCD = 1 << 4,
+ kMMFlagsInvalid = 1 << 0,
+ kMMFlagsPresent = 1 << 1,
+ kMMFlagsWr = 1 << 2,
+ kMMFlagsUser = 1 << 3,
+ kMMFlagsNX = 1 << 4,
kMMFlagsCount = 4,
};
@@ -36,23 +38,23 @@ enum {
/// @return Status code of page manip.
EXTERN_C Int32 mm_map_page(VoidPtr virtual_address, VoidPtr physical_address, UInt32 flags);
-EXTERN_C UIntPtr mm_get_phys_address(VoidPtr virtual_address);
+EXTERN_C UIntPtr mm_get_page_addr(VoidPtr virtual_address);
typedef UIntPtr Reg;
typedef Register64 Register;
/// @note let's keep the same name as AMD64 HAL.
-struct PACKED StackFrame final {
- Reg R8{0};
- Reg R9{0};
- Reg R10{0};
- Reg R11{0};
- Reg R12{0};
- Reg R13{0};
- Reg R14{0};
- Reg R15{0};
- Reg SP{0};
- Reg BP{0};
+struct PACKED StackFrame {
+ Reg IP;
+ Reg SP;
+ Reg R8;
+ Reg R9;
+ Reg R10;
+ Reg R11;
+ Reg R12;
+ Reg R13;
+ Reg R14;
+ Reg R15;
};
typedef StackFrame* StackFramePtr;
@@ -62,16 +64,6 @@ inline Void rt_halt() noexcept {
}
}
-template <typename DataKind>
-inline void hal_dma_write(UIntPtr address, DataKind value) {
- *reinterpret_cast<volatile DataKind*>(address) = value;
-}
-
-template <typename DataKind>
-inline DataKind hal_dma_read(UIntPtr address) {
- return *reinterpret_cast<volatile DataKind*>(address);
-}
-
inline Void hal_wfi(Void) {
asm volatile("wfi");
}
@@ -80,6 +72,6 @@ inline Void hal_wfi(Void) {
inline Kernel::VoidPtr kKernelBitMpStart = nullptr;
inline Kernel::UIntPtr kKernelBitMpSize = 0UL;
-inline Kernel::VoidPtr kKernelPhysicalStart = nullptr;
-
#include <HALKit/ARM64/Paging.h>
+
+#endif // __NE_ARM64__ \ No newline at end of file
diff --git a/dev/kernel/HALKit/POWER/AP.h b/dev/kernel/HALKit/POWER/AP.h
index f938d6a1..92007da3 100644
--- a/dev/kernel/HALKit/POWER/AP.h
+++ b/dev/kernel/HALKit/POWER/AP.h
@@ -13,7 +13,7 @@
#pragma once
-#include <NewKit/Defines.h>
+#include <NeKit/Defines.h>
namespace Kernel {
struct HAL_HARDWARE_THREAD;
diff --git a/dev/kernel/HALKit/POWER/HalApplicationProcessor.cc b/dev/kernel/HALKit/POWER/HalApplicationProcessor.cc
index 617b3dda..daa26e53 100644
--- a/dev/kernel/HALKit/POWER/HalApplicationProcessor.cc
+++ b/dev/kernel/HALKit/POWER/HalApplicationProcessor.cc
@@ -22,7 +22,7 @@ void mp_wakeup_thread(HAL::StackFramePtr stack) {
if (!stack) return;
hal_set_pc_to_hart(reinterpret_cast<HAL_HARDWARE_THREAD*>(stack->R15),
- reinterpret_cast<VoidPtr>(stack->BP));
+ reinterpret_cast<VoidPtr>(stack->IP));
}
/// @brief makes thread sleep.
diff --git a/dev/kernel/HALKit/POWER/Processor.h b/dev/kernel/HALKit/POWER/Processor.h
index 850b636d..8b75bcc8 100644
--- a/dev/kernel/HALKit/POWER/Processor.h
+++ b/dev/kernel/HALKit/POWER/Processor.h
@@ -8,8 +8,8 @@
#pragma once
-#include <NewKit/Defines.h>
-#include <NewKit/Utils.h>
+#include <NeKit/Defines.h>
+#include <NeKit/Utils.h>
#define rtl_nop_op() asm volatile("mr 0, 0")
#define kHalPPCAlignment __attribute__((aligned(4)))
@@ -28,7 +28,7 @@ struct PACKED StackFrame final {
Reg R14{0};
Reg R15{0};
Reg SP{0};
- Reg BP{0};
+ Reg IP{0};
};
typedef StackFrame* StackFramePtr;
diff --git a/dev/kernel/HALKit/RISCV/AP.h b/dev/kernel/HALKit/RISCV/AP.h
index 0e94fd97..79b0d038 100644
--- a/dev/kernel/HALKit/RISCV/AP.h
+++ b/dev/kernel/HALKit/RISCV/AP.h
@@ -13,7 +13,7 @@
#pragma once
-#include <NewKit/Defines.h>
+#include <NeKit/Defines.h>
namespace Kernel {
typedef Int64 hal_ap_kind;
diff --git a/dev/kernel/HALKit/RISCV/HalApplicationProcessor.cc b/dev/kernel/HALKit/RISCV/HalApplicationProcessor.cc
index 80162b81..31d4a62e 100644
--- a/dev/kernel/HALKit/RISCV/HalApplicationProcessor.cc
+++ b/dev/kernel/HALKit/RISCV/HalApplicationProcessor.cc
@@ -25,7 +25,7 @@ void mp_wakeup_thread(HAL::StackFramePtr stack) {
if (!stack) return;
hal_set_pc_to_hart(reinterpret_cast<HAL_HARDWARE_THREAD*>(stack->R15),
- reinterpret_cast<VoidPtr>(stack->BP));
+ reinterpret_cast<VoidPtr>(stack->IP));
}
/// @brief makes thread sleep.
diff --git a/dev/kernel/KernelKit/BinaryMutex.h b/dev/kernel/KernelKit/BinaryMutex.h
index a1cd5b7c..45d4bd8d 100644
--- a/dev/kernel/KernelKit/BinaryMutex.h
+++ b/dev/kernel/KernelKit/BinaryMutex.h
@@ -8,7 +8,7 @@
#include <CompilerKit/CompilerKit.h>
#include <KernelKit/Timer.h>
-#include <NewKit/Defines.h>
+#include <NeKit/Defines.h>
namespace Kernel {
class USER_PROCESS;
diff --git a/dev/kernel/KernelKit/CodeMgr.h b/dev/kernel/KernelKit/CodeMgr.h
index bb287b24..072ba4d5 100644
--- a/dev/kernel/KernelKit/CodeMgr.h
+++ b/dev/kernel/KernelKit/CodeMgr.h
@@ -20,20 +20,20 @@
namespace Kernel {
/// @brief Main process entrypoint.
-typedef void (*rtl_main_kind)(SizeT argc, Char** argv, Char** envp, SizeT envp_len);
+typedef void (*rtl_main_kind)(void);
/// @brief C++ Constructor entrypoint.
-typedef void (*rtl_ctor_kind)(void);
+typedef void (*rtl_cxx_ctor_kind)(void);
/// @brief C++ Destructor entrypoint.
-typedef void (*rtl_dtor_kind)(void);
+typedef void (*rtl_cxx_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_kernel_process(rtl_main_kind main, const Char* process_name) noexcept;
+ProcessID rtl_create_kernel_process(rtl_main_kind main, const Char* task_name) noexcept;
/// @brief Executes a new process from a function. User code only.
/// @note This sets up a new stack, anything on the main function that calls the Kernel will not be
diff --git a/dev/kernel/KernelKit/CoreProcessScheduler.h b/dev/kernel/KernelKit/CoreProcessScheduler.h
index b3bc3e65..5ba29d3a 100644
--- a/dev/kernel/KernelKit/CoreProcessScheduler.h
+++ b/dev/kernel/KernelKit/CoreProcessScheduler.h
@@ -6,21 +6,100 @@
#pragma once
-#include <NewKit/Defines.h>
-#include <NewKit/ErrorOr.h>
+#include <NeKit/Defines.h>
+#include <NeKit/ErrorOr.h>
+
+#define kSchedMinMicroTime (AffinityKind::kStandard)
+#define kSchedInvalidPID (-1)
+#define kSchedProcessLimitPerTeam (32U)
+#define kSchedTeamCount (256U)
+
+#define kSchedMaxMemoryLimit gib_cast(128) /* max physical memory limit */
+#define kSchedMaxStackSz (kib_cast(8)) /* maximum stack size */
+
+#define kSchedNameLen (128U)
+
+EXTERN_C void sched_idle_task(void);
namespace Kernel {
class USER_PROCESS;
-class KERNEL_PROCESS;
+class KERNEL_TASK;
+class KernelTaskScheduler;
+class UserProcessScheduler;
class UserProcessTeam;
+template <typename T>
+struct PROCESS_HEAP_TREE;
+
+template <typename T>
+struct PROCESS_FILE_TREE;
+
+enum {
+ kInvalidTreeKind = 0U,
+ kRedTreeKind = 100U,
+ kBlackTreeKind = 101U,
+ kTreeKindCount = 2U,
+};
+
+template <typename T>
+struct PROCESS_HEAP_TREE {
+ static constexpr auto kPtr = true;
+ static constexpr auto kFD = false;
+
+ T Entry{nullptr};
+ SizeT EntrySize{0UL};
+ SizeT EntryPad{0UL};
+
+ UInt32 Color{kBlackTreeKind};
+
+ struct PROCESS_HEAP_TREE<T>* Parent {
+ nullptr
+ };
+ struct PROCESS_HEAP_TREE<T>* Child {
+ nullptr
+ };
+
+ struct PROCESS_HEAP_TREE<T>* Prev {
+ nullptr
+ };
+ struct PROCESS_HEAP_TREE<T>* Next {
+ nullptr
+ };
+};
+
+template <typename T>
+struct PROCESS_FILE_TREE {
+ static constexpr auto kPtr = false;
+ static constexpr auto kFD = true;
+
+ T Entry{nullptr};
+ SizeT EntrySize{0UL};
+ SizeT EntryPad{0UL};
+
+ UInt32 Color{kBlackTreeKind};
+
+ struct PROCESS_FILE_TREE<T>* Parent {
+ nullptr
+ };
+ struct PROCESS_FILE_TREE<T>* Child {
+ nullptr
+ };
+
+ struct PROCESS_FILE_TREE<T>* Prev {
+ nullptr
+ };
+ struct PROCESS_FILE_TREE<T>* Next {
+ nullptr
+ };
+};
+
/***********************************************************************************/
/// @brief Subsystem enum type.
/***********************************************************************************/
enum class ProcessSubsystem : Int32 {
kProcessSubsystemSecurity = 100,
- kProcessSubsystemApplication,
+ kProcessSubsystemUser,
kProcessSubsystemService,
kProcessSubsystemDriver,
kProcessSubsystemInvalid = 0xFFFFFFF,
@@ -51,8 +130,8 @@ enum class ProcessStatusKind : Int32 {
//! @brief Affinity is the amount of nano-seconds this process is going to run.
/***********************************************************************************/
enum class AffinityKind : Int32 {
- kRealTime = 500,
- kVeryHigh = 250,
+ kRealTime = 50,
+ kVeryHigh = 150,
kHigh = 200,
kStandard = 1000,
kLowUsage = 1500,
@@ -117,7 +196,8 @@ struct PROCESS_IMAGE final {
private:
friend USER_PROCESS;
- friend KERNEL_PROCESS;
+ friend KERNEL_TASK;
+
friend class UserProcessScheduler;
ImagePtr fCode;
diff --git a/dev/kernel/KernelKit/DebugOutput.h b/dev/kernel/KernelKit/DebugOutput.h
index f6cfa027..9598f590 100644
--- a/dev/kernel/KernelKit/DebugOutput.h
+++ b/dev/kernel/KernelKit/DebugOutput.h
@@ -8,9 +8,9 @@
#include <CompilerKit/CompilerKit.h>
#include <KernelKit/DeviceMgr.h>
-#include <NewKit/OwnPtr.h>
-#include <NewKit/Stream.h>
-#include <NewKit/Utils.h>
+#include <NeKit/OwnPtr.h>
+#include <NeKit/Stream.h>
+#include <NeKit/Utils.h>
#define kDebugUnboundPort 0x0FEED
@@ -158,8 +158,8 @@ namespace Detail {
inline TerminalDevice hex_number(const Long& x) {
TerminalDevice self = TerminalDevice::The();
+ self << "0x";
Detail::_write_number_hex(x, self);
- self.operator<<("h");
return self;
}
@@ -184,10 +184,12 @@ inline constexpr SizeT kDebugTypeLen = 256U;
typedef Char rt_debug_type[kDebugTypeLen];
-class DebuggerPortHeader final {
+/// @brief KDBG's packet header.
+class KernelDebugHeader final {
public:
- Int16 fPort;
- Int16 fPortBsy;
+ Int16 fPort;
+ Int16 fPortKind;
+ rt_debug_type fPortBlob;
};
inline TerminalDevice& operator<<(TerminalDevice& src, const Long& num) {
diff --git a/dev/kernel/KernelKit/Defines.h b/dev/kernel/KernelKit/Defines.h
index 2c170940..975520b6 100644
--- a/dev/kernel/KernelKit/Defines.h
+++ b/dev/kernel/KernelKit/Defines.h
@@ -6,11 +6,14 @@
#pragma once
-#include <NewKit/Defines.h>
+#include <NeKit/Defines.h>
-#define KERNELKIT_VERSION "0.0.1"
+#define KERNELKIT_VERSION "0.0.1-kernelkit"
#define KERNELKIT_VERSION_BCD 0x0001
+namespace Kernel {
class UserProcessScheduler;
class IDylibObject;
-class Process;
+class USER_PROCESS;
+class KERNEL_TASK;
+} // namespace Kernel \ No newline at end of file
diff --git a/dev/kernel/KernelKit/DeviceMgr.h b/dev/kernel/KernelKit/DeviceMgr.h
index 210cef2a..7c7b9da3 100644
--- a/dev/kernel/KernelKit/DeviceMgr.h
+++ b/dev/kernel/KernelKit/DeviceMgr.h
@@ -8,8 +8,8 @@
Revision History:
- 31/01/24: Add kDeviceCnt (amlel)
- 15/11/24: Add NE_DEVICE macro, to inherit from device object.
+ 31/01/24: Add kDeviceCnt (amlel)
+ 15/11/24: Add NE_DEVICE macro, to inherit from device object.
------------------------------------------- */
@@ -19,19 +19,22 @@
/* @file KernelKit/DeviceMgr.h */
/* @brief Device abstraction and I/O buffer. */
-#include <NewKit/ErrorOr.h>
-#include <NewKit/Ref.h>
+#include <NeKit/ErrorOr.h>
+#include <NeKit/Ref.h>
#define kDeviceMgrRootDirPath "/devices/"
#define NE_DEVICE : public ::Kernel::IDeviceObject
-// Last Rev: Wed, Apr 3, 2024 9:09:41 AM
+// Last Rev: Wed, May 27, 2025 6:22 PM
namespace Kernel {
template <typename T>
class IDeviceObject;
+template <typename T>
+class IOBuf;
+
/***********************************************************************************/
/// @brief Device contract interface, represents an HW device.
/***********************************************************************************/
@@ -103,7 +106,8 @@ class IOBuf final {
///! @brief Device enum types.
enum {
- kDeviceTypeIDE,
+ kDeviceTypeInvalid = 0,
+ kDeviceTypeIDE = 100,
kDeviceTypeEthernet,
kDeviceTypeWiFi,
kDeviceTypeFW,
@@ -114,7 +118,10 @@ enum {
kDeviceTypeMBCI,
kDeviceTypeATA,
kDeviceTypeUSB,
- kDeviceTypeMediaCtrl, // MM controller
+ kDeviceTypeAPM, // Adv. Pwr. Mgmt.
+ kDeviceTypePCI,
+ kDeviceTypeVGA,
+ kDeviceTypeGPU,
kDeviceTypeCount,
};
} // namespace Kernel
diff --git a/dev/kernel/KernelKit/DriveMgr.h b/dev/kernel/KernelKit/DriveMgr.h
index 7972ac74..4a530deb 100644
--- a/dev/kernel/KernelKit/DriveMgr.h
+++ b/dev/kernel/KernelKit/DriveMgr.h
@@ -12,9 +12,9 @@
#include <KernelKit/DeviceMgr.h>
#include <KernelKit/KPC.h>
#include <KernelKit/ProcessScheduler.h>
-#include <NewKit/Defines.h>
-#include <NewKit/KString.h>
-#include <NewKit/Ref.h>
+#include <NeKit/Defines.h>
+#include <NeKit/KString.h>
+#include <NeKit/Ref.h>
#define kDriveMaxCount (4U)
#define kDriveSectorSz (512U)
@@ -23,6 +23,8 @@
#define drv_sector_cnt(SIZE, SECTOR_SZ) (((SIZE) + (SECTOR_SZ)) / (SECTOR_SZ))
+#define kDriveHiddenPrefix '~'
+
namespace Kernel {
enum {
kInvalidDrive = -1,
@@ -159,20 +161,6 @@ namespace Detect {
Void io_drv_input(DriveTrait::DrivePacket pckt);
Void io_drv_output(DriveTrait::DrivePacket pckt);
-
-/// @brief Read from IFS 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
index 2c4b2055..13eeabdf 100644
--- a/dev/kernel/KernelKit/FileMgr.h
+++ b/dev/kernel/KernelKit/FileMgr.h
@@ -1,6 +1,6 @@
/* -------------------------------------------
- Copyright (C) 2024-2025, Amlal El Mahrouss Labs, all rights reserved.
+ Copyright (C) 2024-2025, Amlal El Mahrouss , all rights reserved.
File: FileMgr.h
Purpose: Kernel file manager.
@@ -28,15 +28,15 @@
#include <CompilerKit/CompilerKit.h>
#include <KernelKit/DebugOutput.h>
+#include <KernelKit/HeapMgr.h>
#include <KernelKit/KPC.h>
-#include <KernelKit/MemoryMgr.h>
-#include <NewKit/ErrorOr.h>
-#include <NewKit/Ref.h>
-#include <NewKit/Stream.h>
+#include <NeKit/ErrorOr.h>
+#include <NeKit/Ref.h>
+#include <NeKit/Stream.h>
#include <hint/CompilerHint.h>
/// @brief Filesystem manager, abstraction over mounted filesystem.
-/// Works like the VFS or IFS subsystem.
+/// Works like an VFS (Virtual File System) or IFS subsystem on NT/OS 2.
#define kRestrictR "r"
#define kRestrictRB "rb"
@@ -52,6 +52,7 @@
@note Refer to first enum.
*/
#define kFileOpsCount (4U)
+
#define kFileMimeGeneric "ne-application-kind/all"
/** @brief invalid position. (n-pos) */
@@ -176,6 +177,52 @@ class NeFileSystemMgr final : public IFilesystemMgr {
#endif // ifdef __FSKIT_INCLUDES_NEFS__
+#ifdef __FSKIT_INCLUDES_HEFS__
+/**
+ * @brief Based of IFilesystemMgr, takes care of managing NeFS
+ * disks.
+ */
+class HeFileSystemMgr final : public IFilesystemMgr {
+ public:
+ explicit HeFileSystemMgr();
+ ~HeFileSystemMgr() override;
+
+ public:
+ NE_COPY_DEFAULT(HeFileSystemMgr)
+
+ 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.
+ HeFileSystemParser* GetParser() noexcept;
+
+ private:
+ HeFileSystemParser* mParser{nullptr};
+};
+
+#endif // ifdef __FSKIT_INCLUDES_HEFS__
+
/**
* FileStream class.
* @tparam Encoding file encoding (char, wchar_t...)
@@ -278,7 +325,7 @@ class FileStream final {
Char* MIME() noexcept { return const_cast<Char*>(fMime); }
enum {
- kFileMgrRestrictRead,
+ kFileMgrRestrictRead = 100,
kFileMgrRestrictReadBinary,
kFileMgrRestrictWrite,
kFileMgrRestrictWriteBinary,
@@ -292,15 +339,16 @@ class FileStream final {
const Char* fMime{kFileMimeGeneric};
};
-using FileStreamUTF8 = FileStream<Char>;
+using FileStreamASCII = FileStream<Char>;
+using FileStreamUTF8 = FileStream<Utf8Char>;
using FileStreamUTF16 = FileStream<WideChar>;
typedef UInt64 CursorType;
-inline static const auto kRestrictStrLen = 8U;
+inline STATIC const auto kRestrictStrLen = 8U;
/// @brief restrict information about the file descriptor.
-struct FileRestrictKind final {
+struct FILEMGR_RESTRICT final {
Char fRestrict[kRestrictStrLen];
Int32 fMappedTo;
};
@@ -310,7 +358,7 @@ template <typename Encoding, typename Class>
inline FileStream<Encoding, Class>::FileStream(const Encoding* path, const Encoding* restrict_type)
: fFile(Class::GetMounted()->Open(path, restrict_type)) {
SizeT kRestrictCount = kRestrictMax;
- const FileRestrictKind kRestrictList[] = {{
+ const FILEMGR_RESTRICT kRestrictList[] = {{
.fRestrict = kRestrictR,
.fMappedTo = kFileMgrRestrictRead,
},
@@ -339,13 +387,13 @@ inline FileStream<Encoding, Class>::FileStream(const Encoding* path, const Encod
}
}
- kout << "new file: " << path << ".\r";
+ kout << "FileMgr: Open file at: " << path << ".\r";
}
/// @brief destructor of the file stream.
template <typename Encoding, typename Class>
inline FileStream<Encoding, Class>::~FileStream() {
- mm_delete_heap(fFile);
+ mm_free_ptr(fFile);
}
} // namespace Kernel
diff --git a/dev/kernel/KernelKit/HardwareThreadScheduler.h b/dev/kernel/KernelKit/HardwareThreadScheduler.h
index d47b2994..76327a93 100644
--- a/dev/kernel/KernelKit/HardwareThreadScheduler.h
+++ b/dev/kernel/KernelKit/HardwareThreadScheduler.h
@@ -9,12 +9,12 @@
#include <ArchKit/ArchKit.h>
#include <CompilerKit/CompilerKit.h>
-#include <NewKit/Ref.h>
+#include <NeKit/Ref.h>
/// @note Last Rev Sun 28 Jul CET 2024
/// @note Last Rev Thu, Aug 1, 2024 9:07:38 AM
-#define kMaxAPInsideSched (8U)
+#define kMaxAPInsideSched (4U)
namespace Kernel {
class HardwareThread;
@@ -23,12 +23,12 @@ class HardwareThreadScheduler;
using ThreadID = UInt32;
enum ThreadKind {
- kAPInvalid,
- kAPSystemReserved, // System reserved thread, well user can't use it
- kAPStandard, // user thread, cannot be used by Kernel
- kAPRealTime, // fallback thread, cannot be used by user if not clear or
- // used by Kernel.
- kAPBoot, // The core we booted from, the mama.
+ kAPInvalid = 0,
+ kAPSystemReserved = 100, // System reserved thread, well user can't use it
+ kAPStandard, // user thread, cannot be used by Kernel
+ kAPRealTime, // fallback thread, cannot be used by user if not clear or
+ // used by Kernel.
+ kAPBoot, // The core we booted from, the mama.
kAPCount,
};
@@ -58,20 +58,19 @@ class HardwareThread final {
void Busy(const BOOL busy = false) noexcept;
public:
- BOOL Switch(VoidPtr image, Ptr8 stack_ptr, HAL::StackFramePtr frame, const ThreadID& pid);
+ BOOL Switch(HAL::StackFramePtr frame);
BOOL IsWakeup() noexcept;
public:
HAL::StackFramePtr StackFrame() noexcept;
- const ThreadKind& Kind() noexcept;
- bool IsBusy() noexcept;
- const ThreadID& ID() noexcept;
+ ThreadKind& Kind() noexcept;
+ BOOL IsBusy() noexcept;
+ ThreadID& ID() noexcept;
private:
HAL::StackFramePtr fStack{nullptr};
ThreadKind fKind{ThreadKind::kAPStandard};
ThreadID fID{0};
- ThreadID fPID{0};
Bool fWakeup{NO};
Bool fBusy{NO};
UInt64 fPTime{0};
diff --git a/dev/kernel/KernelKit/MemoryMgr.h b/dev/kernel/KernelKit/HeapMgr.h
index 2274e24e..dacdfa5d 100644
--- a/dev/kernel/KernelKit/MemoryMgr.h
+++ b/dev/kernel/KernelKit/HeapMgr.h
@@ -8,40 +8,35 @@
#define INC_KERNEL_HEAP_H
/// @date 30/01/24
-/// @file: MemoryMgr.h
+/// @file: HeapMgr.h
/// @brief: Memory allocation support for the NeKernel.
#include <KernelKit/KPC.h>
-#include <NewKit/KernelPanic.h>
+#include <NeKit/KernelPanic.h>
#include <hint/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);
+Int32 mm_free_ptr(VoidPtr heap_ptr);
/// @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);
+Boolean mm_is_valid_ptr(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(SizeT sz, Bool wr, Bool user, SizeT pad_amount = 0);
+VoidPtr mm_alloc_ptr(SizeT sz, Bool wr, Bool user, SizeT pad_amount = 0);
/// @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);
+Boolean mm_protect_ptr(VoidPtr heap_ptr);
/// @brief Makes a Kernel page.
/// @param heap_ptr the page pointer.
@@ -51,33 +46,13 @@ 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);
+Int32 mm_set_ptr_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 BOOL mm_new_class(_Input _Output T** cls, _Input Args&&... args) {
- if (*cls) {
- err_global_get() = Kernel::kErrorInvalidData;
- return NO;
- }
-
- *cls = new T(move(args)...);
- return *cls;
-}
-
-/// @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;
-}
+UInt64 mm_get_ptr_flags(VoidPtr heap_ptr);
} // namespace Kernel
+#include <KernelKit/HeapMgr.inl>
+
#endif // !INC_KERNEL_HEAP_H
diff --git a/dev/kernel/KernelKit/HeapMgr.inl b/dev/kernel/KernelKit/HeapMgr.inl
new file mode 100644
index 00000000..6371012e
--- /dev/null
+++ b/dev/kernel/KernelKit/HeapMgr.inl
@@ -0,0 +1,35 @@
+/* -------------------------------------------
+
+ Copyright (C) 2025, Amlal El Mahrouss, all rights reserved.
+
+------------------------------------------- */
+
+#pragma once
+
+#ifndef INC_KERNEL_HEAP_H
+#include <KernelKit/HeapMgr.h>
+#endif // !INC_KERNEL_HEAP_H
+
+namespace Kernel {
+/// @brief Allocate C++ class.
+/// @param cls The class to allocate.
+/// @param args The args to pass.
+template <typename T, typename... Args>
+inline BOOL mm_new_class(_Input _Output T** cls, _Input Args&&... args) {
+ if (*cls) {
+ err_global_get() = Kernel::kErrorInvalidData;
+ return NO;
+ }
+
+ *cls = new T(move(args)...);
+ return *cls;
+}
+
+/// @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 \ No newline at end of file
diff --git a/dev/kernel/KernelKit/IDylibObject.h b/dev/kernel/KernelKit/IDylibObject.h
index 7a7cd913..b673766c 100644
--- a/dev/kernel/KernelKit/IDylibObject.h
+++ b/dev/kernel/KernelKit/IDylibObject.h
@@ -10,31 +10,34 @@
#pragma once
#include <CompilerKit/CompilerKit.h>
-#include <NewKit/Defines.h>
+#include <NeKit/Defines.h>
#define NE_DYLIB_OBJECT : public IDylibObject
namespace Kernel {
+class IDylibObject;
+
/// @brief Dylib class object. A handle to a shared library.
class IDylibObject {
public:
explicit IDylibObject() = default;
virtual ~IDylibObject() = default;
- struct DLL_TRAITS final {
+ struct DylibTraits final {
VoidPtr ImageObject{nullptr};
VoidPtr ImageEntrypointOffset{nullptr};
- Bool IsValid() { return ImageObject && ImageEntrypointOffset; }
+ VoidPtr Image() const { return ImageObject; }
+ Bool IsValid() const { return ImageObject && ImageEntrypointOffset; }
};
NE_COPY_DEFAULT(IDylibObject)
- virtual DLL_TRAITS** GetAddressOf() = 0;
- virtual DLL_TRAITS* Get() = 0;
+ virtual DylibTraits** GetAddressOf() = 0;
+ virtual DylibTraits* Get() = 0;
- virtual Void Mount(DLL_TRAITS* to_mount) = 0;
- virtual Void Unmount() = 0;
+ virtual Void Mount(DylibTraits* to_mount) = 0;
+ virtual Void Unmount() = 0;
};
/// @brief Pure implementation, missing method/function handler.
diff --git a/dev/kernel/KernelKit/IFS.h b/dev/kernel/KernelKit/IFS.h
new file mode 100644
index 00000000..5555764f
--- /dev/null
+++ b/dev/kernel/KernelKit/IFS.h
@@ -0,0 +1,25 @@
+/* -------------------------------------------
+
+ Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved.
+
+------------------------------------------- */
+
+#pragma once
+
+#include <KernelKit/DriveMgr.h>
+
+namespace Kernel {
+/// @brief Read from IFS 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 \ No newline at end of file
diff --git a/dev/kernel/KernelKit/IPEFDylibObject.h b/dev/kernel/KernelKit/IPEFDylibObject.h
index 42ed1830..66b4895d 100644
--- a/dev/kernel/KernelKit/IPEFDylibObject.h
+++ b/dev/kernel/KernelKit/IPEFDylibObject.h
@@ -14,7 +14,7 @@
#include <KernelKit/PEF.h>
#include <KernelKit/PEFCodeMgr.h>
#include <KernelKit/ProcessScheduler.h>
-#include <NewKit/Defines.h>
+#include <NeKit/Defines.h>
namespace Kernel {
/**
@@ -30,15 +30,15 @@ class IPEFDylibObject final NE_DYLIB_OBJECT {
NE_COPY_DEFAULT(IPEFDylibObject)
private:
- DLL_TRAITS* fMounted{nullptr};
+ DylibTraits* fMounted{nullptr};
public:
- DLL_TRAITS** GetAddressOf() { return &fMounted; }
+ DylibTraits** GetAddressOf() { return &fMounted; }
- DLL_TRAITS* Get() { return fMounted; }
+ DylibTraits* Get() { return fMounted; }
public:
- void Mount(DLL_TRAITS* to_mount) {
+ void Mount(DylibTraits* to_mount) {
if (!to_mount || !to_mount->ImageObject) return;
fMounted = to_mount;
diff --git a/dev/kernel/KernelKit/KPC.h b/dev/kernel/KernelKit/KPC.h
index 9de1f70f..a3b13de6 100644
--- a/dev/kernel/KernelKit/KPC.h
+++ b/dev/kernel/KernelKit/KPC.h
@@ -6,18 +6,19 @@
#pragma once
-#include <NewKit/Defines.h>
+#include <NeKit/Defines.h>
/// @file KPC.h
/// @brief Kernel Procedure Code.
-#define err_local_ok() \
- (Kernel::UserProcessScheduler::The().CurrentProcess().Leak().GetLocalCode() == \
+#define err_local_ok() \
+ (Kernel::UserProcessScheduler::The().TheCurrentProcess().Leak().GetLocalCode() == \
Kernel::kErrorSuccess)
-#define err_local_fail() \
- (Kernel::UserProcessScheduler::The().CurrentProcess().Leak().GetLocalCode() != \
+#define err_local_fail() \
+ (Kernel::UserProcessScheduler::The().TheCurrentProcess().Leak().GetLocalCode() != \
Kernel::kErrorSuccess)
-#define err_local_get() (Kernel::UserProcessScheduler::The().CurrentProcess().Leak().GetLocalCode())
+#define err_local_get() \
+ (Kernel::UserProcessScheduler::The().TheCurrentProcess().Leak().GetLocalCode())
#define err_global_ok() (Kernel::kErrorLocalNumber == Kernel::kErrorSuccess)
#define err_global_fail() (Kernel::kErrorLocalNumber != Kernel::kErrorSuccess)
@@ -62,8 +63,8 @@ inline constexpr KPCError kErrorCDTrayBroken = 62;
inline constexpr KPCError kErrorUnrecoverableDisk = 63;
inline constexpr KPCError kErrorFileLocked = 64;
inline constexpr KPCError kErrorDiskIsTooTiny = 65;
-/// Kernel errors.
-inline constexpr KPCError kErrorDmaExhausted = 101;
+inline constexpr KPCError kErrorDmaExhausted = 66;
+inline constexpr KPCError kErrorOutOfBitMapMemory = 67;
/// Generic errors.
inline constexpr KPCError kErrorUnimplemented = -1;
diff --git a/dev/kernel/KernelKit/KernelTaskScheduler.h b/dev/kernel/KernelKit/KernelTaskScheduler.h
index ca10003f..57b83ccb 100644
--- a/dev/kernel/KernelKit/KernelTaskScheduler.h
+++ b/dev/kernel/KernelKit/KernelTaskScheduler.h
@@ -12,4 +12,16 @@
#include <ArchKit/ArchKit.h>
#include <KernelKit/CoreProcessScheduler.h>
-#include <KernelKit/LockDelegate.h> \ No newline at end of file
+#include <KernelKit/LockDelegate.h>
+
+namespace Kernel {
+class KERNEL_TASK final {
+ public:
+ Char Name[kSchedNameLen] = {"KERNEL_TASK"};
+ ProcessSubsystem SubSystem{ProcessSubsystem::kProcessSubsystemDriver};
+ HAL::StackFramePtr StackFrame{nullptr};
+ UInt8* StackReserve{nullptr};
+ SizeT StackSize{kSchedMaxStackSz};
+ PROCESS_IMAGE Image{};
+};
+} // namespace Kernel \ No newline at end of file
diff --git a/dev/kernel/KernelKit/LoaderInterface.h b/dev/kernel/KernelKit/LoaderInterface.h
index 2b38ddbf..1f9b1e56 100644
--- a/dev/kernel/KernelKit/LoaderInterface.h
+++ b/dev/kernel/KernelKit/LoaderInterface.h
@@ -7,8 +7,8 @@
#pragma once
#include <CompilerKit/CompilerKit.h>
-#include <NewKit/Defines.h>
-#include <NewKit/ErrorOr.h>
+#include <NeKit/Defines.h>
+#include <NeKit/ErrorOr.h>
#include <hint/CompilerHint.h>
namespace Kernel {
diff --git a/dev/kernel/KernelKit/LockDelegate.h b/dev/kernel/KernelKit/LockDelegate.h
index 18ab0cf5..b5977c92 100644
--- a/dev/kernel/KernelKit/LockDelegate.h
+++ b/dev/kernel/KernelKit/LockDelegate.h
@@ -6,13 +6,13 @@
#pragma once
-#include <NewKit/Atom.h>
-#include <NewKit/Defines.h>
+#include <NeKit/Atom.h>
+#include <NeKit/Defines.h>
namespace Kernel {
enum {
- kLockInvalid,
- kLockDone = 200,
+ kLockInvalid = 0,
+ kLockDone = 200,
kLockTimedOut,
kLockCount = 3,
};
diff --git a/dev/kernel/KernelKit/MSDOS.h b/dev/kernel/KernelKit/MSDOS.h
index a0751a6f..b4ffeff2 100644
--- a/dev/kernel/KernelKit/MSDOS.h
+++ b/dev/kernel/KernelKit/MSDOS.h
@@ -15,7 +15,7 @@
#define __MSDOS_EXEC__
#include <KernelKit/PE.h>
-#include <NewKit/Defines.h>
+#include <NeKit/Defines.h>
// Last Rev
// Sat Feb 24 CET 2024
diff --git a/dev/kernel/KernelKit/PCI/DMA.h b/dev/kernel/KernelKit/PCI/DMA.h
index 66d64f61..7e7d3f0c 100644
--- a/dev/kernel/KernelKit/PCI/DMA.h
+++ b/dev/kernel/KernelKit/PCI/DMA.h
@@ -8,17 +8,18 @@
#include <KernelKit/DeviceMgr.h>
#include <KernelKit/PCI/Device.h>
-#include <NewKit/Array.h>
-#include <NewKit/OwnPtr.h>
-#include <NewKit/Ref.h>
+#include <NeKit/Array.h>
+#include <NeKit/OwnPtr.h>
+#include <NeKit/Ref.h>
namespace Kernel {
enum class DmaKind {
- PCI, // Bus mastering is required to be turned on. Basiaclly a request
+ PCI = 10, // 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,
+ Count = 2,
+ Invalid = 0,
};
class DMAWrapper final {
diff --git a/dev/kernel/KernelKit/PCI/Database.h b/dev/kernel/KernelKit/PCI/Database.h
index 6da653dd..093338da 100644
--- a/dev/kernel/KernelKit/PCI/Database.h
+++ b/dev/kernel/KernelKit/PCI/Database.h
@@ -6,7 +6,7 @@
#pragma once
#include <KernelKit/PCI/Device.h>
-#include <NewKit/Defines.h>
+#include <NeKit/Defines.h>
namespace Kernel {
namespace Types {
diff --git a/dev/kernel/KernelKit/PCI/Device.h b/dev/kernel/KernelKit/PCI/Device.h
index d9bb4e70..f41e0575 100644
--- a/dev/kernel/KernelKit/PCI/Device.h
+++ b/dev/kernel/KernelKit/PCI/Device.h
@@ -5,7 +5,7 @@
------------------------------------------- */
#pragma once
-#include <NewKit/Defines.h>
+#include <NeKit/Defines.h>
namespace Kernel::PCI {
enum class PciConfigKind : UShort {
diff --git a/dev/kernel/KernelKit/PCI/Express.h b/dev/kernel/KernelKit/PCI/Express.h
index 4d94830c..c9d65da7 100644
--- a/dev/kernel/KernelKit/PCI/Express.h
+++ b/dev/kernel/KernelKit/PCI/Express.h
@@ -7,6 +7,6 @@
#pragma once
#include <KernelKit/PCI/PCI.h>
-#include <NewKit/Defines.h>
+#include <NeKit/Defines.h>
#define PCI_EXPRESS_BUS_COUNT (4096)
diff --git a/dev/kernel/KernelKit/PCI/IO.h b/dev/kernel/KernelKit/PCI/IO.h
index bd5751ec..a7abc163 100644
--- a/dev/kernel/KernelKit/PCI/IO.h
+++ b/dev/kernel/KernelKit/PCI/IO.h
@@ -7,9 +7,9 @@
#pragma once
#include <ArchKit/ArchKit.h>
-#include <NewKit/Array.h>
-#include <NewKit/Defines.h>
-#include <NewKit/Ref.h>
+#include <NeKit/Array.h>
+#include <NeKit/Defines.h>
+#include <NeKit/Ref.h>
namespace Kernel {
template <SizeT Sz>
diff --git a/dev/kernel/KernelKit/PCI/Iterator.h b/dev/kernel/KernelKit/PCI/Iterator.h
index 10924bc8..d4c89404 100644
--- a/dev/kernel/KernelKit/PCI/Iterator.h
+++ b/dev/kernel/KernelKit/PCI/Iterator.h
@@ -9,9 +9,9 @@
#include <KernelKit/PCI/Database.h>
#include <KernelKit/PCI/Device.h>
-#include <NewKit/Array.h>
-#include <NewKit/Defines.h>
-#include <NewKit/Ref.h>
+#include <NeKit/Array.h>
+#include <NeKit/Defines.h>
+#include <NeKit/Ref.h>
#define NE_BUS_COUNT (256)
#define NE_DEVICE_COUNT (33)
diff --git a/dev/kernel/KernelKit/PCI/PCI.h b/dev/kernel/KernelKit/PCI/PCI.h
index 7b30d455..d8805a0c 100644
--- a/dev/kernel/KernelKit/PCI/PCI.h
+++ b/dev/kernel/KernelKit/PCI/PCI.h
@@ -6,7 +6,7 @@
#pragma once
-#include <NewKit/Defines.h>
+#include <NeKit/Defines.h>
#define kPCIConfigAddressPort (0xCF8)
#define kPCIConfigDataPort (0xCFC)
diff --git a/dev/kernel/KernelKit/PE.h b/dev/kernel/KernelKit/PE.h
index b961e901..df5047a3 100644
--- a/dev/kernel/KernelKit/PE.h
+++ b/dev/kernel/KernelKit/PE.h
@@ -14,7 +14,7 @@
#ifndef __KERNELKIT_INC_PE_H__
#define __KERNELKIT_INC_PE_H__
-#include <NewKit/Defines.h>
+#include <NeKit/Defines.h>
#define kPeSignature (0x00004550)
diff --git a/dev/kernel/KernelKit/PECodeMgr.h b/dev/kernel/KernelKit/PECodeMgr.h
index 05a2674c..15c2b7ee 100644
--- a/dev/kernel/KernelKit/PECodeMgr.h
+++ b/dev/kernel/KernelKit/PECodeMgr.h
@@ -22,8 +22,8 @@
#include <KernelKit/FileMgr.h>
#include <KernelKit/LoaderInterface.h>
#include <KernelKit/PE.h>
-#include <NewKit/ErrorOr.h>
-#include <NewKit/KString.h>
+#include <NeKit/ErrorOr.h>
+#include <NeKit/KString.h>
#ifndef INC_PROCESS_SCHEDULER_H
#include <KernelKit/ProcessScheduler.h>
diff --git a/dev/kernel/KernelKit/PEF.h b/dev/kernel/KernelKit/PEF.h
index 9381e491..c28c8f8c 100644
--- a/dev/kernel/KernelKit/PEF.h
+++ b/dev/kernel/KernelKit/PEF.h
@@ -16,7 +16,7 @@
#include <CompilerKit/CompilerKit.h>
#include <KernelKit/LoaderInterface.h>
-#include <NewKit/Defines.h>
+#include <NeKit/Defines.h>
#define kPefMagic "Joy!"
#define kPefMagicFat "yoJ!"
diff --git a/dev/kernel/KernelKit/PEFCodeMgr.h b/dev/kernel/KernelKit/PEFCodeMgr.h
index a637892f..18041f8f 100644
--- a/dev/kernel/KernelKit/PEFCodeMgr.h
+++ b/dev/kernel/KernelKit/PEFCodeMgr.h
@@ -9,8 +9,8 @@
#include <KernelKit/FileMgr.h>
#include <KernelKit/PEF.h>
-#include <NewKit/ErrorOr.h>
-#include <NewKit/KString.h>
+#include <NeKit/ErrorOr.h>
+#include <NeKit/KString.h>
#ifndef INC_PROCESS_SCHEDULER_H
#include <KernelKit/ProcessScheduler.h>
diff --git a/dev/kernel/KernelKit/Semaphore.h b/dev/kernel/KernelKit/Semaphore.h
index 9a66b9fe..a1b5ecad 100644
--- a/dev/kernel/KernelKit/Semaphore.h
+++ b/dev/kernel/KernelKit/Semaphore.h
@@ -8,7 +8,7 @@
#include <CompilerKit/CompilerKit.h>
#include <KernelKit/Timer.h>
-#include <NewKit/Defines.h>
+#include <NeKit/Defines.h>
namespace Kernel {
typedef Int64 Semaphore;
diff --git a/dev/kernel/KernelKit/ThreadLocalStorage.h b/dev/kernel/KernelKit/ThreadLocalStorage.h
index bf34f39a..6c764221 100644
--- a/dev/kernel/KernelKit/ThreadLocalStorage.h
+++ b/dev/kernel/KernelKit/ThreadLocalStorage.h
@@ -7,8 +7,8 @@
#ifndef KERNELKIT_TLS_H
#define KERNELKIT_TLS_H
-#include <NewKit/Defines.h>
-#include <NewKit/ErrorOr.h>
+#include <NeKit/Defines.h>
+#include <NeKit/ErrorOr.h>
///! @brief Thread Local Storage for neoskrnl.
diff --git a/dev/kernel/KernelKit/ThreadLocalStorage.inl b/dev/kernel/KernelKit/ThreadLocalStorage.inl
index 553f8d42..7c7a0b7f 100644
--- a/dev/kernel/KernelKit/ThreadLocalStorage.inl
+++ b/dev/kernel/KernelKit/ThreadLocalStorage.inl
@@ -15,7 +15,7 @@ template <typename T>
inline T* tls_new_ptr(void) noexcept {
using namespace Kernel;
- auto ref_process = UserProcessScheduler::The().CurrentProcess();
+ auto ref_process = UserProcessScheduler::The().TheCurrentProcess();
MUST_PASS(ref_process);
auto pointer = ref_process.Leak().New(sizeof(T));
@@ -33,7 +33,7 @@ inline Kernel::Bool tls_delete_ptr(T* obj) noexcept {
if (!obj) return No;
- auto ref_process = UserProcessScheduler::The().CurrentProcess();
+ auto ref_process = UserProcessScheduler::The().TheCurrentProcess();
MUST_PASS(ref_process);
ErrorOr<T*> obj_wrapped{obj};
diff --git a/dev/kernel/KernelKit/Timer.h b/dev/kernel/KernelKit/Timer.h
index d6cfee39..2d040535 100644
--- a/dev/kernel/KernelKit/Timer.h
+++ b/dev/kernel/KernelKit/Timer.h
@@ -60,16 +60,16 @@ class HardwareTimer final : public TimerInterface {
Int64 fWaitFor{0};
};
-inline Int64 rtl_microseconds(Int64 time) {
- if (time < 0) return 0;
+inline UInt64 rtl_microseconds(UInt64 time) {
+ if (time < 1) return 0;
// TODO: nanoseconds maybe?
- return kTimeUnit * time;
+ return time / kTimeUnit;
}
-inline Int64 rtl_milliseconds(Int64 time) {
- if (time < 0) return 0;
+inline UInt64 rtl_milliseconds(UInt64 time) {
+ if (time < 1) return 0;
- return kTimeUnit * kTimeUnit * time;
+ return time;
}
} // namespace Kernel
diff --git a/dev/kernel/KernelKit/User.h b/dev/kernel/KernelKit/UserMgr.h
index 250b1dfc..82f8ca66 100644
--- a/dev/kernel/KernelKit/User.h
+++ b/dev/kernel/KernelKit/UserMgr.h
@@ -11,22 +11,22 @@
Revision History:
- 04/03/25: Set users directory as /user/ instead of /usr/
+ 04/03/25: Set users directory as /libSystem/ instead of /usr/
------------------------------------------- */
#include <CompilerKit/CompilerKit.h>
#include <KernelKit/KPC.h>
-#include <NewKit/Defines.h>
-#include <NewKit/KString.h>
+#include <NeKit/Defines.h>
+#include <NeKit/KString.h>
///! We got the Super, Standard (%s format) and Guest user,
///! all are used to make authorization operations on the OS.
-#define kSuperUser "OS AUTHORITY/SUPER/%s"
+#define kSuperUser "OS AUTHORITY/MGMT/%s"
#define kGuestUser "OS AUTHORITY/GUEST/%s"
#define kStdUser "OS AUTHORITY/STD/%s"
-#define kUsersDir "/user/"
+#define kUsersDir "/users/"
#define kMaxUserNameLen (256U)
#define kMaxUserTokenLen (256U)
@@ -45,7 +45,7 @@ enum class UserRingKind {
typedef Char* UserPublicKey;
typedef Char UserPublicKeyType;
-/// @brief User class.
+/// @brief System User class.
class User final {
public:
User() = delete;
@@ -80,12 +80,12 @@ class User final {
/// @brief Checks if a password matches the **password**.
/// @param password the password to check.
- Bool Matches(const UserPublicKey password) noexcept;
+ Bool Login(const UserPublicKey password) noexcept;
private:
UserRingKind mUserRing{UserRingKind::kRingStdUser};
Char mUserName[kMaxUserNameLen] = {0};
- Char mUserKey[kMaxUserTokenLen] = {0};
+ UInt64 mUserFNV{0UL};
};
} // namespace Kernel
diff --git a/dev/kernel/KernelKit/UserProcessScheduler.h b/dev/kernel/KernelKit/UserProcessScheduler.h
index 3ed3cbfe..14986ab6 100644
--- a/dev/kernel/KernelKit/UserProcessScheduler.h
+++ b/dev/kernel/KernelKit/UserProcessScheduler.h
@@ -14,18 +14,8 @@
#include <ArchKit/ArchKit.h>
#include <KernelKit/CoreProcessScheduler.h>
#include <KernelKit/LockDelegate.h>
-#include <KernelKit/User.h>
-#include <NewKit/MutableArray.h>
-
-#define kSchedMinMicroTime (AffinityKind::kStandard)
-#define kSchedInvalidPID (-1)
-#define kSchedProcessLimitPerTeam (32U)
-#define kSchedTeamCount (256U)
-
-#define kSchedMaxMemoryLimit gib_cast(128) /* max physical memory limit */
-#define kSchedMaxStackSz mib_cast(8) /* maximum stack size */
-
-#define kSchedNameLen (128U)
+#include <KernelKit/UserMgr.h>
+#include <NeKit/MutableArray.h>
////////////////////////////////////////////////////
// Last revision date is: Fri Mar 28 2025 //
@@ -52,12 +42,12 @@ class USER_PROCESS final {
public:
Char Name[kSchedNameLen] = {"USER_PROCESS"};
- ProcessSubsystem SubSystem{ProcessSubsystem::kProcessSubsystemInvalid};
+ ProcessSubsystem SubSystem{ProcessSubsystem::kProcessSubsystemUser};
User* Owner{nullptr};
HAL::StackFramePtr StackFrame{nullptr};
AffinityKind Affinity{AffinityKind::kStandard};
ProcessStatusKind Status{ProcessStatusKind::kKilled};
- UInt8* StackReserve{nullptr};
+ UInt8 StackReserve[kSchedMaxStackSz];
PROCESS_IMAGE Image{};
SizeT StackSize{kSchedMaxStackSz};
IDylibObject* DylibDelegate{nullptr};
@@ -65,37 +55,16 @@ class USER_PROCESS final {
SizeT MemoryLimit{kSchedMaxMemoryLimit};
SizeT UsedMemory{0UL};
- /// @brief Allocation tracker structure.
- struct USER_HEAP_TREE final {
- VoidPtr MemoryEntry{nullptr};
- SizeT MemoryEntrySize{0UL};
- SizeT MemoryEntryPad{0UL};
-
- enum {
- kInvalidMemory = 0,
- kRedMemory = 100,
- kBlackMemory = 101,
- kCountMemory = 2,
- };
-
- Int32 MemoryColor{kBlackMemory};
-
- struct USER_HEAP_TREE* MemoryParent{nullptr};
- struct USER_HEAP_TREE* MemoryChild{nullptr};
-
- struct USER_HEAP_TREE* MemoryPrev{nullptr};
- struct USER_HEAP_TREE* MemoryNext{nullptr};
- };
-
struct USER_PROCESS_SIGNAL final {
- UIntPtr SignalArg;
- ProcessStatusKind Status;
- UIntPtr SignalID;
+ UIntPtr SignalArg{0};
+ ProcessStatusKind Status{ProcessStatusKind::kKilled};
+ UIntPtr SignalID{0};
};
- USER_PROCESS_SIGNAL Signal;
- USER_HEAP_TREE* HeapTree{nullptr};
- UserProcessTeam* ParentTeam;
+ USER_PROCESS_SIGNAL Signal;
+ PROCESS_FILE_TREE<UInt32*>* FileTree{nullptr};
+ PROCESS_HEAP_TREE<VoidPtr>* HeapTree{nullptr};
+ UserProcessTeam* ParentTeam;
VoidPtr VMRegister{0UL};
@@ -107,7 +76,8 @@ class USER_PROCESS final {
};
ProcessTime PTime{0}; //! @brief Process allocated tine.
- ProcessTime RTime{0}; //! @brief Process Run time
+ ProcessTime RTime{0}; //! @brief Process run time.
+ ProcessTime UTime{0}; //! #brief Process used time.
PID ProcessId{kSchedInvalidPID};
Int32 Kind{kExecutableKind};
@@ -123,6 +93,8 @@ class USER_PROCESS final {
/***********************************************************************************/
Void Crash();
+ Bool SpawnDylib();
+
/***********************************************************************************/
///! @brief Exits the app.
/***********************************************************************************/
@@ -215,11 +187,12 @@ class UserProcessScheduler final : public ISchedulable {
NE_COPY_DELETE(UserProcessScheduler)
NE_MOVE_DELETE(UserProcessScheduler)
+ public:
operator bool();
bool operator!();
public:
- UserProcessTeam& CurrentTeam();
+ UserProcessTeam& TheCurrentTeam();
BOOL SwitchTeam(UserProcessTeam& team);
public:
@@ -231,7 +204,7 @@ class UserProcessScheduler final : public ISchedulable {
Bool HasMP() override;
public:
- Ref<USER_PROCESS>& CurrentProcess();
+ Ref<USER_PROCESS>& TheCurrentProcess();
SizeT Run() noexcept;
public:
@@ -249,8 +222,7 @@ class UserProcessScheduler final : public ISchedulable {
class UserProcessHelper final {
public:
- STATIC Bool Switch(VoidPtr image_ptr, UInt8* stack_ptr, HAL::StackFramePtr frame_ptr,
- PID new_pid);
+ STATIC Bool Switch(HAL::StackFramePtr frame_ptr, PID new_pid);
STATIC Bool CanBeScheduled(const USER_PROCESS& process);
STATIC ErrorOr<PID> TheCurrentPID();
STATIC SizeT StartScheduling();
diff --git a/dev/kernel/KernelKit/UserProcessScheduler.inl b/dev/kernel/KernelKit/UserProcessScheduler.inl
index 2333b898..df35e037 100644
--- a/dev/kernel/KernelKit/UserProcessScheduler.inl
+++ b/dev/kernel/KernelKit/UserProcessScheduler.inl
@@ -11,13 +11,17 @@
/// @author Amlal El Mahrouss (amlal@nekernel.org)
/// @date Tue Apr 22 22:01:07 CEST 2025
+#ifndef INC_PROCESS_SCHEDULER_H
+#include <KernelKit/UserProcessScheduler.h>
+#endif // INC_PROCESS_SCHEDULER_H
+
namespace Kernel {
/***********************************************************************************/
/** @brief Free pointer from usage. */
/***********************************************************************************/
template <typename T>
-Boolean USER_PROCESS::Delete(ErrorOr<T*> ptr) {
+BOOL USER_PROCESS::Delete(ErrorOr<T*> ptr) {
if (!ptr) return No;
if (!this->HeapTree) {
@@ -25,30 +29,30 @@ Boolean USER_PROCESS::Delete(ErrorOr<T*> ptr) {
return No;
}
- USER_HEAP_TREE* entry = this->HeapTree;
+ PROCESS_HEAP_TREE<VoidPtr>* entry = this->HeapTree;
while (entry != nullptr) {
- if (entry->MemoryEntry == ptr.Leak().Leak()) {
- this->UsedMemory -= entry->MemoryEntrySize;
+ if (entry->Entry == ptr.Leak().Leak()) {
+ this->UsedMemory -= entry->EntrySize;
#ifdef __NE_AMD64__
auto pd = hal_read_cr3();
hal_write_cr3(this->VMRegister);
- auto ret = mm_delete_heap(entry->MemoryEntry);
+ auto ret = mm_free_ptr(entry->Entry);
hal_write_cr3(pd);
return ret == kErrorSuccess;
#else
- Bool ret = mm_delete_heap(ptr.Leak().Leak());
+ Bool ret = mm_free_ptr(ptr.Leak().Leak());
return ret == kErrorSuccess;
#endif
}
- entry = entry->MemoryNext;
+ entry = entry->Next;
}
kout << "USER_PROCESS: Trying to free a pointer which doesn't exist.\r";
diff --git a/dev/kernel/KernelKit/XCOFF.h b/dev/kernel/KernelKit/XCOFF.h
index 7b15782b..9cfe8ded 100644
--- a/dev/kernel/KernelKit/XCOFF.h
+++ b/dev/kernel/KernelKit/XCOFF.h
@@ -14,7 +14,7 @@
#ifndef INC_XOCFF_H
#define INC_XOCFF_H
-#include <NewKit/Defines.h>
+#include <NeKit/Defines.h>
#define kXCOFF64Magic (0x01F7)
#define kXCOFF64ForkNameLen (256U)
diff --git a/dev/kernel/KernelKit/ZXD.h b/dev/kernel/KernelKit/ZXD.h
new file mode 100644
index 00000000..10af568b
--- /dev/null
+++ b/dev/kernel/KernelKit/ZXD.h
@@ -0,0 +1,43 @@
+/* -------------------------------------------
+
+ Copyright (C) 2025, Amlal El Mahrouss, all rights reserved.
+
+------------------------------------------- */
+
+#pragma once
+
+#include <NeKit/Defines.h>
+
+namespace ZXD {
+using namespace Kernel;
+
+struct ZXD_EXEC_HEADER;
+struct ZXD_STUB_HEADER;
+
+/// @brief ZXD executable header
+/// @details This header is used to identify ZXD executable files.
+struct ZXD_EXEC_HEADER {
+ UInt32 fMagic;
+ UInt32 fVersion;
+ UInt32 fFlags;
+ UInt32 fHdrSize;
+ UInt32 fCRC32;
+ UInt32 fAssigneeSignature;
+ UInt32 fIssuerSingature;
+ UIntPtr fExecOffset;
+ SizeT fExecSize;
+ UIntPtr fStubOffset;
+ SizeT fStubSize;
+ SizeT fStubAlign;
+ SizeT fStubCount;
+};
+
+/// @brief ZXD stub header
+/// @details This header is used to identify ZXD stub files. It contains the size of the stub, the
+/// offset of the stub, and the CRC32 checksum of the stub.
+struct ZXD_STUB_HEADER {
+ UInt32 fStubSize;
+ UInt32 fStubOffset;
+ UInt32 fStubCRC32;
+};
+} // namespace ZXD \ No newline at end of file
diff --git a/dev/kernel/NewKit/Array.h b/dev/kernel/NeKit/Array.h
index af73d002..12c062cb 100644
--- a/dev/kernel/NewKit/Array.h
+++ b/dev/kernel/NeKit/Array.h
@@ -7,8 +7,8 @@
#pragma once
#include <KernelKit/DebugOutput.h>
-#include <NewKit/Defines.h>
-#include <NewKit/ErrorOr.h>
+#include <NeKit/Defines.h>
+#include <NeKit/ErrorOr.h>
namespace Kernel {
template <typename T, SizeT N>
@@ -20,16 +20,16 @@ class Array final {
Array& operator=(const Array&) = default;
Array(const Array&) = default;
- T& operator[](SizeT at) {
- MUST_PASS(at < this->Count());
- return fArray[at];
- }
+ T& operator[](SizeT at) { return fArray[at]; }
Boolean Empty() { return this->Count() > 0; }
SizeT Capacity() { return N; }
- SizeT Count() { return N; }
+ SizeT Count() {
+ const static SizeT kArrCnt = N;
+ return kArrCnt; // avoid constexpr error.
+ }
const T* CData() { return fArray; }
diff --git a/dev/kernel/NewKit/ArrayList.h b/dev/kernel/NeKit/ArrayList.h
index d07e534c..1f5226f4 100644
--- a/dev/kernel/NewKit/ArrayList.h
+++ b/dev/kernel/NeKit/ArrayList.h
@@ -6,7 +6,7 @@
#pragma once
-#include <NewKit/Defines.h>
+#include <NeKit/Defines.h>
namespace Kernel {
template <typename T>
diff --git a/dev/kernel/NewKit/Atom.h b/dev/kernel/NeKit/Atom.h
index 4b23c933..fce5e93d 100644
--- a/dev/kernel/NewKit/Atom.h
+++ b/dev/kernel/NeKit/Atom.h
@@ -5,7 +5,7 @@
------------------------------------------- */
#pragma once
-#include <NewKit/Defines.h>
+#include <NeKit/Defines.h>
namespace Kernel {
template <typename T>
diff --git a/dev/kernel/NewKit/Crc32.h b/dev/kernel/NeKit/Crc32.h
index b6f33714..8988f828 100644
--- a/dev/kernel/NewKit/Crc32.h
+++ b/dev/kernel/NeKit/Crc32.h
@@ -11,7 +11,7 @@
#ifndef CRC32_H
#define CRC32_H
-#include <NewKit/Defines.h>
+#include <NeKit/Defines.h>
#define kCrcCnt (256)
diff --git a/dev/kernel/NewKit/CxxAbi.h b/dev/kernel/NeKit/CxxAbi.h
index 8fb93bf8..164a257d 100644
--- a/dev/kernel/NewKit/CxxAbi.h
+++ b/dev/kernel/NeKit/CxxAbi.h
@@ -5,7 +5,7 @@
------------------------------------------- */
#pragma once
-#include <NewKit/Defines.h>
+#include <NeKit/Defines.h>
#ifndef __TOOLCHAINKIT__
diff --git a/dev/kernel/NewKit/Defines.h b/dev/kernel/NeKit/Defines.h
index 0d2f830f..0f9a7c4a 100644
--- a/dev/kernel/NewKit/Defines.h
+++ b/dev/kernel/NeKit/Defines.h
@@ -6,7 +6,7 @@
#pragma once
-#include <NewKit/Macros.h>
+#include <NeKit/Macros.h>
#define NEWKIT_VERSION_STR "0.0.1"
#define NEWKIT_VERSION_BCD 0x0001
diff --git a/dev/kernel/NewKit/ErrorOr.h b/dev/kernel/NeKit/ErrorOr.h
index f2de3432..d7751b7e 100644
--- a/dev/kernel/NewKit/ErrorOr.h
+++ b/dev/kernel/NeKit/ErrorOr.h
@@ -9,8 +9,8 @@
#pragma once
-#include <NewKit/Defines.h>
-#include <NewKit/Ref.h>
+#include <NeKit/Defines.h>
+#include <NeKit/Ref.h>
namespace Kernel {
using ErrorT = UInt;
diff --git a/dev/kernel/NewKit/Function.h b/dev/kernel/NeKit/Function.h
index e0af5842..cddcc215 100644
--- a/dev/kernel/NewKit/Function.h
+++ b/dev/kernel/NeKit/Function.h
@@ -1,7 +1,14 @@
-#ifndef _INC_FUNCTION_H__
-#define _INC_FUNCTION_H__
+/* -------------------------------------------
-#include <NewKit/Defines.h>
+ Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved.
+
+------------------------------------------- */
+
+#ifndef _INC_FUNCTION_H_
+#define _INC_FUNCTION_H_
+
+#include <NeKit/Defines.h>
+#include <NeKit/ErrorOr.h>
namespace Kernel {
template <typename T, typename... Args>
@@ -18,12 +25,12 @@ class Function final {
Function(const Function&) = default;
template <typename... XArgs>
- T operator()(Args... args) {
+ T operator()(Args&&... args) {
return fFn(args...);
}
template <typename... XArgs>
- T Call(Args... args) {
+ T Call(Args&&... args) {
return fFn(args...);
}
@@ -35,6 +42,9 @@ class Function final {
T(*fFn)
(Args... args);
};
+
+template <typename T, typename... Args>
+using FunctionOr = ErrorOr<Function<T, Args...>>;
} // namespace Kernel
#endif // !_INC_FUNCTION_H__
diff --git a/dev/kernel/NewKit/Json.h b/dev/kernel/NeKit/Json.h
index 6af71b72..2b2c9c04 100644
--- a/dev/kernel/NewKit/Json.h
+++ b/dev/kernel/NeKit/Json.h
@@ -10,10 +10,10 @@
// last-rev: 02/04/25
#include <CompilerKit/CompilerKit.h>
-#include <NewKit/Defines.h>
-#include <NewKit/KString.h>
-#include <NewKit/Stream.h>
-#include <NewKit/Utils.h>
+#include <NeKit/Defines.h>
+#include <NeKit/KString.h>
+#include <NeKit/Stream.h>
+#include <NeKit/Utils.h>
#define kJSONMaxLen (8196)
#define kJSONLen (256)
diff --git a/dev/kernel/NewKit/KString.h b/dev/kernel/NeKit/KString.h
index 08f783c0..16b09a78 100644
--- a/dev/kernel/NewKit/KString.h
+++ b/dev/kernel/NeKit/KString.h
@@ -7,10 +7,10 @@
#pragma once
#include <CompilerKit/CompilerKit.h>
-#include <NewKit/Defines.h>
-#include <NewKit/ErrorOr.h>
-#include <NewKit/KernelPanic.h>
-#include <NewKit/Utils.h>
+#include <NeKit/Defines.h>
+#include <NeKit/ErrorOr.h>
+#include <NeKit/KernelPanic.h>
+#include <NeKit/Utils.h>
#define kMinimumStringSize (8196U)
diff --git a/dev/kernel/NewKit/KernelPanic.h b/dev/kernel/NeKit/KernelPanic.h
index 6d7f4d23..753b18de 100644
--- a/dev/kernel/NewKit/KernelPanic.h
+++ b/dev/kernel/NeKit/KernelPanic.h
@@ -7,7 +7,7 @@
#pragma once
-#include <NewKit/Defines.h>
+#include <NeKit/Defines.h>
namespace Kernel {
void ke_runtime_check(bool expr, const Char* file, const Char* line);
diff --git a/dev/kernel/NewKit/Macros.h b/dev/kernel/NeKit/Macros.h
index ef4742d3..b46ffaa8 100644
--- a/dev/kernel/NewKit/Macros.h
+++ b/dev/kernel/NeKit/Macros.h
@@ -7,7 +7,7 @@
#pragma once
/***********************************************************************************/
-/// @file NewKit/Macros.h
+/// @file NeKit/Macros.h
/// @brief Core Types and Macros.
/***********************************************************************************/
@@ -121,11 +121,14 @@
#endif // !RGB
#ifdef __NE_AMD64__
-#define dbg_break_point() asm volatile("int $3")
+#define DBG_TRAP() asm volatile("int $3")
#else
-#define dbg_break_point() ((void) 0)
+#define DBG_TRAP() ((Kernel::Void) 0)
#endif
+#define LIKELY(ARG) ((ARG) ? MUST_PASS(NO) : ((Kernel::Void) 0))
+#define UNLIKELY(ARG) LIKELY(!(ARG))
+
#define RTL_ENDIAN(address, value) \
(((reinterpret_cast<Kernel::Char*>(address)[0]) == (value)) ? (Kernel::Endian::kEndianBig) \
: (Kernel::Endian::kEndianLittle))
diff --git a/dev/kernel/NewKit/MutableArray.h b/dev/kernel/NeKit/MutableArray.h
index 08c8cbf5..8dee6e03 100644
--- a/dev/kernel/NewKit/MutableArray.h
+++ b/dev/kernel/NeKit/MutableArray.h
@@ -6,8 +6,8 @@
#pragma once
#include <CompilerKit/CompilerKit.h>
-#include <NewKit/Array.h>
-#include <NewKit/Defines.h>
+#include <NeKit/Array.h>
+#include <NeKit/Defines.h>
#define TRY_FIND_NODE(NAME, NODE) \
auto* NAME = NODE; \
diff --git a/dev/kernel/NeKit/NeKit.h b/dev/kernel/NeKit/NeKit.h
new file mode 100644
index 00000000..909e1311
--- /dev/null
+++ b/dev/kernel/NeKit/NeKit.h
@@ -0,0 +1,20 @@
+
+/* -------------------------------------------
+
+ Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved.
+
+------------------------------------------- */
+
+#pragma once
+
+#include <NeKit/Array.h>
+#include <NeKit/ArrayList.h>
+#include <NeKit/ErrorOr.h>
+#include <NeKit/Json.h>
+#include <NeKit/KernelPanic.h>
+#include <NeKit/MutableArray.h>
+#include <NeKit/New.h>
+#include <NeKit/OwnPtr.h>
+#include <NeKit/Ref.h>
+#include <NeKit/Stream.h>
+#include <NeKit/Utils.h>
diff --git a/dev/kernel/NewKit/New.h b/dev/kernel/NeKit/New.h
index de242141..8ddd88de 100644
--- a/dev/kernel/NewKit/New.h
+++ b/dev/kernel/NeKit/New.h
@@ -7,7 +7,7 @@
#pragma once
-#include <KernelKit/MemoryMgr.h>
+#include <KernelKit/HeapMgr.h>
/// @note compatible with tk too.
typedef __SIZE_TYPE__ size_t;
diff --git a/dev/kernel/NewKit/OwnPtr.h b/dev/kernel/NeKit/OwnPtr.h
index 14b2fe39..674f9ff3 100644
--- a/dev/kernel/NewKit/OwnPtr.h
+++ b/dev/kernel/NeKit/OwnPtr.h
@@ -7,9 +7,9 @@
#pragma once
-#include <NewKit/Defines.h>
-#include <NewKit/KernelPanic.h>
-#include <NewKit/Ref.h>
+#include <NeKit/Defines.h>
+#include <NeKit/KernelPanic.h>
+#include <NeKit/Ref.h>
namespace Kernel {
template <typename T>
diff --git a/dev/kernel/NewKit/PageMgr.h b/dev/kernel/NeKit/PageMgr.h
index 3aef2733..ae74a6b6 100644
--- a/dev/kernel/NewKit/PageMgr.h
+++ b/dev/kernel/NeKit/PageMgr.h
@@ -9,8 +9,8 @@
#pragma once
-#include <NewKit/Defines.h>
-#include <NewKit/Ref.h>
+#include <NeKit/Defines.h>
+#include <NeKit/Ref.h>
namespace Kernel {
class PageMgr;
diff --git a/dev/kernel/NewKit/Pair.h b/dev/kernel/NeKit/Pair.h
index 28512831..aeeeb8a2 100644
--- a/dev/kernel/NewKit/Pair.h
+++ b/dev/kernel/NeKit/Pair.h
@@ -6,7 +6,7 @@
#pragma once
-#include <NewKit/Defines.h>
+#include <NeKit/Defines.h>
namespace Kernel {
class Pair;
diff --git a/dev/kernel/NewKit/Pmm.h b/dev/kernel/NeKit/Pmm.h
index 41d988e1..f84bd9f2 100644
--- a/dev/kernel/NewKit/Pmm.h
+++ b/dev/kernel/NeKit/Pmm.h
@@ -7,8 +7,8 @@
#pragma once
-#include <NewKit/PageMgr.h>
-#include <NewKit/Ref.h>
+#include <NeKit/PageMgr.h>
+#include <NeKit/Ref.h>
namespace Kernel {
class Pmm;
diff --git a/dev/kernel/NewKit/Ref.h b/dev/kernel/NeKit/Ref.h
index 6737ce09..9920aa6f 100644
--- a/dev/kernel/NewKit/Ref.h
+++ b/dev/kernel/NeKit/Ref.h
@@ -8,9 +8,9 @@
#ifndef _NEWKIT_REF_H_
#define _NEWKIT_REF_H_
-#include <KernelKit/MemoryMgr.h>
-#include <NewKit/Defines.h>
-#include <NewKit/KernelPanic.h>
+#include <KernelKit/HeapMgr.h>
+#include <NeKit/Defines.h>
+#include <NeKit/KernelPanic.h>
namespace Kernel {
template <typename T>
@@ -19,17 +19,15 @@ class Ref final {
Ref() = default;
~Ref() {
- if (mm_is_valid_heap(fClass)) delete fClass;
+ if (mm_is_valid_ptr(fClass)) delete fClass;
}
public:
Ref(T* cls) : fClass(cls) {}
- Ref(T cls) : fClass(nullptr) { fClass = new T(cls); }
+ Ref(T cls) : fClass(nullptr) { fClass = &cls; }
Ref& operator=(T ref) {
- if (!fClass) return *this;
-
fClass = &ref;
return *this;
}
diff --git a/dev/kernel/NewKit/Stream.h b/dev/kernel/NeKit/Stream.h
index 8b72046c..26fc46fc 100644
--- a/dev/kernel/NewKit/Stream.h
+++ b/dev/kernel/NeKit/Stream.h
@@ -7,8 +7,8 @@
#pragma once
-#include <NewKit/Defines.h>
-#include <NewKit/Ref.h>
+#include <NeKit/Defines.h>
+#include <NeKit/Ref.h>
namespace Kernel {
template <typename StreamTrait, typename Kind>
diff --git a/dev/kernel/NewKit/Utils.h b/dev/kernel/NeKit/Utils.h
index e3420d84..cdfcfe56 100644
--- a/dev/kernel/NewKit/Utils.h
+++ b/dev/kernel/NeKit/Utils.h
@@ -7,7 +7,7 @@
#pragma once
-#include <NewKit/Defines.h>
+#include <NeKit/Defines.h>
namespace Kernel {
Int rt_copy_memory(const voidPtr src, voidPtr dst, Size len);
@@ -26,7 +26,9 @@ Int rt_to_uppercase(Int c);
Int rt_to_lower(Int c);
voidPtr rt_string_in_string(const Char* in, const Char* needle);
char* rt_string_has_char(Char* str, Char chr);
-Void urt_set_memory(const voidPtr src, UInt32 dst, Size len);
-Int urt_copy_memory(const voidPtr src, voidPtr dst, Size len);
-Size urt_string_len(const Utf8Char* str);
+
+Int urt_string_cmp(const Char* src, const Char* cmp, Size len);
+Void urt_set_memory(const voidPtr src, UInt32 dst, Size len);
+Int urt_copy_memory(const voidPtr src, voidPtr dst, Size len);
+Size urt_string_len(const Utf8Char* str);
} // namespace Kernel
diff --git a/dev/kernel/NewKit/Variant.h b/dev/kernel/NeKit/Variant.h
index 83602602..51548272 100644
--- a/dev/kernel/NewKit/Variant.h
+++ b/dev/kernel/NeKit/Variant.h
@@ -6,9 +6,9 @@
#pragma once
-#include <NewKit/Defines.h>
-#include <NewKit/Json.h>
-#include <NewKit/KString.h>
+#include <NeKit/Defines.h>
+#include <NeKit/Json.h>
+#include <NeKit/KString.h>
#include <SwapKit/DiskSwap.h>
namespace Kernel {
diff --git a/dev/kernel/NetworkKit/IP.h b/dev/kernel/NetworkKit/IP.h
index bf3b24ff..0b872352 100644
--- a/dev/kernel/NetworkKit/IP.h
+++ b/dev/kernel/NetworkKit/IP.h
@@ -7,9 +7,9 @@
#pragma once
#include <KernelKit/DebugOutput.h>
-#include <NewKit/Defines.h>
-#include <NewKit/KString.h>
-#include <NewKit/Ref.h>
+#include <NeKit/Defines.h>
+#include <NeKit/KString.h>
+#include <NeKit/Ref.h>
namespace Kernel {
class RawIPAddress6;
diff --git a/dev/kernel/NetworkKit/IPC.h b/dev/kernel/NetworkKit/IPC.h
index 43b58d35..0dd8a1f1 100644
--- a/dev/kernel/NetworkKit/IPC.h
+++ b/dev/kernel/NetworkKit/IPC.h
@@ -10,8 +10,8 @@
#ifndef INC_IPC_H
#define INC_IPC_H
-#include <NewKit/Defines.h>
-#include <NewKit/KString.h>
+#include <NeKit/Defines.h>
+#include <NeKit/KString.h>
#include <hint/CompilerHint.h>
/// @file IPC.h
diff --git a/dev/kernel/NetworkKit/LTE.h b/dev/kernel/NetworkKit/LTE.h
index 71254cbf..030f9955 100644
--- a/dev/kernel/NetworkKit/LTE.h
+++ b/dev/kernel/NetworkKit/LTE.h
@@ -10,7 +10,7 @@
#ifndef _INC_NETWORK_LTE_H_
#define _INC_NETWORK_LTE_H_
-#include <NewKit/Defines.h>
-#include <NewKit/KString.h>
+#include <NeKit/Defines.h>
+#include <NeKit/KString.h>
#endif // ifndef _INC_NETWORK_LTE_H_
diff --git a/dev/kernel/NetworkKit/MAC.h b/dev/kernel/NetworkKit/MAC.h
index 8520037e..805f7259 100644
--- a/dev/kernel/NetworkKit/MAC.h
+++ b/dev/kernel/NetworkKit/MAC.h
@@ -6,9 +6,9 @@
#pragma once
-#include <NewKit/Array.h>
-#include <NewKit/Defines.h>
-#include <NewKit/KString.h>
+#include <NeKit/Array.h>
+#include <NeKit/Defines.h>
+#include <NeKit/KString.h>
#define kMACAddrLen (32)
diff --git a/dev/kernel/NetworkKit/NetworkDevice.h b/dev/kernel/NetworkKit/NetworkDevice.h
index 7ed67bab..c37d8504 100644
--- a/dev/kernel/NetworkKit/NetworkDevice.h
+++ b/dev/kernel/NetworkKit/NetworkDevice.h
@@ -19,11 +19,11 @@ class NetworkDevice;
/**
* \brief Network device interface, establishes a connection to the NIC.
*/
-class NetworkDevice final : public IDeviceObject<NetworkDeviceCommand> {
+class NetworkDevice final NE_DEVICE<NetworkDeviceCommand> {
public:
NetworkDevice(void (*out)(IDeviceObject<NetworkDeviceCommand>*, NetworkDeviceCommand),
void (*in)(IDeviceObject<NetworkDeviceCommand>*, NetworkDeviceCommand),
- void (*onCleanup)(void) = nullptr);
+ void (*cleanup)(void) = nullptr);
~NetworkDevice() override;
@@ -36,10 +36,7 @@ class NetworkDevice final : public IDeviceObject<NetworkDeviceCommand> {
Boolean Name(const Char* newStr);
private:
- static constexpr auto cNetworkNameLen = 512;
-
Void (*fCleanup)(void);
- Char fNetworkName[cNetworkNameLen];
};
struct NetworkDeviceCommand final {
@@ -71,6 +68,12 @@ using GSMNetworkDevice = NetworkDevice;
/// @brief Bluetooth device.
using BTNetworkDevice = NetworkDevice;
+/// @brief Printer device.
+using PrinterNetworkDevice = NetworkDevice;
+
+/// @brief Debug device.
+using DBGNetworkDevice = NetworkDevice;
+
/// @brief LTE device.
using LTENetworkDevice = NetworkDevice;
} // namespace Kernel
diff --git a/dev/kernel/NetworkKit/NetworkDevice.inl b/dev/kernel/NetworkKit/NetworkDevice.inl
index 797b8adc..84ec9edc 100644
--- a/dev/kernel/NetworkKit/NetworkDevice.inl
+++ b/dev/kernel/NetworkKit/NetworkDevice.inl
@@ -8,20 +8,23 @@
Dtor and ctors.
*/
+#ifndef __INC_NETWORK_DEVICE_H__
+#include <NetworkKit/NetworkDevice.h>
+#endif // __INC_NETWORK_DEVICE_H__
+
namespace Kernel {
-NetworkDevice::NetworkDevice(void (*out)(IDeviceObject<NetworkDeviceCommand>*,
- NetworkDeviceCommand),
- void (*in)(IDeviceObject<NetworkDeviceCommand>*, NetworkDeviceCommand),
- void (*on_cleanup)(void))
+inline NetworkDevice::NetworkDevice(void (*out)(IDeviceObject<NetworkDeviceCommand>*,
+ NetworkDeviceCommand),
+ void (*in)(IDeviceObject<NetworkDeviceCommand>*,
+ NetworkDeviceCommand),
+ void (*on_cleanup)(void))
: IDeviceObject<NetworkDeviceCommand>(out, in), fCleanup(on_cleanup) {
kout << "NetworkDevice initialized.\r";
MUST_PASS(out && in && on_cleanup);
}
-NetworkDevice::~NetworkDevice() {
- MUST_PASS(fCleanup);
-
+inline NetworkDevice::~NetworkDevice() {
kout << "NetworkDevice cleanup.\r";
if (fCleanup) fCleanup();
diff --git a/dev/kernel/NewKit/NewKit.h b/dev/kernel/NewKit/NewKit.h
deleted file mode 100644
index 66ca2bb3..00000000
--- a/dev/kernel/NewKit/NewKit.h
+++ /dev/null
@@ -1,20 +0,0 @@
-
-/* -------------------------------------------
-
- Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved.
-
-------------------------------------------- */
-
-#pragma once
-
-#include <NewKit/Array.h>
-#include <NewKit/ArrayList.h>
-#include <NewKit/ErrorOr.h>
-#include <NewKit/Json.h>
-#include <NewKit/KernelPanic.h>
-#include <NewKit/MutableArray.h>
-#include <NewKit/New.h>
-#include <NewKit/OwnPtr.h>
-#include <NewKit/Ref.h>
-#include <NewKit/Stream.h>
-#include <NewKit/Utils.h>
diff --git a/dev/kernel/SignalKit/Signals.h b/dev/kernel/SignalKit/Signals.h
index ba0b80cb..142ed3ab 100644
--- a/dev/kernel/SignalKit/Signals.h
+++ b/dev/kernel/SignalKit/Signals.h
@@ -6,7 +6,7 @@
#pragma once
-#include <NewKit/Defines.h>
+#include <NeKit/Defines.h>
#define SIGKILL 0
#define SIGPAUS 1
diff --git a/dev/kernel/StorageKit/AHCI.h b/dev/kernel/StorageKit/AHCI.h
index d40feb36..e2220719 100644
--- a/dev/kernel/StorageKit/AHCI.h
+++ b/dev/kernel/StorageKit/AHCI.h
@@ -8,7 +8,7 @@
#include <KernelKit/DeviceMgr.h>
#include <KernelKit/DriveMgr.h>
-#include <NewKit/OwnPtr.h>
+#include <NeKit/OwnPtr.h>
namespace Kernel {
/// @brief AHCIDeviceInterface class
diff --git a/dev/kernel/StorageKit/ATA.h b/dev/kernel/StorageKit/ATA.h
index 5887c579..abf255a5 100644
--- a/dev/kernel/StorageKit/ATA.h
+++ b/dev/kernel/StorageKit/ATA.h
@@ -8,8 +8,8 @@
#include <KernelKit/DeviceMgr.h>
#include <KernelKit/DriveMgr.h>
-#include <NewKit/OwnPtr.h>
-#include <NewKit/Utils.h>
+#include <NeKit/OwnPtr.h>
+#include <NeKit/Utils.h>
namespace Kernel {
/// @brief ATA device interface class.
diff --git a/dev/kernel/StorageKit/DmaPool.h b/dev/kernel/StorageKit/DmaPool.h
deleted file mode 100644
index a5d8c880..00000000
--- a/dev/kernel/StorageKit/DmaPool.h
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright (c) 2025 Amlal El Mahrouss. All rights reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-#pragma once
-
-#include <KernelKit/DebugOutput.h>
-
-#ifdef __NE_AMD64__
-#define NE_DMA_POOL_START (0x1000000)
-#define NE_DMA_POOL_SIZE (0x1000000)
-
-namespace Kernel {
-/// @brief DMA pool base pointer, here we're sure that AHCI or whatever tricky standard sees it.
-inline UInt8* kDmaPoolPtr = (UInt8*) NE_DMA_POOL_START;
-inline const UInt8* kDmaPoolEnd = (UInt8*) (NE_DMA_POOL_START + NE_DMA_POOL_SIZE);
-
-/***********************************************************************************/
-/// @brief allocate from the rtl_dma_alloc system.
-/// @param size the size of the chunk to allocate.
-/// @param align alignement of pointer.
-/***********************************************************************************/
-inline VoidPtr rtl_dma_alloc(SizeT size, SizeT align) {
- if (!size) {
- return nullptr;
- }
-
- UIntPtr addr = (UIntPtr) kDmaPoolPtr;
-
- /// here we just align the address according to a `align` variable, i'd rather be a power of two
- /// really.
- addr = (addr + (align - 1)) & ~(align - 1);
-
- if ((addr + size) >= reinterpret_cast<UIntPtr>(kDmaPoolEnd)) {
- kout << "DMA Pool is exhausted!\r";
-
- err_global_get() = kErrorDmaExhausted;
-
- return nullptr;
- }
-
- kDmaPoolPtr = (UInt8*) (addr + size);
- return (VoidPtr) addr;
-}
-
-/***********************************************************************************/
-/// @brief Free DMA pointer.
-/***********************************************************************************/
-inline Void rtl_dma_free(SizeT size) {
- if (!size) return;
-
- kDmaPoolPtr = (UInt8*) (kDmaPoolPtr - size);
-}
-
-/***********************************************************************************/
-/// @brief Flush DMA pointer.
-/***********************************************************************************/
-inline Void rtl_dma_flush(VoidPtr ptr, SizeT size_buffer) {
- if (ptr > (Void*) (NE_DMA_POOL_START + NE_DMA_POOL_SIZE)) {
- return;
- }
-
- if (!ptr) {
- return;
- }
-
- for (SizeT i = 0; i < size_buffer; ++i) {
- asm volatile("clflush (%0)" : : "r"((UInt8*) ptr + i) : "memory");
- }
-
- asm volatile("mfence" ::: "memory");
-}
-} // namespace Kernel
-#endif \ No newline at end of file
diff --git a/dev/kernel/StorageKit/PRDT.h b/dev/kernel/StorageKit/PRDT.h
index f67cad05..f277897f 100644
--- a/dev/kernel/StorageKit/PRDT.h
+++ b/dev/kernel/StorageKit/PRDT.h
@@ -8,7 +8,7 @@
#include <KernelKit/PCI/DMA.h>
#include <KernelKit/PCI/Iterator.h>
-#include <NewKit/Ref.h>
+#include <NeKit/Ref.h>
#define kPrdtTransferSize (sizeof(Kernel::UShort))
diff --git a/dev/kernel/SwapKit/DiskSwap.h b/dev/kernel/SwapKit/DiskSwap.h
index 1832923f..1a0536c9 100644
--- a/dev/kernel/SwapKit/DiskSwap.h
+++ b/dev/kernel/SwapKit/DiskSwap.h
@@ -1,14 +1,14 @@
/* -------------------------------------------
- Copyright (C) 2024-2025 Amlal El Mahrouss Labs, all rights reserved.
+ Copyright (C) 2024-2025 Amlal El Mahrouss , all rights reserved.
------------------------------------------- */
#pragma once
#include <CompilerKit/CompilerKit.h>
-#include <NewKit/Defines.h>
+#include <NeKit/Defines.h>
#include <hint/CompilerHint.h>
#define kSwapBlockMaxSize (mib_cast(16))
diff --git a/dev/kernel/amd64-ci.make b/dev/kernel/amd64-ci.make
index d431342a..c728b29c 100644
--- a/dev/kernel/amd64-ci.make
+++ b/dev/kernel/amd64-ci.make
@@ -35,7 +35,7 @@ LDFLAGS = -e hal_init_platform --subsystem=17 --image-base 0x4000000
LDOBJ = obj/*.obj
# This file is the Kernel, responsible of task, memory, driver, sci, disk and device management.
-KERNEL_IMG = krnl.efi
+KERNEL_IMG = ne_kernel
.PHONY: error
error:
@@ -51,7 +51,7 @@ nekernel-amd64-epm: clean
$(CXX) $(CCFLAGS) $(DISK_DRV) $(DEBUG_MACRO) $(wildcard src/*.cc) $(wildcard src/Gfx/*.cc) $(wildcard HALKit/AMD64/PCI/*.cc) $(wildcard src/Network/*.cc) $(wildcard src/Storage/*.cc) $(wildcard src/FS/*.cc) $(wildcard HALKit/AMD64/Storage/*.cc) $(wildcard HALKit/AMD64/*.cc) $(wildcard src/Swap/*.cc) $(wildcard HALKit/AMD64/*.s)
$(ASM) $(ASMFLAGS) HALKit/AMD64/HalInterruptAPI.asm
$(ASM) $(ASMFLAGS) HALKit/AMD64/HalCommonAPI.asm
- $(ASM) $(ASMFLAGS) HALKit/AMD64/HalBootHeader.asm
+ $(ASM) $(ASMFLAGS) HALKit/AMD64/HalHandoverStub.asm
$(ASM) $(ASMFLAGS) HALKit/AMD64/HalUtilsAPI.asm
$(MOVEALL)
diff --git a/dev/kernel/amd64-desktop.make b/dev/kernel/amd64-desktop.make
index f13bc63a..21488782 100644
--- a/dev/kernel/amd64-desktop.make
+++ b/dev/kernel/amd64-desktop.make
@@ -5,7 +5,7 @@
CXX = x86_64-w64-mingw32-g++
LD = x86_64-w64-mingw32-ld
-CCFLAGS = -fshort-wchar -c -D__NE_AMD64__ -D__NE_VEPM__ -Wall -Wpedantic -Wextra -mno-red-zone -fno-rtti -fno-exceptions -std=c++20 -D__FSKIT_INCLUDES_HEFS__ -D__NE_SUPPORT_NX__ -O0 -I../vendor -D__FSKIT_INCLUDES_NEFS__ -D__NEOSKRNL__ -D__HAVE_NE_APIS__ -D__FREESTANDING__ -D__NE_VIRTUAL_MEMORY_SUPPORT__ -D__NE_AUTO_FORMAT__ -D__NE__ -I./ -I../ -I../boot
+CCFLAGS = -fshort-wchar -c -D__NE_AMD64__ -D__NE_VEPM__ -Wall -Wpedantic -Wextra -mno-red-zone -fno-rtti -fno-exceptions -std=c++20 -D__FSKIT_INCLUDES_HEFS__ -D__NE_SUPPORT_NX__ -O0 -I../vendor -D__NEOSKRNL__ -D__HAVE_NE_APIS__ -D__FREESTANDING__ -D__NE_VIRTUAL_MEMORY_SUPPORT__ -D__NE_AUTO_FORMAT__ -D__NE__ -I./ -I../ -I../boot
ASM = nasm
@@ -37,7 +37,7 @@ LDFLAGS = -e hal_init_platform --subsystem=17 --image-base 0x10000000
LDOBJ = obj/*.obj
# This file is the Kernel, responsible of task, memory, driver, sci, disk and device management.
-KERNEL_IMG = krnl.efi
+KERNEL_IMG = ne_kernel
.PHONY: error
error:
@@ -50,10 +50,10 @@ WINDRES=x86_64-w64-mingw32-windres
.PHONY: nekernel-amd64-epm
nekernel-amd64-epm: clean
$(WINDRES) kernel_rsrc.rsrc -O coff -o kernel_rsrc.obj
- $(CXX) $(CCFLAGS) $(DISK_DRV) $(DEBUG_MACRO) $(wildcard src/*.cc) $(wildcard src/Gfx/*.cc) $(wildcard HALKit/AMD64/PCI/*.cc) $(wildcard src/Network/*.cc) $(wildcard src/Storage/*.cc) $(wildcard src/FS/*.cc) $(wildcard HALKit/AMD64/Storage/*.cc) $(wildcard HALKit/AMD64/*.cc) $(wildcard src/Swap/*.cc) $(wildcard HALKit/AMD64/*.s)
+ $(CXX) $(CCFLAGS) $(DISK_DRV) $(DEBUG_MACRO) $(wildcard src/*.cc) $(wildcard src/Gfx/*.cc) $(wildcard HALKit/AMD64/Network/*.cc) $(wildcard HALKit/AMD64/PCI/*.cc) $(wildcard src/Network/*.cc) $(wildcard src/Storage/*.cc) $(wildcard src/FS/*.cc) $(wildcard HALKit/AMD64/Storage/*.cc) $(wildcard HALKit/AMD64/*.cc) $(wildcard src/Swap/*.cc) $(wildcard HALKit/AMD64/*.s)
$(ASM) $(ASMFLAGS) HALKit/AMD64/HalInterruptAPI.asm
$(ASM) $(ASMFLAGS) HALKit/AMD64/HalCommonAPI.asm
- $(ASM) $(ASMFLAGS) HALKit/AMD64/HalBootHeader.asm
+ $(ASM) $(ASMFLAGS) HALKit/AMD64/HalHandoverStub.asm
$(ASM) $(ASMFLAGS) HALKit/AMD64/HalUtilsAPI.asm
$(MOVEALL)
diff --git a/dev/kernel/arm64-desktop.make b/dev/kernel/arm64-desktop.make
index 31d8f49e..423391af 100644
--- a/dev/kernel/arm64-desktop.make
+++ b/dev/kernel/arm64-desktop.make
@@ -23,7 +23,7 @@ LDFLAGS = -subsystem:efi_application -entry:hal_init_platform /nodefaultlib
LDOBJ = obj/*.obj
# This file is the Kernel, responsible of task management and memory.
-KERNEL = krnl.efi
+KERNEL = ne_kernel
.PHONY: error
error:
diff --git a/dev/kernel/kernel_rsrc.rsrc b/dev/kernel/kernel_rsrc.rsrc
index b7a11036..5b1cb14f 100644
--- a/dev/kernel/kernel_rsrc.rsrc
+++ b/dev/kernel/kernel_rsrc.rsrc
@@ -11,9 +11,9 @@ BEGIN
VALUE "CompanyName", "Amlal El Mahrouss"
VALUE "FileDescription", "NeKernel"
VALUE "FileVersion", KERNEL_VERSION
- VALUE "InternalName", "neoskrnl"
- VALUE "LegalCopyright", "(c) 2024-2025 Amlal El Mahrouss, all rights reserved"
- VALUE "OriginalFilename", "krnl.efi"
+ VALUE "InternalName", "krnl"
+ VALUE "LegalCopyright", "(c) 2024-2025 Amlal El Mahrouss, all rights reserved."
+ VALUE "OriginalFilename", "ne_kernel"
VALUE "ProductName", "NeKernel"
VALUE "ProductVersion", KERNEL_VERSION
END
diff --git a/dev/kernel/src/ACPIFactoryInterface.cc b/dev/kernel/src/ACPIFactoryInterface.cc
index a76caff2..8cc11cad 100644
--- a/dev/kernel/src/ACPIFactoryInterface.cc
+++ b/dev/kernel/src/ACPIFactoryInterface.cc
@@ -5,22 +5,23 @@
------------------------------------------- */
#include <ArchKit/ArchKit.h>
-#include <KernelKit/MemoryMgr.h>
-#include <NewKit/KString.h>
+#include <KernelKit/HeapMgr.h>
+#include <NeKit/KString.h>
#include <modules/ACPI/ACPIFactoryInterface.h>
namespace Kernel {
+constexpr STATIC const auto kMinACPIVer = 1;
+
/// @brief Finds a descriptor table inside ACPI XSDT.
ErrorOr<voidPtr> ACPIFactoryInterface::Find(const Char* signature) {
MUST_PASS(this->fRsdp);
- if (!signature) return ErrorOr<voidPtr>{-1};
-
- if (*signature == 0) return ErrorOr<voidPtr>{-1};
+ if (!signature) return ErrorOr<voidPtr>{-kErrorInvalidData};
+ if (*signature == 0) return ErrorOr<voidPtr>{-kErrorInvalidData};
RSDP* rsp_ptr = reinterpret_cast<RSDP*>(this->fRsdp);
- if (rsp_ptr->Revision <= 1) return ErrorOr<voidPtr>{-1};
+ if (rsp_ptr->Revision < kMinACPIVer) return ErrorOr<voidPtr>{-kErrorInvalidData};
RSDT* xsdt = reinterpret_cast<RSDT*>(rsp_ptr->RsdtAddress);
diff --git a/dev/kernel/src/Array.cc b/dev/kernel/src/Array.cc
index 7cb1b156..36a8e744 100644
--- a/dev/kernel/src/Array.cc
+++ b/dev/kernel/src/Array.cc
@@ -4,4 +4,4 @@
------------------------------------------- */
-#include <NewKit/Array.h>
+#include <NeKit/Array.h>
diff --git a/dev/kernel/src/ArrayList.cc b/dev/kernel/src/ArrayList.cc
index 269dc47e..39291935 100644
--- a/dev/kernel/src/ArrayList.cc
+++ b/dev/kernel/src/ArrayList.cc
@@ -4,4 +4,4 @@
------------------------------------------- */
-#include <NewKit/ArrayList.h>
+#include <NeKit/ArrayList.h>
diff --git a/dev/kernel/src/Atom.cc b/dev/kernel/src/Atom.cc
index 8968a2c2..6e84d7d5 100644
--- a/dev/kernel/src/Atom.cc
+++ b/dev/kernel/src/Atom.cc
@@ -4,7 +4,7 @@
------------------------------------------- */
-#include <NewKit/Atom.h>
+#include <NeKit/Atom.h>
// @file Atom.cpp
// @brief Atomic primitives
diff --git a/dev/kernel/src/BitMapMgr.cc b/dev/kernel/src/BitMapMgr.cc
index 7cbcf376..df678d41 100644
--- a/dev/kernel/src/BitMapMgr.cc
+++ b/dev/kernel/src/BitMapMgr.cc
@@ -11,7 +11,7 @@
#endif
#include <ArchKit/ArchKit.h>
-#include <NewKit/KernelPanic.h>
+#include <NeKit/KernelPanic.h>
#define kBitMapMagic (0x10210U)
@@ -22,6 +22,8 @@
namespace Kernel {
namespace HAL {
namespace Detail {
+ STATIC SizeT kBitMapCursor = 0UL;
+
/***********************************************************************************/
/// \brief Proxy Interface to manage a bitmap allocator.
/***********************************************************************************/
@@ -47,6 +49,8 @@ namespace HAL {
UIntPtr* ptr_bit_set = reinterpret_cast<UIntPtr*>(page_ptr);
+ kBitMapCursor += ptr_bit_set[kBitMapSizeIdx];
+
ptr_bit_set[kBitMapMagIdx] = kBitMapMagic;
ptr_bit_set[kBitMapUsedIdx] = No;
@@ -59,7 +63,6 @@ namespace HAL {
UInt32 flags = kMMFlagsPresent;
if (wr) flags |= kMMFlagsWr;
-
if (user) flags |= kMMFlagsUser;
return flags;
@@ -77,11 +80,18 @@ namespace HAL {
auto FindBitMap(VoidPtr base_ptr, SizeT size, Bool wr, Bool user, SizeT pad) -> VoidPtr {
if (!size) return nullptr;
+ if (kBitMapCursor > kKernelBitMpSize) {
+ err_global_get() = kErrorOutOfBitMapMemory;
+
+ (Void)(kout << "Bitmap limit reached, can't allocate more bitmaps." << kendl);
+ return nullptr;
+ }
+
VoidPtr base = reinterpret_cast<VoidPtr>((UIntPtr) base_ptr);
MUST_PASS(base);
- static SizeT biggest = 0UL;
+ STATIC SizeT biggest = 0UL;
while (YES) {
UIntPtr* ptr_bit_set = reinterpret_cast<UIntPtr*>(base);
@@ -99,6 +109,8 @@ namespace HAL {
if (biggest < (size + pad)) biggest = size + pad;
+ kBitMapCursor += size + pad;
+
return (VoidPtr) ptr_bit_set;
}
} else if (ptr_bit_set[kBitMapMagIdx] != kBitMapMagic) {
@@ -113,6 +125,8 @@ namespace HAL {
if (biggest < (size + pad)) biggest = (size + pad);
+ kBitMapCursor += size + pad;
+
return (VoidPtr) ptr_bit_set;
}
@@ -136,7 +150,6 @@ namespace HAL {
return;
}
-#ifdef __NE_VERBOSE_BITMAP__
(Void)(kout << "Magic: " << hex_number(ptr_bit_set[kBitMapMagIdx]) << kendl);
(Void)(kout << "Is Allocated? " << (ptr_bit_set[kBitMapUsedIdx] ? "YES" : "NO") << kendl);
(Void)(kout << "Size of BitMap (B): " << number(ptr_bit_set[kBitMapSizeIdx]) << kendl);
@@ -149,7 +162,6 @@ namespace HAL {
(Void)(kout << "Size of BitMap (TIB): " << number(TIB(ptr_bit_set[kBitMapSizeIdx]))
<< kendl);
(Void)(kout << "BitMap Address: " << hex_number((UIntPtr) ptr_bit_set) << kendl);
-#endif
}
};
} // namespace Detail
@@ -169,10 +181,16 @@ namespace HAL {
VoidPtr ptr_new = nullptr;
Detail::IBitMapProxy bitmp;
- NE_UNUSED(is_page);
+ if (is_page) return nullptr;
ptr_new = bitmp.FindBitMap(kKernelBitMpStart, size, wr, user, pad);
- return (UIntPtr*) ptr_new;
+
+ if (!ptr_new) {
+ ke_panic(RUNTIME_CHECK_VIRTUAL_OUT_OF_MEM, "Out of memory bitmap");
+ return nullptr;
+ }
+
+ return ptr_new;
}
/***********************************************************************************/
diff --git a/dev/kernel/src/CodeMgr.cc b/dev/kernel/src/CodeMgr.cc
index c4ac011c..6146682a 100644
--- a/dev/kernel/src/CodeMgr.cc
+++ b/dev/kernel/src/CodeMgr.cc
@@ -6,7 +6,7 @@
#include <KernelKit/CodeMgr.h>
#include <KernelKit/ProcessScheduler.h>
-#include <NewKit/Utils.h>
+#include <NeKit/Utils.h>
namespace Kernel {
/***********************************************************************************/
diff --git a/dev/kernel/src/Crc32.cc b/dev/kernel/src/Crc32.cc
index 332faa33..fddcb095 100644
--- a/dev/kernel/src/Crc32.cc
+++ b/dev/kernel/src/Crc32.cc
@@ -4,7 +4,7 @@
------------------------------------------- */
-#include <NewKit/Crc32.h>
+#include <NeKit/Crc32.h>
// @file CRC32.cpp
// @brief Check sequence implementation.
diff --git a/dev/kernel/src/CxxAbi-AMD64.cc b/dev/kernel/src/CxxAbi-AMD64.cc
index 452f23cd..5b0f7c3c 100644
--- a/dev/kernel/src/CxxAbi-AMD64.cc
+++ b/dev/kernel/src/CxxAbi-AMD64.cc
@@ -8,7 +8,8 @@
#include <KernelKit/DebugOutput.h>
#include <KernelKit/KPC.h>
-#include <NewKit/CxxAbi.h>
+#include <KernelKit/UserProcessScheduler.h>
+#include <NeKit/CxxAbi.h>
atexit_func_entry_t __atexit_funcs[kAtExitMacDestructors];
@@ -23,10 +24,7 @@ EXTERN_C Kernel::Void __cxa_pure_virtual(void* self) {
(Kernel::Void)(Kernel::kout << ", has unimplemented virtual functions.\r");
}
-EXTERN_C void ___chkstk_ms(void) {
- (Kernel::Void)(Kernel::kout << "Stack smashing detected!\r");
- dbg_break_point();
-}
+EXTERN_C void ___chkstk_ms(void) {}
EXTERN_C int atexit(void (*f)()) {
if (__atexit_func_count >= kAtExitMacDestructors) return 1;
diff --git a/dev/kernel/src/CxxAbi-ARM64.cc b/dev/kernel/src/CxxAbi-ARM64.cc
index 1605692b..02f3dbcf 100644
--- a/dev/kernel/src/CxxAbi-ARM64.cc
+++ b/dev/kernel/src/CxxAbi-ARM64.cc
@@ -8,7 +8,7 @@
#include <KernelKit/DebugOutput.h>
#include <KernelKit/KPC.h>
-#include <NewKit/CxxAbi.h>
+#include <NeKit/CxxAbi.h>
atexit_func_entry_t __atexit_funcs[kAtExitMacDestructors];
diff --git a/dev/kernel/src/Defines.cc b/dev/kernel/src/Defines.cc
index 7f6e571d..a06b4dd2 100644
--- a/dev/kernel/src/Defines.cc
+++ b/dev/kernel/src/Defines.cc
@@ -4,4 +4,4 @@
------------------------------------------- */
-#include <NewKit/Defines.h>
+#include <NeKit/Defines.h>
diff --git a/dev/kernel/src/DeviceMgr.cc b/dev/kernel/src/DeviceMgr.cc
index c137552e..b12470a9 100644
--- a/dev/kernel/src/DeviceMgr.cc
+++ b/dev/kernel/src/DeviceMgr.cc
@@ -5,3 +5,5 @@
------------------------------------------- */
#include <KernelKit/DeviceMgr.h>
+
+namespace Kernel {} // namespace Kernel
diff --git a/dev/kernel/src/DriveMgr.cc b/dev/kernel/src/DriveMgr.cc
index 449640f9..b7c181c8 100644
--- a/dev/kernel/src/DriveMgr.cc
+++ b/dev/kernel/src/DriveMgr.cc
@@ -8,7 +8,7 @@
#include <FirmwareKit/VEPM.h>
#include <KernelKit/DebugOutput.h>
#include <KernelKit/DriveMgr.h>
-#include <NewKit/Utils.h>
+#include <NeKit/Utils.h>
#include <modules/AHCI/AHCI.h>
#include <modules/ATA/ATA.h>
#include <modules/NVME/NVME.h>
@@ -146,7 +146,7 @@ DriveTrait io_construct_blank_drive() noexcept {
trait.fInit = io_drv_unimplemented;
trait.fProtocol = io_drv_kind;
- kout << "Construct: " << trait.fName << "\r";
+ kout << "DriveMgr: Construct: " << trait.fName << "\r";
return trait;
}
@@ -170,7 +170,7 @@ namespace Detail {
trait.fPacket.fPacketReadOnly = NO;
trait.fKind = kMassStorageDrive | kEPMDrive;
- kout << "Disk is EPM formatted.\r";
+ kout << "DriveMgr: Disk is EPM formatted.\r";
trait.fSectorSz = block_struct.SectorSz;
trait.fLbaEnd = block_struct.LbaEnd;
@@ -191,13 +191,13 @@ namespace Detail {
trait.fPacket.fPacketReadOnly = NO;
trait.fKind = kMassStorageDrive | kGPTDrive;
- kout << "Disk is GPT formatted.\r";
+ kout << "DriveMgr: Disk is GPT formatted.\r";
trait.fSectorSz = gpt_struct.SizeOfEntries;
trait.fLbaEnd = gpt_struct.LastGPTEntry;
trait.fLbaStart = gpt_struct.FirstGPTEntry;
} else {
- kout << "Disk is unformatted.\r";
+ kout << "DriveMgr: Disk is unformatted.\r";
trait.fPacket.fPacketReadOnly = YES;
trait.fKind = kMassStorageDrive | kUnformattedDrive | kReadOnlyDrive;
@@ -233,7 +233,7 @@ DriveTrait io_construct_main_drive() noexcept {
trait.fInit = io_drv_init;
trait.fProtocol = io_drv_kind;
- kout << "Detecting partition scheme of: " << trait.fName << ".\r";
+ kout << "DriveMgr: Detecting partition scheme of: " << trait.fName << ".\r";
Detail::io_detect_drive(trait);
diff --git a/dev/kernel/src/ErrorOr.cc b/dev/kernel/src/ErrorOr.cc
index 69668b2f..a872164c 100644
--- a/dev/kernel/src/ErrorOr.cc
+++ b/dev/kernel/src/ErrorOr.cc
@@ -4,7 +4,7 @@
------------------------------------------- */
-#include <NewKit/ErrorOr.h>
+#include <NeKit/ErrorOr.h>
/***********************************************************************************/
/// @file ErrorOr.cc ///
diff --git a/dev/kernel/src/FS/Ext2+FileMgr.cc b/dev/kernel/src/FS/Ext2+FileMgr.cc
index a55d917a..810e7e44 100644
--- a/dev/kernel/src/FS/Ext2+FileMgr.cc
+++ b/dev/kernel/src/FS/Ext2+FileMgr.cc
@@ -8,7 +8,7 @@
#ifdef __FSKIT_INCLUDES_EXT2__
#include <KernelKit/FileMgr.h>
-#include <KernelKit/MemoryMgr.h>
+#include <KernelKit/HeapMgr.h>
#endif // ifdef __FSKIT_INCLUDES_EXT2__
#endif // ifndef __NE_MINIMAL_OS__
diff --git a/dev/kernel/src/FS/Ext2+FileSystemParser.cc b/dev/kernel/src/FS/Ext2+FileSystemParser.cc
index b6d04f46..80449ed9 100644
--- a/dev/kernel/src/FS/Ext2+FileSystemParser.cc
+++ b/dev/kernel/src/FS/Ext2+FileSystemParser.cc
@@ -10,11 +10,11 @@
#include <FirmwareKit/EPM.h>
#include <KernelKit/KPC.h>
#include <KernelKit/ProcessScheduler.h>
-#include <KernelKit/User.h>
-#include <NewKit/Crc32.h>
-#include <NewKit/KString.h>
-#include <NewKit/KernelPanic.h>
-#include <NewKit/Utils.h>
+#include <KernelKit/UserMgr.h>
+#include <NeKit/Crc32.h>
+#include <NeKit/KString.h>
+#include <NeKit/KernelPanic.h>
+#include <NeKit/Utils.h>
#include <modules/AHCI/AHCI.h>
#include <modules/ATA/ATA.h>
diff --git a/dev/kernel/src/FS/HeFS+FileMgr.cc b/dev/kernel/src/FS/HeFS+FileMgr.cc
index e0b92a8d..e4985a3b 100644
--- a/dev/kernel/src/FS/HeFS+FileMgr.cc
+++ b/dev/kernel/src/FS/HeFS+FileMgr.cc
@@ -8,7 +8,7 @@
#ifdef __FSKIT_INCLUDES_HEFS__
#include <KernelKit/FileMgr.h>
-#include <KernelKit/MemoryMgr.h>
+#include <KernelKit/HeapMgr.h>
#endif // ifdef __FSKIT_INCLUDES_HEFS__
#endif // ifndef __NE_MINIMAL_OS__
diff --git a/dev/kernel/src/FS/HeFS+FileSystemParser.cc b/dev/kernel/src/FS/HeFS+FileSystemParser.cc
index a285593e..893f43ef 100644
--- a/dev/kernel/src/FS/HeFS+FileSystemParser.cc
+++ b/dev/kernel/src/FS/HeFS+FileSystemParser.cc
@@ -11,11 +11,11 @@
#include <FirmwareKit/GPT.h>
#include <KernelKit/KPC.h>
#include <KernelKit/ProcessScheduler.h>
-#include <KernelKit/User.h>
-#include <NewKit/Crc32.h>
-#include <NewKit/KString.h>
-#include <NewKit/KernelPanic.h>
-#include <NewKit/Utils.h>
+#include <KernelKit/UserMgr.h>
+#include <NeKit/Crc32.h>
+#include <NeKit/KString.h>
+#include <NeKit/KernelPanic.h>
+#include <NeKit/Utils.h>
#include <modules/AHCI/AHCI.h>
#include <modules/ATA/ATA.h>
@@ -36,14 +36,14 @@ namespace Detail {
/***********************************************************************************/
/// @brief Get the index node of a file or directory.
- /// @param root The root node of the filesystem.
+ /// @param boot The boot node of the filesystem.
/// @param mnt The mnt to read from.
/// @param dir_name The name of the directory.
/// @param file_name The name of the file.
/// @param kind The kind of the file (regular, directory, block, character, FIFO, socket, symbolic
/// link, unknown).
/***********************************************************************************/
- STATIC ATTRIBUTE(unused) _Output HEFS_INDEX_NODE* hefsi_fetch_in(HEFS_BOOT_NODE* root,
+ STATIC ATTRIBUTE(unused) _Output HEFS_INDEX_NODE* hefsi_fetch_in(HEFS_BOOT_NODE* boot,
DriveTrait* mnt,
const Utf8Char* dir_name,
const Utf8Char* file_name,
@@ -51,31 +51,31 @@ namespace Detail {
/***********************************************************************************/
/// @brief Allocate a new index node->
- /// @param root The root node of the filesystem.
+ /// @param boot The boot node of the filesystem.
/// @param mnt The mnt to read/write from.
/// @param dir_name The name of the parent directory.
/// @return Status, see err_global_get().
/***********************************************************************************/
STATIC ATTRIBUTE(unused) _Output BOOL
- hefsi_update_in_status(HEFS_BOOT_NODE* root, DriveTrait* mnt, const Utf8Char* dir_name,
+ hefsi_update_in_status(HEFS_BOOT_NODE* boot, DriveTrait* mnt, const Utf8Char* dir_name,
HEFS_INDEX_NODE* node, const BOOL create_or_delete);
/***********************************************************************************/
/// @brief Balance RB-Tree of the filesystem.
- /// @param root The root node of the filesystem.
+ /// @param boot The boot node of the filesystem.
/// @param mnt The mnt to read/write from.
/// @return Status, see err_global_get().
/***********************************************************************************/
- STATIC ATTRIBUTE(unused) _Output BOOL hefsi_balance_ind(HEFS_BOOT_NODE* root, DriveTrait* mnt);
+ STATIC ATTRIBUTE(unused) _Output BOOL hefsi_balance_ind(HEFS_BOOT_NODE* boot, DriveTrait* mnt);
/// @brief Alllocate IND from boot node.
- /// @param root The root node of the filesystem.
+ /// @param boot The boot node of the filesystem.
/// @param mnt The mnt to read from.
/// @param dir_name The name of the directory.
/// @param dir_name The parent of the directory.
/// @param flags Directory flags.
/// @param delete_or_create Delete or create directory.
- STATIC _Output BOOL hefsi_update_ind_status(HEFS_BOOT_NODE* root, DriveTrait* mnt,
+ STATIC _Output BOOL hefsi_update_ind_status(HEFS_BOOT_NODE* boot, DriveTrait* mnt,
const Utf8Char* dir_name, UInt16 flags,
const BOOL delete_or_create);
@@ -251,24 +251,24 @@ namespace Detail {
}
/// @brief Alllocate IND from boot node.
- /// @param root The root node of the filesystem.
+ /// @param boot The boot node of the filesystem.
/// @param mnt The mnt to read from.
/// @param dir_name The name of the directory.
/// @param dir_name The parent of the directory.
/// @param flags Directory flags.
/// @param delete_or_create Delete or create directory.
- STATIC _Output BOOL hefsi_update_ind_status(HEFS_BOOT_NODE* root, DriveTrait* mnt,
+ STATIC _Output BOOL hefsi_update_ind_status(HEFS_BOOT_NODE* boot, DriveTrait* mnt,
const Utf8Char* dir_name, UInt16 flags,
const BOOL delete_or_create) {
if (mnt) {
HEFS_INDEX_NODE_DIRECTORY* tmpdir =
- (HEFS_INDEX_NODE_DIRECTORY*) mm_new_heap(sizeof(HEFS_INDEX_NODE_DIRECTORY), Yes, No);
+ (HEFS_INDEX_NODE_DIRECTORY*) mm_alloc_ptr(sizeof(HEFS_INDEX_NODE_DIRECTORY), Yes, No);
- auto start = root->fStartIND;
+ auto start = boot->fStartIND;
auto prev_location = start;
auto parent_location = 0UL;
- MUST_PASS(root->fStartIND > mnt->fLbaStart);
+ MUST_PASS(boot->fStartIND > mnt->fLbaStart);
while (YES) {
auto prev_start = start;
@@ -294,7 +294,7 @@ namespace Detail {
if (expr) {
HEFS_INDEX_NODE_DIRECTORY* dirent =
- (HEFS_INDEX_NODE_DIRECTORY*) mm_new_heap(sizeof(HEFS_INDEX_NODE_DIRECTORY), Yes, No);
+ (HEFS_INDEX_NODE_DIRECTORY*) mm_alloc_ptr(sizeof(HEFS_INDEX_NODE_DIRECTORY), Yes, No);
rt_set_memory(dirent, 0, sizeof(HEFS_INDEX_NODE_DIRECTORY));
@@ -323,7 +323,7 @@ namespace Detail {
if (tmpend->fChecksum !=
ke_calculate_crc32((Char*) tmpend, sizeof(HEFS_INDEX_NODE_DIRECTORY)))
- ke_panic(RUNTIME_CHECK_FILESYSTEM, "Bad CRC32");
+ ke_panic(RUNTIME_CHECK_FILESYSTEM, "Bad CRC32 value, aborting.");
if (delete_or_create)
--tmpend->fEntryCount;
@@ -349,7 +349,7 @@ namespace Detail {
break;
}
- hefsi_traverse_tree(tmpend, mnt, root->fStartIND, child_first);
+ hefsi_traverse_tree(tmpend, mnt, boot->fStartIND, child_first);
}
}
@@ -364,11 +364,11 @@ namespace Detail {
}
if (dirent->fPrev == 0) {
- dirent->fPrev = root->fStartIND;
+ dirent->fPrev = boot->fStartIND;
}
if (dirent->fParent == 0) {
- dirent->fParent = root->fStartIND;
+ dirent->fParent = boot->fStartIND;
}
if (tmpdir->fChild == 0) {
@@ -389,13 +389,13 @@ namespace Detail {
}
child += sizeof(HEFS_INDEX_NODE_DIRECTORY);
- if (child > root->fEndIND) break;
+ if (child > boot->fEndIND) break;
}
dirent->fColor = kHeFSRed;
dirent->fChild = child;
- if (child > root->fEndIND) dirent->fChild = root->fStartIND;
+ if (child > boot->fEndIND) dirent->fChild = boot->fStartIND;
}
for (SizeT index = 0UL; index < kHeFSSliceCount; ++index) {
@@ -412,19 +412,19 @@ namespace Detail {
err_global_get() = kErrorSuccess;
- mm_delete_heap(dirent);
- mm_delete_heap(tmpdir);
+ mm_free_ptr(dirent);
+ mm_free_ptr(tmpdir);
if (!delete_or_create)
- ++root->fINDCount;
+ ++boot->fINDCount;
else
- --root->fINDCount;
+ --boot->fINDCount;
- root->fChecksum = ke_calculate_crc32((Char*) root, sizeof(HEFS_BOOT_NODE));
+ boot->fChecksum = ke_calculate_crc32((Char*) boot, sizeof(HEFS_BOOT_NODE));
mnt->fPacket.fPacketLba = mnt->fLbaStart;
mnt->fPacket.fPacketSize = sizeof(HEFS_BOOT_NODE);
- mnt->fPacket.fPacketContent = root;
+ mnt->fPacket.fPacketContent = boot;
mnt->fOutput(mnt->fPacket);
@@ -433,12 +433,12 @@ namespace Detail {
prev_location = start;
- hefsi_traverse_tree(tmpdir, mnt, root->fStartIND, start);
- if (start > root->fEndIND || start == 0) break;
+ hefsi_traverse_tree(tmpdir, mnt, boot->fStartIND, start);
+ if (start > boot->fEndIND || start == 0) break;
}
err_global_get() = kErrorDisk;
- mm_delete_heap(tmpdir);
+ mm_free_ptr(tmpdir);
return NO;
}
@@ -448,26 +448,26 @@ namespace Detail {
}
/// @brief Get the index node of a file or directory.
- /// @param root The root node of the filesystem.
+ /// @param boot The boot node of the filesystem.
/// @param mnt The mnt to read from.
/// @param dir_name The name of the directory.
/// @param file_name The name of the file.
/// @param kind The kind of the file (regular, directory, block, character, FIFO, socket, symbolic
/// link, unknown).
- STATIC ATTRIBUTE(unused) _Output HEFS_INDEX_NODE* hefsi_fetch_in(HEFS_BOOT_NODE* root,
+ STATIC ATTRIBUTE(unused) _Output HEFS_INDEX_NODE* hefsi_fetch_in(HEFS_BOOT_NODE* boot,
DriveTrait* mnt,
const Utf8Char* dir_name,
const Utf8Char* file_name,
UInt8 kind) {
if (mnt) {
- if (root->fStartIND > root->fEndIND) return nullptr;
- if (root->fStartIN > root->fEndIN) return nullptr;
+ if (boot->fStartIND > boot->fEndIND) return nullptr;
+ if (boot->fStartIN > boot->fEndIN) return nullptr;
- auto start = root->fStartIND;
+ auto start = boot->fStartIND;
HEFS_INDEX_NODE* node = new HEFS_INDEX_NODE();
HEFS_INDEX_NODE_DIRECTORY* dir =
- (HEFS_INDEX_NODE_DIRECTORY*) mm_new_heap(sizeof(HEFS_INDEX_NODE_DIRECTORY), Yes, No);
+ (HEFS_INDEX_NODE_DIRECTORY*) mm_alloc_ptr(sizeof(HEFS_INDEX_NODE_DIRECTORY), Yes, No);
while (YES) {
if (err_global_get() == kErrorDiskIsCorrupted) {
@@ -511,8 +511,8 @@ namespace Detail {
}
}
- hefsi_traverse_tree(dir, mnt, root->fStartIND, start);
- if (start == root->fStartIND || start == root->fStartIND) break;
+ hefsi_traverse_tree(dir, mnt, boot->fStartIND, start);
+ if (start == boot->fStartIND || start == boot->fStartIND) break;
}
delete node;
@@ -530,20 +530,20 @@ namespace Detail {
}
STATIC ATTRIBUTE(unused) _Output BOOL
- hefsi_update_in_status(HEFS_BOOT_NODE* root, DriveTrait* mnt, const Utf8Char* dir_name,
+ hefsi_update_in_status(HEFS_BOOT_NODE* boot, DriveTrait* mnt, const Utf8Char* dir_name,
HEFS_INDEX_NODE* node, BOOL delete_or_create) {
- if (!root || !mnt) return NO;
+ if (!boot || !mnt) return NO;
- auto start = root->fStartIND;
+ auto start = boot->fStartIND;
- if (start > root->fEndIND) return NO;
- if (root->fStartIN > root->fEndIN) return NO;
+ if (start > boot->fEndIND) return NO;
+ if (boot->fStartIN > boot->fEndIN) return NO;
;
- if (root->fStartBlock > root->fEndBlock) return NO;
+ if (boot->fStartBlock > boot->fEndBlock) return NO;
if (mnt) {
HEFS_INDEX_NODE_DIRECTORY* dir =
- (HEFS_INDEX_NODE_DIRECTORY*) mm_new_heap(sizeof(HEFS_INDEX_NODE_DIRECTORY), Yes, No);
+ (HEFS_INDEX_NODE_DIRECTORY*) mm_alloc_ptr(sizeof(HEFS_INDEX_NODE_DIRECTORY), Yes, No);
auto hash_file = node->fHashPath;
@@ -560,7 +560,7 @@ namespace Detail {
if (hefsi_hash_64(dir_name) == dir->fHashPath) {
for (SizeT inode_index = 0UL; inode_index < kHeFSSliceCount; ++inode_index) {
if (dir->fINSlices[inode_index] == 0 && !delete_or_create) {
- dir->fINSlices[inode_index] = root->fStartIN;
+ dir->fINSlices[inode_index] = boot->fStartIN;
++dir->fEntryCount;
@@ -574,8 +574,8 @@ namespace Detail {
auto lba = dir->fINSlices[inode_index];
- node->fOffsetSliceLow = (UInt32) (root->fStartBlock);
- node->fOffsetSliceHigh = (UInt32) (root->fStartBlock >> 32);
+ node->fOffsetSliceLow = (UInt32) (boot->fStartBlock);
+ node->fOffsetSliceHigh = (UInt32) (boot->fStartBlock >> 32);
node->fChecksum = ke_calculate_crc32((Char*) node, sizeof(HEFS_INDEX_NODE));
@@ -585,18 +585,18 @@ namespace Detail {
mnt->fOutput(mnt->fPacket);
- root->fStartIN += sizeof(HEFS_INDEX_NODE);
- root->fStartBlock += kHeFSBlockLen;
+ boot->fStartIN += sizeof(HEFS_INDEX_NODE);
+ boot->fStartBlock += kHeFSBlockLen;
- root->fChecksum = ke_calculate_crc32((Char*) root, sizeof(HEFS_BOOT_NODE));
+ boot->fChecksum = ke_calculate_crc32((Char*) boot, sizeof(HEFS_BOOT_NODE));
mnt->fPacket.fPacketLba = mnt->fLbaStart;
mnt->fPacket.fPacketSize = sizeof(HEFS_BOOT_NODE);
- mnt->fPacket.fPacketContent = root;
+ mnt->fPacket.fPacketContent = boot;
mnt->fOutput(mnt->fPacket);
- mm_delete_heap(dir);
+ mm_free_ptr(dir);
return YES;
} else if (dir->fINSlices[inode_index] != 0 && delete_or_create) {
@@ -617,14 +617,14 @@ namespace Detail {
node->fOffsetSliceLow = 0;
node->fOffsetSliceHigh = 0;
- root->fStartIN -= sizeof(HEFS_INDEX_NODE);
- root->fStartBlock -= kHeFSBlockLen;
+ boot->fStartIN -= sizeof(HEFS_INDEX_NODE);
+ boot->fStartBlock -= kHeFSBlockLen;
- root->fChecksum = ke_calculate_crc32((Char*) root, sizeof(HEFS_BOOT_NODE));
+ boot->fChecksum = ke_calculate_crc32((Char*) boot, sizeof(HEFS_BOOT_NODE));
mnt->fPacket.fPacketLba = mnt->fLbaStart;
mnt->fPacket.fPacketSize = sizeof(HEFS_BOOT_NODE);
- mnt->fPacket.fPacketContent = root;
+ mnt->fPacket.fPacketContent = boot;
mnt->fOutput(mnt->fPacket);
@@ -646,18 +646,18 @@ namespace Detail {
mnt->fOutput(mnt->fPacket);
- mm_delete_heap(dir);
+ mm_free_ptr(dir);
return YES;
}
}
}
- hefsi_traverse_tree(dir, mnt, root->fStartIND, start);
- if (start > root->fEndIND || start == 0) break;
+ hefsi_traverse_tree(dir, mnt, boot->fStartIND, start);
+ if (start > boot->fEndIND || start == 0) break;
}
- mm_delete_heap(dir);
+ mm_free_ptr(dir);
err_global_get() = kErrorFileNotFound;
return NO;
}
@@ -667,18 +667,18 @@ namespace Detail {
}
/// @brief Balance RB-Tree of the filesystem.
- /// @param root The root node of the filesystem.
+ /// @param boot The boot node of the filesystem.
/// @param mnt The mnt to read/write from.
/// @return Status, see err_global_get().
- STATIC ATTRIBUTE(unused) _Output BOOL hefsi_balance_ind(HEFS_BOOT_NODE* root, DriveTrait* mnt) {
+ STATIC ATTRIBUTE(unused) _Output BOOL hefsi_balance_ind(HEFS_BOOT_NODE* boot, DriveTrait* mnt) {
if (mnt) {
HEFS_INDEX_NODE_DIRECTORY* dir =
(HEFS_INDEX_NODE_DIRECTORY*) RTL_ALLOCA(sizeof(HEFS_INDEX_NODE_DIRECTORY));
- auto start = root->fStartIND;
+ auto start = boot->fStartIND;
while (YES) {
- if (start == 0UL || start > root->fEndIND) break;
+ if (start == 0UL || start > boot->fEndIND) break;
mnt->fPacket.fPacketLba = start;
mnt->fPacket.fPacketSize = sizeof(HEFS_INDEX_NODE_DIRECTORY);
@@ -692,7 +692,7 @@ namespace Detail {
return NO;
}
- if (start == root->fStartIND) {
+ if (start == boot->fStartIND) {
dir->fColor = kHeFSBlack;
mnt->fPacket.fPacketLba = start;
@@ -725,7 +725,7 @@ namespace Detail {
mnt->fOutput(mnt->fPacket);
}
- hefsi_traverse_tree(dir, mnt, root->fStartIND, start);
+ hefsi_traverse_tree(dir, mnt, boot->fStartIND, start);
}
err_global_get() = kErrorSuccess;
@@ -742,7 +742,7 @@ namespace Detail {
/// real-time.
/// @note This is certainly take longer to format a disk with it, but worth-it in the long run.
-namespace Kernel::HeFS {
+namespace Kernel {
/// @brief Make a EPM+HeFS mnt out of the disk.
/// @param mnt The mnt to write on.
/// @return If it was sucessful, see err_local_get().
@@ -758,16 +758,15 @@ _Output Bool HeFileSystemParser::Format(_Input _Output DriveTrait* mnt, _Input c
}
if (drv_std_get_size() < kHeFSMinimumDiskSize) {
- kout << "HeFS requires at least 128 GiB." << kendl;
- err_global_get() = kErrorDisk;
- return NO;
+ (Void)(kout << "HeFS recommends at least 128 GiB of free space." << kendl);
+ (Void)(kout << "The OS will still try to format a HeFS disk here." << kendl);
}
- HEFS_BOOT_NODE* root = (HEFS_BOOT_NODE*) RTL_ALLOCA(sizeof(HEFS_BOOT_NODE));
+ HEFS_BOOT_NODE* boot = (HEFS_BOOT_NODE*) RTL_ALLOCA(sizeof(HEFS_BOOT_NODE));
mnt->fPacket.fPacketLba = mnt->fLbaStart;
mnt->fPacket.fPacketSize = sizeof(HEFS_BOOT_NODE);
- mnt->fPacket.fPacketContent = root;
+ mnt->fPacket.fPacketContent = boot;
mnt->fInput(mnt->fPacket);
@@ -779,9 +778,9 @@ _Output Bool HeFileSystemParser::Format(_Input _Output DriveTrait* mnt, _Input c
// Check if the disk is already formatted.
- if (KStringBuilder::Equals(root->fMagic, kHeFSMagic) && root->fVersion == kHeFSVersion) {
- if (ke_calculate_crc32((Char*) root, sizeof(HEFS_BOOT_NODE)) != root->fChecksum &&
- root->fChecksum > 0) {
+ if (KStringBuilder::Equals(boot->fMagic, kHeFSMagic) && boot->fVersion == kHeFSVersion) {
+ if (ke_calculate_crc32((Char*) boot, sizeof(HEFS_BOOT_NODE)) != boot->fChecksum &&
+ boot->fChecksum > 0) {
err_global_get() = kErrorDiskIsCorrupted;
return NO;
}
@@ -790,8 +789,8 @@ _Output Bool HeFileSystemParser::Format(_Input _Output DriveTrait* mnt, _Input c
return YES;
}
- if (ke_calculate_crc32((Char*) root, sizeof(HEFS_BOOT_NODE)) != root->fChecksum &&
- root->fChecksum > 0) {
+ if (ke_calculate_crc32((Char*) boot, sizeof(HEFS_BOOT_NODE)) != boot->fChecksum &&
+ boot->fChecksum > 0) {
err_global_get() = kErrorDiskIsCorrupted;
return NO;
}
@@ -799,8 +798,8 @@ _Output Bool HeFileSystemParser::Format(_Input _Output DriveTrait* mnt, _Input c
rt_copy_memory((VoidPtr) "fs/hefs-packet", mnt->fPacket.fPacketMime,
rt_string_len("fs/hefs-packet"));
- urt_copy_memory((VoidPtr) vol_name, root->fVolName, urt_string_len(vol_name) + 1);
- rt_copy_memory((VoidPtr) kHeFSMagic, root->fMagic, kHeFSMagicLen - 1);
+ urt_copy_memory((VoidPtr) vol_name, boot->fVolName, urt_string_len(vol_name) + 1);
+ rt_copy_memory((VoidPtr) kHeFSMagic, boot->fMagic, kHeFSMagicLen - 1);
if (mnt->fLbaStart > mnt->fLbaEnd) {
err_global_get() = kErrorDiskIsCorrupted;
@@ -808,66 +807,66 @@ _Output Bool HeFileSystemParser::Format(_Input _Output DriveTrait* mnt, _Input c
return NO;
}
- root->fBadSectors = 0;
+ boot->fBadSectors = 0;
- root->fSectorCount = drv_std_get_sector_count();
- root->fSectorSize = mnt->fSectorSz;
+ boot->fSectorCount = drv_std_get_sector_count();
+ boot->fSectorSize = mnt->fSectorSz;
- MUST_PASS(root->fSectorSize);
+ MUST_PASS(boot->fSectorSize);
/// @note all HeFS strucutres are equal to 512, so here it's fine, unless fSectoSize is 2048.
- const SizeT max_lba = (drv_std_get_size()) / root->fSectorSize;
+ const SizeT max_lba = (drv_std_get_size()) / boot->fSectorSize;
const SizeT dir_max = max_lba / 300; // 5% for directory inodes
const SizeT inode_max = max_lba / 400; // 5% for inodes
- root->fStartIND = mnt->fLbaStart + kHeFSINDStartOffset;
- root->fEndIND = root->fStartIND + dir_max;
+ boot->fStartIND = mnt->fLbaStart + kHeFSINDStartOffset;
+ boot->fEndIND = boot->fStartIND + dir_max;
- root->fStartIN = root->fEndIND;
- root->fEndIN = root->fStartIN + inode_max;
+ boot->fStartIN = boot->fEndIND;
+ boot->fEndIN = boot->fStartIN + inode_max;
- root->fStartBlock = root->fEndIN;
- root->fEndBlock = drv_std_get_size();
+ boot->fStartBlock = boot->fEndIN;
+ boot->fEndBlock = drv_std_get_size();
- root->fINDCount = 0;
+ boot->fINDCount = 0;
- root->fDiskSize = drv_std_get_size();
- root->fDiskStatus = kHeFSStatusUnlocked;
+ boot->fDiskSize = drv_std_get_size();
+ boot->fDiskStatus = kHeFSStatusUnlocked;
- root->fDiskFlags = flags;
+ boot->fDiskFlags = flags;
if (mnt->fKind & kMassStorageDrive) {
- root->fDiskKind = kHeFSMassStorageDevice;
+ boot->fDiskKind = kHeFSMassStorageDevice;
} else if (mnt->fKind & kHeFSOpticalDrive) {
- root->fDiskKind = kHeFSOpticalDrive;
+ boot->fDiskKind = kHeFSOpticalDrive;
} else {
- root->fDiskKind = kHeFSUnknown;
+ boot->fDiskKind = kHeFSUnknown;
}
- root->fVersion = kHeFSVersion;
+ boot->fVersion = kHeFSVersion;
- root->fVID = kHeFSInvalidVID;
+ boot->fVID = kHeFSInvalidVID;
- root->fChecksum = ke_calculate_crc32((Char*) root, sizeof(HEFS_BOOT_NODE));
+ boot->fChecksum = ke_calculate_crc32((Char*) boot, sizeof(HEFS_BOOT_NODE));
mnt->fPacket.fPacketLba = mnt->fLbaStart;
mnt->fPacket.fPacketSize = sizeof(HEFS_BOOT_NODE);
- mnt->fPacket.fPacketContent = root;
+ mnt->fPacket.fPacketContent = boot;
mnt->fOutput(mnt->fPacket);
(Void)(kout << "Protocol: " << mnt->fProtocol() << kendl);
- (Void)(kout8 << u8"Volume Name: " << root->fVolName << kendl8);
- (Void)(kout << "Start IND: " << hex_number(root->fStartIND) << kendl);
- (Void)(kout << "End IND: " << hex_number(root->fEndIND) << kendl);
- (Void)(kout << "Start IN: " << hex_number(root->fStartIN) << kendl);
- (Void)(kout << "End IN: " << hex_number(root->fEndIN) << kendl);
- (Void)(kout << "Start Block: " << hex_number(root->fStartBlock) << kendl);
- (Void)(kout << "End Block: " << hex_number(root->fEndBlock) << kendl);
- (Void)(kout << "Number of IND: " << hex_number(root->fINDCount) << kendl);
- (Void)(kout << "Sector Size: " << hex_number(root->fSectorSize) << kendl);
- (Void)(kout << "Drive Kind: " << Detail::hefs_drive_kind_to_string(root->fDiskKind) << kendl);
+ (Void)(kout8 << u8"Volume Name: " << boot->fVolName << kendl8);
+ (Void)(kout << "Start IND: " << hex_number(boot->fStartIND) << kendl);
+ (Void)(kout << "End IND: " << hex_number(boot->fEndIND) << kendl);
+ (Void)(kout << "Start IN: " << hex_number(boot->fStartIN) << kendl);
+ (Void)(kout << "End IN: " << hex_number(boot->fEndIN) << kendl);
+ (Void)(kout << "Start Block: " << hex_number(boot->fStartBlock) << kendl);
+ (Void)(kout << "End Block: " << hex_number(boot->fEndBlock) << kendl);
+ (Void)(kout << "Number of IND: " << hex_number(boot->fINDCount) << kendl);
+ (Void)(kout << "Sector Size: " << hex_number(boot->fSectorSize) << kendl);
+ (Void)(kout << "Drive Kind: " << Detail::hefs_drive_kind_to_string(boot->fDiskKind) << kendl);
if (!mnt->fPacket.fPacketGood) {
err_global_get() = kErrorDiskIsCorrupted;
@@ -902,23 +901,23 @@ _Output Bool HeFileSystemParser::INodeDirectoryCtlManip(_Input DriveTrait* mnt,
return NO;
}
- HEFS_BOOT_NODE* root = (HEFS_BOOT_NODE*) mm_new_heap(sizeof(HEFS_BOOT_NODE), Yes, No);
+ HEFS_BOOT_NODE* boot = (HEFS_BOOT_NODE*) mm_alloc_ptr(sizeof(HEFS_BOOT_NODE), Yes, No);
rt_copy_memory((VoidPtr) "fs/hefs-packet", mnt->fPacket.fPacketMime,
rt_string_len("fs/hefs-packet"));
mnt->fPacket.fPacketLba = mnt->fLbaStart;
mnt->fPacket.fPacketSize = sizeof(HEFS_BOOT_NODE);
- mnt->fPacket.fPacketContent = root;
+ mnt->fPacket.fPacketContent = boot;
mnt->fInput(mnt->fPacket);
- if (!KStringBuilder::Equals(root->fMagic, kHeFSMagic) || root->fVersion != kHeFSVersion) {
+ if (!KStringBuilder::Equals(boot->fMagic, kHeFSMagic) || boot->fVersion != kHeFSVersion) {
err_global_get() = kErrorDisk;
return YES;
}
- if (!KStringBuilder::Equals(root->fMagic, kHeFSMagic) || root->fVersion != kHeFSVersion) {
+ if (!KStringBuilder::Equals(boot->fMagic, kHeFSMagic) || boot->fVersion != kHeFSVersion) {
err_global_get() = kErrorDiskIsCorrupted;
kout << "Invalid Boot Node, this can't continue!\r";
@@ -934,15 +933,15 @@ _Output Bool HeFileSystemParser::INodeDirectoryCtlManip(_Input DriveTrait* mnt,
return NO;
}
- if (Detail::hefsi_update_ind_status(root, mnt, dir, flags, delete_or_create)) {
+ if (Detail::hefsi_update_ind_status(boot, mnt, dir, flags, delete_or_create)) {
// todo: make it smarter for high-throughput.
- Detail::hefsi_balance_ind(root, mnt);
+ Detail::hefsi_balance_ind(boot, mnt);
- mm_delete_heap((VoidPtr) root);
+ mm_free_ptr((VoidPtr) boot);
return YES;
}
- mm_delete_heap((VoidPtr) root);
+ mm_free_ptr((VoidPtr) boot);
return NO;
}
@@ -983,9 +982,9 @@ _Output Bool HeFileSystemParser::INodeManip(_Input DriveTrait* mnt, VoidPtr bloc
return NO;
}
- HEFS_BOOT_NODE* root = (HEFS_BOOT_NODE*) mm_new_heap(sizeof(HEFS_BOOT_NODE), Yes, No);
+ HEFS_BOOT_NODE* boot = (HEFS_BOOT_NODE*) mm_alloc_ptr(sizeof(HEFS_BOOT_NODE), Yes, No);
- if (!root) {
+ if (!boot) {
err_global_get() = kErrorInvalidData;
return NO;
}
@@ -995,18 +994,18 @@ _Output Bool HeFileSystemParser::INodeManip(_Input DriveTrait* mnt, VoidPtr bloc
mnt->fPacket.fPacketLba = mnt->fLbaStart;
mnt->fPacket.fPacketSize = sizeof(HEFS_BOOT_NODE);
- mnt->fPacket.fPacketContent = root;
+ mnt->fPacket.fPacketContent = boot;
mnt->fInput(mnt->fPacket);
- if (!KStringBuilder::Equals(root->fMagic, kHeFSMagic) || root->fVersion != kHeFSVersion) {
+ if (!KStringBuilder::Equals(boot->fMagic, kHeFSMagic) || boot->fVersion != kHeFSVersion) {
(Void)(kout << "Invalid Boot Node, HeFS partition is invalid." << kendl);
- mm_delete_heap((VoidPtr) root);
+ mm_free_ptr((VoidPtr) boot);
err_global_get() = kErrorDisk;
return NO;
}
- auto start = Detail::hefsi_fetch_in(root, mnt, dir, name, kind);
+ auto start = Detail::hefsi_fetch_in(boot, mnt, dir, name, kind);
if (start) {
(Void)(kout << hex_number(start->fHashPath) << kendl);
@@ -1021,7 +1020,7 @@ _Output Bool HeFileSystemParser::INodeManip(_Input DriveTrait* mnt, VoidPtr bloc
mnt->fInput(mnt->fPacket);
} else {
if (start->fFlags & kHeFSFlagsReadOnly) {
- mm_delete_heap((VoidPtr) root);
+ mm_free_ptr((VoidPtr) boot);
delete start;
kout << "Error: File is read-only\r";
@@ -1034,7 +1033,7 @@ _Output Bool HeFileSystemParser::INodeManip(_Input DriveTrait* mnt, VoidPtr bloc
}
}
- mm_delete_heap((VoidPtr) root);
+ mm_free_ptr((VoidPtr) boot);
delete start;
return YES;
}
@@ -1058,7 +1057,7 @@ _Output Bool HeFileSystemParser::INodeCtlManip(_Input DriveTrait* mnt, _Input co
return NO;
}
- HEFS_INDEX_NODE* node = (HEFS_INDEX_NODE*) mm_new_heap(sizeof(HEFS_INDEX_NODE), Yes, No);
+ HEFS_INDEX_NODE* node = (HEFS_INDEX_NODE*) mm_alloc_ptr(sizeof(HEFS_INDEX_NODE), Yes, No);
if (!node) {
err_global_get() = kErrorInvalidData;
@@ -1067,10 +1066,10 @@ _Output Bool HeFileSystemParser::INodeCtlManip(_Input DriveTrait* mnt, _Input co
rt_set_memory(node, 0, sizeof(HEFS_INDEX_NODE));
- HEFS_BOOT_NODE* root = (HEFS_BOOT_NODE*) RTL_ALLOCA(sizeof(HEFS_BOOT_NODE));
+ HEFS_BOOT_NODE* boot = (HEFS_BOOT_NODE*) RTL_ALLOCA(sizeof(HEFS_BOOT_NODE));
- if (!root) {
- mm_delete_heap((VoidPtr) node);
+ if (!boot) {
+ mm_free_ptr((VoidPtr) node);
err_global_get() = kErrorInvalidData;
return NO;
@@ -1081,11 +1080,11 @@ _Output Bool HeFileSystemParser::INodeCtlManip(_Input DriveTrait* mnt, _Input co
mnt->fPacket.fPacketLba = mnt->fLbaStart;
mnt->fPacket.fPacketSize = sizeof(HEFS_BOOT_NODE);
- mnt->fPacket.fPacketContent = root;
+ mnt->fPacket.fPacketContent = boot;
mnt->fInput(mnt->fPacket);
- if (!KStringBuilder::Equals(root->fMagic, kHeFSMagic) || root->fVersion != kHeFSVersion) {
+ if (!KStringBuilder::Equals(boot->fMagic, kHeFSMagic) || boot->fVersion != kHeFSVersion) {
err_global_get() = kErrorDisk;
return YES;
}
@@ -1112,8 +1111,8 @@ _Output Bool HeFileSystemParser::INodeCtlManip(_Input DriveTrait* mnt, _Input co
}
node->fAccessed = 0;
- node->fCreated = delete_or_create ? 0UL : 1UL;
- node->fDeleted = delete_or_create ? 1UL : 0UL;
+ node->fCreated = delete_or_create ? NO : YES;
+ node->fDeleted = delete_or_create ? 1UL : NO;
node->fModified = 0;
node->fSize = 0;
node->fKind = kind;
@@ -1123,16 +1122,16 @@ _Output Bool HeFileSystemParser::INodeCtlManip(_Input DriveTrait* mnt, _Input co
node->fUID = 0;
node->fHashPath = Detail::hefsi_hash_64(name);
- if (Detail::hefsi_update_in_status(root, mnt, dir, node, delete_or_create)) {
- mm_delete_heap((VoidPtr) node);
+ if (Detail::hefsi_update_in_status(boot, mnt, dir, node, delete_or_create)) {
+ mm_free_ptr((VoidPtr) node);
- Detail::hefsi_balance_ind(root, mnt);
+ Detail::hefsi_balance_ind(boot, mnt);
err_global_get() = kErrorSuccess;
return YES;
}
- mm_delete_heap((VoidPtr) node);
+ mm_free_ptr((VoidPtr) node);
err_global_get() = kErrorDirectoryNotFound;
return NO;
@@ -1142,7 +1141,7 @@ STATIC DriveTrait kMountPoint;
/// @brief Initialize the HeFS filesystem.
/// @return To check its status, see err_local_get().
-Boolean fs_init_hefs(Void) {
+Boolean HeFS::fs_init_hefs(Void) noexcept {
kout << "Creating HeFS disk...\r";
kMountPoint = io_construct_main_drive();
@@ -1152,10 +1151,8 @@ Boolean fs_init_hefs(Void) {
HeFileSystemParser parser;
- parser.Format(&kMountPoint, kHeFSEncodingFlagsUTF8, kHeFSDefaultVolumeName);
-
- return YES;
+ return parser.Format(&kMountPoint, kHeFSEncodingFlagsUTF8, kHeFSDefaultVolumeName);
}
-} // namespace Kernel::HeFS
+} // namespace Kernel
#endif // ifdef __FSKIT_INCLUDES_HEFS__
diff --git a/dev/kernel/src/FS/NeFS+FileMgr.cc b/dev/kernel/src/FS/NeFS+FileMgr.cc
index c92d6727..978a43a8 100644
--- a/dev/kernel/src/FS/NeFS+FileMgr.cc
+++ b/dev/kernel/src/FS/NeFS+FileMgr.cc
@@ -8,7 +8,7 @@
#ifdef __FSKIT_INCLUDES_NEFS__
#include <KernelKit/FileMgr.h>
-#include <KernelKit/MemoryMgr.h>
+#include <KernelKit/HeapMgr.h>
/// @brief NeFS File System Manager.
/// BUGS: 0
diff --git a/dev/kernel/src/FS/NeFS+FileSystemParser.cc b/dev/kernel/src/FS/NeFS+FileSystemParser.cc
index 0b818bbb..dd0a1d9a 100644
--- a/dev/kernel/src/FS/NeFS+FileSystemParser.cc
+++ b/dev/kernel/src/FS/NeFS+FileSystemParser.cc
@@ -10,13 +10,14 @@
#include <FirmwareKit/EPM.h>
#include <KernelKit/DriveMgr.h>
+#include <KernelKit/IFS.h>
#include <KernelKit/KPC.h>
#include <KernelKit/ProcessScheduler.h>
-#include <KernelKit/User.h>
-#include <NewKit/Crc32.h>
-#include <NewKit/KString.h>
-#include <NewKit/KernelPanic.h>
-#include <NewKit/Utils.h>
+#include <KernelKit/UserMgr.h>
+#include <NeKit/Crc32.h>
+#include <NeKit/KString.h>
+#include <NeKit/KernelPanic.h>
+#include <NeKit/Utils.h>
#include <modules/AHCI/AHCI.h>
#include <modules/ATA/ATA.h>
@@ -240,7 +241,7 @@ _Output NEFS_CATALOG_STRUCT* NeFileSystemParser::CreateCatalog(_Input const Char
return nullptr;
}
- Char* parent_name = (Char*) mm_new_heap(sizeof(Char) * rt_string_len(name), Yes, No);
+ Char* parent_name = (Char*) mm_alloc_ptr(sizeof(Char) * rt_string_len(name), Yes, No);
/// Locate parent catalog, to then allocate right after it.
@@ -269,7 +270,7 @@ _Output NEFS_CATALOG_STRUCT* NeFileSystemParser::CreateCatalog(_Input const Char
NEFS_CATALOG_STRUCT* catalog = this->FindCatalog(parent_name, out_lba);
- mm_delete_heap(parent_name);
+ mm_free_ptr(parent_name);
auto& drive = kMountpoint.A();
@@ -444,6 +445,8 @@ bool NeFileSystemParser::Format(_Input _Output DriveTrait* drive, _Input const I
NEFS_ROOT_PARTITION_BLOCK* part_block = (NEFS_ROOT_PARTITION_BLOCK*) fs_buf;
+ if (rt_string_cmp(kNeFSIdent, part_block->Ident, kNeFSIdentLen) == 0) return true;
+
const auto kNeFSUntitledHD = part_name;
rt_copy_memory((VoidPtr) kNeFSIdent, (VoidPtr) part_block->Ident, kNeFSIdentLen);
@@ -463,6 +466,7 @@ bool NeFileSystemParser::Format(_Input _Output DriveTrait* drive, _Input const I
part_block->FreeSectors = sectorCount / sizeof(NEFS_CATALOG_STRUCT) - 1;
part_block->SectorCount = sectorCount;
part_block->DiskSize = diskSize;
+ part_block->SectorSize = drive->fSectorSz;
part_block->FreeCatalog = sectorCount / sizeof(NEFS_CATALOG_STRUCT) - 1;
drive->fPacket.fPacketContent = fs_buf;
@@ -479,26 +483,6 @@ bool NeFileSystemParser::Format(_Input _Output DriveTrait* drive, _Input const I
(Void)(kout << "Free sectors: " << hex_number(part_block->FreeSectors) << kendl);
(Void)(kout << "Sector size: " << hex_number(part_block->SectorSize) << kendl);
- NEFS_CATALOG_STRUCT root{};
-
- rt_set_memory(&root, 0, sizeof(NEFS_CATALOG_STRUCT));
-
- root.PrevSibling = part_block->StartCatalog;
- root.NextSibling = 0UL;
-
- root.Kind = kNeFSCatalogKindDir;
- root.Flags |= kNeFSFlagCreated;
- root.CatalogFlags |= kNeFSStatusUnlocked;
-
- root.Name[0] = '/';
- root.Name[1] = 0;
-
- drive->fPacket.fPacketLba = part_block->StartCatalog;
- drive->fPacket.fPacketSize = sizeof(NEFS_CATALOG_STRUCT);
- drive->fPacket.fPacketContent = &root;
-
- drive->fOutput(drive->fPacket);
-
return true;
}
@@ -895,7 +879,7 @@ namespace Kernel::NeFS {
/// @brief Construct NeFS drives.
/***********************************************************************************/
Boolean fs_init_nefs(Void) noexcept {
- kout << "Creating main disk...\r";
+ kout << "Creating HeFS disk...\r";
kMountpoint.A() = io_construct_main_drive();
@@ -903,9 +887,8 @@ Boolean fs_init_nefs(Void) noexcept {
ke_panic(RUNTIME_CHECK_FILESYSTEM, "Main disk cannot be mounted.");
NeFileSystemParser parser;
- parser.Format(&kMountpoint.A(), 0, kNeFSVolumeName);
- return YES;
+ return parser.Format(&kMountpoint.A(), 0, kNeFSVolumeName);
}
} // namespace Kernel::NeFS
diff --git a/dev/kernel/src/FileMgr.cc b/dev/kernel/src/FileMgr.cc
index 06d19e5b..e000965f 100644
--- a/dev/kernel/src/FileMgr.cc
+++ b/dev/kernel/src/FileMgr.cc
@@ -5,7 +5,7 @@
------------------------------------------- */
#include <KernelKit/FileMgr.h>
-#include <NewKit/Utils.h>
+#include <NeKit/Utils.h>
/***********************************************************************************/
/// @file FileMgr.cc
diff --git a/dev/kernel/src/GUIDWizard.cc b/dev/kernel/src/GUIDWizard.cc
index 48ee1ec6..46915ace 100644
--- a/dev/kernel/src/GUIDWizard.cc
+++ b/dev/kernel/src/GUIDWizard.cc
@@ -10,7 +10,7 @@
------------------------------------------- */
#include <CFKit/GUIDWizard.h>
-#include <NewKit/Ref.h>
+#include <NeKit/Ref.h>
// begin of ascii 'readable' characters. (A, C, C, 1, 2)
#define kUUIDAsciiBegin 47
diff --git a/dev/kernel/src/HardwareThreadScheduler.cc b/dev/kernel/src/HardwareThreadScheduler.cc
index c49c3081..78bad9d6 100644
--- a/dev/kernel/src/HardwareThreadScheduler.cc
+++ b/dev/kernel/src/HardwareThreadScheduler.cc
@@ -21,7 +21,7 @@ namespace Kernel {
/***********************************************************************************/
EXTERN_C Bool hal_check_stack(HAL::StackFramePtr frame);
-EXTERN_C Bool mp_register_process(HAL::StackFramePtr frame, ProcessID pid);
+EXTERN_C Bool mp_register_task(HAL::StackFramePtr frame, ProcessID pid);
STATIC HardwareThreadScheduler kHardwareThreadScheduler;
@@ -41,14 +41,14 @@ HardwareThread::~HardwareThread() = default;
/***********************************************************************************/
//! @brief returns the id of the thread.
/***********************************************************************************/
-const ThreadID& HardwareThread::ID() noexcept {
+ThreadID& HardwareThread::ID() noexcept {
return fID;
}
/***********************************************************************************/
//! @brief returns the kind of thread we have.
/***********************************************************************************/
-const ThreadKind& HardwareThread::Kind() noexcept {
+ThreadKind& HardwareThread::Kind() noexcept {
return fKind;
}
@@ -57,19 +57,6 @@ const ThreadKind& HardwareThread::Kind() noexcept {
//! @return whether the thread is busy or not.
/***********************************************************************************/
Bool HardwareThread::IsBusy() noexcept {
- STATIC Int64 busy_timer = 0U;
- constexpr Int64 kTimeoutMax =
- 0x1000000; // an arbitrary value used to tell if the timeout hasn't been reached yet.
-
- if (fBusy && (busy_timer > kTimeoutMax)) {
- busy_timer = 0U;
- fBusy = No;
-
- return No;
- }
-
- ++busy_timer;
-
return fBusy;
}
@@ -104,21 +91,17 @@ Void HardwareThread::Wake(const bool wakeup) noexcept {
/// @retval true stack was changed, code is running.
/// @retval false stack is invalid, previous code is running.
/***********************************************************************************/
-Bool HardwareThread::Switch(VoidPtr image_ptr, Ptr8 stack_ptr, HAL::StackFramePtr frame,
- const ThreadID& pid) {
- if (this->IsBusy()) return NO;
-
- this->fStack = frame;
- this->fPID = pid;
-
- this->fStack->BP = reinterpret_cast<UIntPtr>(image_ptr);
- this->fStack->SP = reinterpret_cast<UIntPtr>(stack_ptr);
-
- Bool ret = mp_register_process(fStack, this->fPID);
+Bool HardwareThread::Switch(HAL::StackFramePtr frame) {
+ if (!frame) {
+ return NO;
+ }
- if (ret) this->Busy(YES);
+ if (!hal_check_stack(frame)) {
+ return NO;
+ }
- return ret;
+ this->fStack = frame;
+ return mp_register_task(fStack, this->fID);
}
/***********************************************************************************/
@@ -162,12 +145,8 @@ HAL::StackFramePtr HardwareThreadScheduler::Leak() noexcept {
*/
/***********************************************************************************/
Ref<HardwareThread*> HardwareThreadScheduler::operator[](SizeT idx) {
- if (idx == 0) {
- if (fThreadList[idx].Kind() != kAPSystemReserved) {
- fThreadList[idx].fKind = kAPBoot;
- }
- } else if (idx >= kMaxAPInsideSched) {
- static HardwareThread* kFakeThread = nullptr;
+ if (idx >= kMaxAPInsideSched) {
+ HardwareThread* kFakeThread = nullptr;
return {kFakeThread};
}
diff --git a/dev/kernel/src/MemoryMgr.cc b/dev/kernel/src/HeapMgr.cc
index 9b7bea43..eb86f378 100644
--- a/dev/kernel/src/MemoryMgr.cc
+++ b/dev/kernel/src/HeapMgr.cc
@@ -6,27 +6,27 @@
#include <ArchKit/ArchKit.h>
#include <KernelKit/DebugOutput.h>
+#include <KernelKit/HeapMgr.h>
#include <KernelKit/KPC.h>
-#include <KernelKit/MemoryMgr.h>
-#include <NewKit/Crc32.h>
-#include <NewKit/PageMgr.h>
-#include <NewKit/Utils.h>
+#include <NeKit/Crc32.h>
+#include <NeKit/PageMgr.h>
+#include <NeKit/Utils.h>
/* -------------------------------------------
Revision History:
10/8/24: FIX: Fix useless long name, alongside a new WR (WriteRead) field.
- 20/10/24: FIX: Fix mm_new_ and mm_delete_ APIs inside MemoryMgr.h header. (amlal)
+ 20/10/24: FIX: Fix mm_new_ and mm_delete_ APIs inside HeapMgr.h header. (amlal)
27/01/25: REFACTOR: Reworked code as the memory manager.
- 25/03/25: REFACTOR: Refactor MemoryMgr code and log freed address location.
+ 25/03/25: REFACTOR: Refactor HeapMgr code and log freed address location.
------------------------------------------- */
-//! @file MemoryMgr.cc
-//! @brief Heap algorithm that serves as the main memory manager.
+//! @file HeapMgr.cc
+//! @brief Heap system that serves as the main memory manager.
-#define kMemoryMgrMagic (0xD4D75)
-#define kMemoryMgrAlignSz (4U)
+#define kHeapMgrMagic (0xD4D75)
+#define kHeapMgrAlignSz (4U)
namespace Kernel {
/// @brief Implementation details.
@@ -68,20 +68,20 @@ namespace Detail {
UInt32 fPad;
/// @brief Padding bytes for header.
- UInt8 fPadding[kMemoryMgrAlignSz];
+ UInt8 fPadding[kHeapMgrAlignSz];
};
/// @brief Check for heap address validity.
/// @param heap_ptr The address_ptr to check.
/// @return Bool if the pointer is valid or not.
- _Output auto mm_check_heap_address(VoidPtr heap_ptr) -> Bool {
+ _Output auto mm_check_ptr_address(VoidPtr heap_ptr) -> Bool {
if (!heap_ptr) return false;
- IntPtr base_heap = ((IntPtr) heap_ptr) - sizeof(Detail::MM_INFORMATION_BLOCK);
+ IntPtr base_ptr = ((IntPtr) heap_ptr) - sizeof(Detail::MM_INFORMATION_BLOCK);
/// Add that check in case we're having an integer underflow. ///
- if (base_heap < 0) {
+ if (base_ptr < 0) {
return false;
}
@@ -91,43 +91,29 @@ namespace Detail {
typedef MM_INFORMATION_BLOCK* MM_INFORMATION_BLOCK_PTR;
} // namespace Detail
-/// @brief Declare a new size for ptr_heap.
-/// @param ptr_heap the pointer.
-/// @return Newly allocated heap header.
-_Output auto mm_realloc_heap(VoidPtr ptr_heap, SizeT new_sz) -> VoidPtr {
- if (Detail::mm_check_heap_address(ptr_heap) == No) return nullptr;
-
- if (!ptr_heap || new_sz < 1) return nullptr;
-
- kout << "This function is not implemented by the kernel yet.\r";
-
- ke_panic(RUNTIME_CHECK_INVALID);
-
- return nullptr;
-}
+STATIC PageMgr kPageMgr;
/// @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.
-_Output VoidPtr mm_new_heap(SizeT sz, Bool wr, Bool user, SizeT pad_amount) {
+_Output VoidPtr mm_alloc_ptr(SizeT sz, Bool wr, Bool user, SizeT pad_amount) {
auto sz_fix = sz;
if (sz_fix == 0) return nullptr;
sz_fix += sizeof(Detail::MM_INFORMATION_BLOCK);
- PageMgr page_mgr;
- auto wrapper = page_mgr.Request(wr, user, No, sz_fix, pad_amount);
+ auto wrapper = kPageMgr.Request(wr, user, No, sz_fix, pad_amount);
Detail::MM_INFORMATION_BLOCK_PTR heap_info_ptr =
reinterpret_cast<Detail::MM_INFORMATION_BLOCK_PTR>(wrapper.VirtualAddress() +
sizeof(Detail::MM_INFORMATION_BLOCK));
heap_info_ptr->fSize = sz_fix;
- heap_info_ptr->fMagic = kMemoryMgrMagic;
- heap_info_ptr->fCRC32 = 0; // dont fill it for now.
+ heap_info_ptr->fMagic = kHeapMgrMagic;
+ heap_info_ptr->fCRC32 = 0U; // dont fill it for now.
heap_info_ptr->fOffset =
reinterpret_cast<UIntPtr>(heap_info_ptr) + sizeof(Detail::MM_INFORMATION_BLOCK);
heap_info_ptr->fPage = No;
@@ -136,12 +122,12 @@ _Output VoidPtr mm_new_heap(SizeT sz, Bool wr, Bool user, SizeT pad_amount) {
heap_info_ptr->fPresent = Yes;
heap_info_ptr->fPad = pad_amount;
- rt_set_memory(heap_info_ptr->fPadding, 0, kMemoryMgrAlignSz);
+ rt_set_memory(heap_info_ptr->fPadding, 0, kHeapMgrAlignSz);
auto result = reinterpret_cast<VoidPtr>(heap_info_ptr->fOffset);
- (Void)(kout << "Registered heap address: " << hex_number(reinterpret_cast<UIntPtr>(heap_info_ptr))
- << kendl);
+ (Void)(kout << "HeapMgr: Registered heap address: "
+ << hex_number(reinterpret_cast<UIntPtr>(heap_info_ptr)) << kendl);
return result;
}
@@ -150,7 +136,7 @@ _Output VoidPtr mm_new_heap(SizeT sz, Bool wr, Bool user, SizeT pad_amount) {
/// @param heap_ptr the pointer to make a page heap.
/// @return kErrorSuccess if successful, otherwise an error code.
_Output Int32 mm_make_page(VoidPtr heap_ptr) {
- if (Detail::mm_check_heap_address(heap_ptr) == No) return kErrorHeapNotPresent;
+ if (Detail::mm_check_ptr_address(heap_ptr) == No) return kErrorHeapNotPresent;
Detail::MM_INFORMATION_BLOCK_PTR heap_info_ptr =
reinterpret_cast<Detail::MM_INFORMATION_BLOCK_PTR>((UIntPtr) heap_ptr -
@@ -160,8 +146,8 @@ _Output Int32 mm_make_page(VoidPtr heap_ptr) {
heap_info_ptr->fPage = true;
- (Void)(kout << "Registered page address: " << hex_number(reinterpret_cast<UIntPtr>(heap_info_ptr))
- << kendl);
+ (Void)(kout << "HeapMgr: Registered page from heap address: "
+ << hex_number(reinterpret_cast<UIntPtr>(heap_info_ptr)) << kendl);
return kErrorSuccess;
}
@@ -169,8 +155,8 @@ _Output 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.
-_Output Int32 mm_make_flags(VoidPtr heap_ptr, UInt64 flags) {
- if (Detail::mm_check_heap_address(heap_ptr) == No) return kErrorHeapNotPresent;
+_Output Int32 mm_set_ptr_flags(VoidPtr heap_ptr, UInt64 flags) {
+ if (Detail::mm_check_ptr_address(heap_ptr) == No) return kErrorHeapNotPresent;
Detail::MM_INFORMATION_BLOCK_PTR heap_info_ptr =
reinterpret_cast<Detail::MM_INFORMATION_BLOCK_PTR>((UIntPtr) heap_ptr -
@@ -185,7 +171,7 @@ _Output Int32 mm_make_flags(VoidPtr heap_ptr, UInt64 flags) {
/// @brief Gets the flags of a heap header.
/// @param heap_ptr the pointer to get.
-_Output UInt64 mm_get_flags(VoidPtr heap_ptr) {
+_Output UInt64 mm_get_ptr_flags(VoidPtr heap_ptr) {
Detail::MM_INFORMATION_BLOCK_PTR heap_info_ptr =
reinterpret_cast<Detail::MM_INFORMATION_BLOCK_PTR>((UIntPtr) heap_ptr -
sizeof(Detail::MM_INFORMATION_BLOCK));
@@ -198,14 +184,14 @@ _Output UInt64 mm_get_flags(VoidPtr heap_ptr) {
/// @brief Declare pointer as free.
/// @param heap_ptr the pointer.
/// @return
-_Output Int32 mm_delete_heap(VoidPtr heap_ptr) {
- if (Detail::mm_check_heap_address(heap_ptr) == No) return kErrorHeapNotPresent;
+_Output Int32 mm_free_ptr(VoidPtr heap_ptr) {
+ if (Detail::mm_check_ptr_address(heap_ptr) == No) return kErrorHeapNotPresent;
Detail::MM_INFORMATION_BLOCK_PTR heap_info_ptr =
reinterpret_cast<Detail::MM_INFORMATION_BLOCK_PTR>((UIntPtr) (heap_ptr) -
sizeof(Detail::MM_INFORMATION_BLOCK));
- if (heap_info_ptr && heap_info_ptr->fMagic == kMemoryMgrMagic) {
+ if (heap_info_ptr && heap_info_ptr->fMagic == kHeapMgrMagic) {
if (!heap_info_ptr->fPresent) {
return kErrorHeapNotPresent;
}
@@ -219,16 +205,16 @@ _Output Int32 mm_delete_heap(VoidPtr heap_ptr) {
heap_info_ptr->fMagic = 0;
heap_info_ptr->fPad = 0;
- (Void)(kout << "Freed heap address: " << hex_number(reinterpret_cast<UIntPtr>(heap_info_ptr))
- << kendl);
+ (Void)(kout << "HeapMgr: Freed heap address: "
+ << hex_number(reinterpret_cast<UIntPtr>(heap_info_ptr)) << kendl);
PTEWrapper page_wrapper(
No, No, No,
reinterpret_cast<UIntPtr>(heap_info_ptr) - sizeof(Detail::MM_INFORMATION_BLOCK));
+
Ref<PTEWrapper> pte_address{page_wrapper};
- PageMgr page_mgr;
- page_mgr.Free(pte_address);
+ kPageMgr.Free(pte_address);
return kErrorSuccess;
}
@@ -239,13 +225,13 @@ _Output Int32 mm_delete_heap(VoidPtr heap_ptr) {
/// @brief Check if pointer is a valid Kernel pointer.
/// @param heap_ptr the pointer
/// @return if it exists.
-_Output Boolean mm_is_valid_heap(VoidPtr heap_ptr) {
+_Output Boolean mm_is_valid_ptr(VoidPtr heap_ptr) {
if (heap_ptr && HAL::mm_is_bitmap(heap_ptr)) {
Detail::MM_INFORMATION_BLOCK_PTR heap_info_ptr =
reinterpret_cast<Detail::MM_INFORMATION_BLOCK_PTR>((UIntPtr) (heap_ptr) -
sizeof(Detail::MM_INFORMATION_BLOCK));
- return (heap_info_ptr && heap_info_ptr->fPresent && heap_info_ptr->fMagic == kMemoryMgrMagic);
+ return (heap_info_ptr && heap_info_ptr->fPresent && heap_info_ptr->fMagic == kHeapMgrMagic);
}
return No;
@@ -254,14 +240,14 @@ _Output Boolean mm_is_valid_heap(VoidPtr heap_ptr) {
/// @brief Protect the heap with a CRC value.
/// @param heap_ptr HIB pointer.
/// @return if it valid: point has crc now., otherwise fail.
-_Output Boolean mm_protect_heap(VoidPtr heap_ptr) {
+_Output Boolean mm_protect_ptr(VoidPtr heap_ptr) {
if (heap_ptr) {
Detail::MM_INFORMATION_BLOCK_PTR heap_info_ptr =
reinterpret_cast<Detail::MM_INFORMATION_BLOCK_PTR>((UIntPtr) heap_ptr -
sizeof(Detail::MM_INFORMATION_BLOCK));
/// if valid, present and is heap header, then compute crc32
- if (heap_info_ptr && heap_info_ptr->fPresent && kMemoryMgrMagic == heap_info_ptr->fMagic) {
+ if (heap_info_ptr && heap_info_ptr->fPresent && kHeapMgrMagic == heap_info_ptr->fMagic) {
heap_info_ptr->fCRC32 =
ke_calculate_crc32((Char*) heap_info_ptr->fOffset, heap_info_ptr->fSize);
diff --git a/dev/kernel/src/DriveMgr+IO.cc b/dev/kernel/src/IFS.cc
index 9137c91e..ba2ec8c0 100644
--- a/dev/kernel/src/DriveMgr+IO.cc
+++ b/dev/kernel/src/IFS.cc
@@ -9,9 +9,9 @@
/*************************************************************
*
- * File: DriveMgr+IO.cc
+ * File: IFS.cc
* Purpose: Filesystem to mountpoint interface.
- * Date: 3/26/24
+ * Date: 05/26/2025
*
* Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved.
*
@@ -23,13 +23,13 @@
#define fsi_ifs_read(DRV, TRAITS, MP) (MP->DRV()).fInput(TRAITS)
namespace Kernel {
-/// @brief Read from newfs disk.
+/// @brief Read from fs disk.
/// @param Mnt mounted interface.
/// @param DrvTrait drive info
/// @param DrvIndex drive index.
/// @return
Int32 fs_ifs_read(MountpointInterface* Mnt, DriveTrait& DrvTrait, Int32 DrvIndex) {
- if (!Mnt) return 1;
+ if (!Mnt) return kErrorDisk;
DrvTrait.fPacket.fPacketGood = false;
@@ -52,16 +52,16 @@ Int32 fs_ifs_read(MountpointInterface* Mnt, DriveTrait& DrvTrait, Int32 DrvIndex
}
}
- return DrvTrait.fPacket.fPacketGood;
+ return DrvTrait.fPacket.fPacketGood ? kErrorSuccess : kErrorDisk;
}
-/// @brief Write to newfs disk.
+/// @brief Write to fs disk.
/// @param Mnt mounted interface.
/// @param DrvTrait drive info
/// @param DrvIndex drive index.
/// @return
Int32 fs_ifs_write(MountpointInterface* Mnt, DriveTrait& DrvTrait, Int32 DrvIndex) {
- if (!Mnt) return 1;
+ if (!Mnt) return kErrorDisk;
DrvTrait.fPacket.fPacketGood = false;
@@ -84,6 +84,6 @@ Int32 fs_ifs_write(MountpointInterface* Mnt, DriveTrait& DrvTrait, Int32 DrvInde
}
}
- return DrvTrait.fPacket.fPacketGood;
+ return DrvTrait.fPacket.fPacketGood ? kErrorSuccess : kErrorDisk;
}
} // namespace Kernel \ No newline at end of file
diff --git a/dev/kernel/src/IPEFDylibObject.cc b/dev/kernel/src/IPEFDylibObject.cc
index f9cd758c..d1d4eeca 100644
--- a/dev/kernel/src/IPEFDylibObject.cc
+++ b/dev/kernel/src/IPEFDylibObject.cc
@@ -12,7 +12,7 @@
#include <KernelKit/PEF.h>
#include <KernelKit/ProcessScheduler.h>
#include <KernelKit/ThreadLocalStorage.h>
-#include <NewKit/Defines.h>
+#include <NeKit/Defines.h>
/* -------------------------------------------
@@ -49,7 +49,7 @@ EXTERN_C IDylibRef rtl_init_dylib_pef(USER_PROCESS& process) {
return nullptr;
}
- dll_obj->Mount(new IPEFDylibObject::DLL_TRAITS());
+ dll_obj->Mount(new IPEFDylibObject::DylibTraits());
if (!dll_obj->Get()) {
tls_delete_class(dll_obj);
diff --git a/dev/kernel/src/IndexableProperty.cc b/dev/kernel/src/IndexableProperty.cc
index a89ea92d..1d2a1ce8 100644
--- a/dev/kernel/src/IndexableProperty.cc
+++ b/dev/kernel/src/IndexableProperty.cc
@@ -6,8 +6,8 @@
#include <CompilerKit/CompilerKit.h>
#include <FSKit/IndexableProperty.h>
-#include <NewKit/MutableArray.h>
-#include <NewKit/Utils.h>
+#include <NeKit/MutableArray.h>
+#include <NeKit/Utils.h>
/// @brief File indexer API for fast path access.
/// BUGS: 0
diff --git a/dev/kernel/src/Json.cc b/dev/kernel/src/Json.cc
index 9264b2b8..68ab55fc 100644
--- a/dev/kernel/src/Json.cc
+++ b/dev/kernel/src/Json.cc
@@ -4,7 +4,7 @@
------------------------------------------- */
-#include <NewKit/Json.h>
+#include <NeKit/Json.h>
/// @brief Undefined object, is null in length.
RTL_INIT_OBJECT(Kernel::Json::kNull, Kernel::Json);
diff --git a/dev/kernel/src/KPC.cc b/dev/kernel/src/KPC.cc
index 8937d19a..1693fbd3 100644
--- a/dev/kernel/src/KPC.cc
+++ b/dev/kernel/src/KPC.cc
@@ -4,9 +4,9 @@
------------------------------------------- */
+#include <KernelKit/HeapMgr.h>
#include <KernelKit/KPC.h>
-#include <KernelKit/MemoryMgr.h>
-#include <NewKit/KernelPanic.h>
+#include <NeKit/KernelPanic.h>
namespace Kernel {
STATIC Bool kRaiseOnBugCheck = false;
@@ -19,7 +19,7 @@ Boolean err_bug_check_raise(Void) noexcept {
if (ptr == nullptr) goto bug_check_fail;
- if (!mm_is_valid_heap(ptr)) goto bug_check_fail;
+ if (!mm_is_valid_ptr(ptr)) goto bug_check_fail;
delete[] ptr;
diff --git a/dev/kernel/src/KString.cc b/dev/kernel/src/KString.cc
index 479eb2fc..9f332cdf 100644
--- a/dev/kernel/src/KString.cc
+++ b/dev/kernel/src/KString.cc
@@ -4,8 +4,8 @@
------------------------------------------- */
-#include <NewKit/KString.h>
-#include <NewKit/Utils.h>
+#include <NeKit/KString.h>
+#include <NeKit/Utils.h>
/// @file KString.cc
/// @brief Kernel String manipulation file.
diff --git a/dev/kernel/src/MutableArray.cc b/dev/kernel/src/MutableArray.cc
index 4b07f9ae..b7aaee1c 100644
--- a/dev/kernel/src/MutableArray.cc
+++ b/dev/kernel/src/MutableArray.cc
@@ -4,4 +4,4 @@
------------------------------------------- */
-#include <NewKit/MutableArray.h>
+#include <NeKit/MutableArray.h>
diff --git a/dev/kernel/src/Network/IPAddr.cc b/dev/kernel/src/Network/IPAddr.cc
index 4437df22..beb69470 100644
--- a/dev/kernel/src/Network/IPAddr.cc
+++ b/dev/kernel/src/Network/IPAddr.cc
@@ -4,8 +4,8 @@
------------------------------------------- */
+#include <NeKit/Utils.h>
#include <NetworkKit/IP.h>
-#include <NewKit/Utils.h>
namespace Kernel {
Char* RawIPAddress::Address() {
diff --git a/dev/kernel/src/Network/IPCMsg.cc b/dev/kernel/src/Network/IPCMsg.cc
index e89e7c1b..cff19cfa 100644
--- a/dev/kernel/src/Network/IPCMsg.cc
+++ b/dev/kernel/src/Network/IPCMsg.cc
@@ -101,7 +101,6 @@ Bool ipc_construct_packet(_Output IPC_MSG** pckt_in) {
Bool IPC_MSG::Pass(IPC_MSG* src, IPC_MSG* target) noexcept {
if (src && target && (target != src)) {
if (src->IpcMsgSz > target->IpcMsgSz) return No;
-
if (target->IpcMsgSz > src->IpcMsgSz) return No;
rt_copy_memory(src->IpcData, target->IpcData, src->IpcMsgSz);
diff --git a/dev/kernel/src/Network/NetworkDevice.cc b/dev/kernel/src/Network/NetworkDevice.cc
index 6f77a244..7f93fa1b 100644
--- a/dev/kernel/src/Network/NetworkDevice.cc
+++ b/dev/kernel/src/Network/NetworkDevice.cc
@@ -4,14 +4,14 @@
------------------------------------------- */
+#include <NeKit/Utils.h>
#include <NetworkKit/NetworkDevice.h>
-#include <NewKit/Utils.h>
namespace Kernel {
/// \brief Getter for fNetworkName.
/// \return Network device name.
const Char* NetworkDevice::Name() const {
- return this->fNetworkName;
+ return "/devices/net{}";
}
/// \brief Setter for fNetworkName.
@@ -20,9 +20,9 @@ Boolean NetworkDevice::Name(const Char* name) {
if (*name == 0) return NO;
- if (rt_string_len(name) > cNetworkNameLen) return NO;
+ if (rt_string_len(name) > rt_string_len(this->Name())) return NO;
- rt_copy_memory((VoidPtr) name, (VoidPtr) this->fNetworkName, rt_string_len(name));
+ rt_copy_memory((VoidPtr) name, (VoidPtr) this->Name(), rt_string_len(this->Name()));
return YES;
}
diff --git a/dev/kernel/src/New+Delete.cc b/dev/kernel/src/New+Delete.cc
index 96e7ab64..da705f26 100644
--- a/dev/kernel/src/New+Delete.cc
+++ b/dev/kernel/src/New+Delete.cc
@@ -4,31 +4,31 @@
------------------------------------------- */
-#include <KernelKit/MemoryMgr.h>
-#include <NewKit/New.h>
+#include <KernelKit/HeapMgr.h>
+#include <NeKit/New.h>
void* operator new[](size_t sz) {
if (sz == 0) ++sz;
- return Kernel::mm_new_heap(sz, true, false);
+ return Kernel::mm_alloc_ptr(sz, true, false);
}
void* operator new(size_t sz) {
if (sz == 0) ++sz;
- return Kernel::mm_new_heap(sz, true, false);
+ return Kernel::mm_alloc_ptr(sz, true, false);
}
void operator delete[](void* ptr) {
if (ptr == nullptr) return;
- Kernel::mm_delete_heap(ptr);
+ Kernel::mm_free_ptr(ptr);
}
void operator delete(void* ptr) {
if (ptr == nullptr) return;
- Kernel::mm_delete_heap(ptr);
+ Kernel::mm_free_ptr(ptr);
}
void operator delete(void* ptr, size_t sz) {
@@ -36,7 +36,7 @@ void operator delete(void* ptr, size_t sz) {
NE_UNUSED(sz);
- Kernel::mm_delete_heap(ptr);
+ Kernel::mm_free_ptr(ptr);
}
void operator delete[](void* ptr, size_t sz) {
@@ -44,5 +44,5 @@ void operator delete[](void* ptr, size_t sz) {
NE_UNUSED(sz);
- Kernel::mm_delete_heap(ptr);
+ Kernel::mm_free_ptr(ptr);
}
diff --git a/dev/kernel/src/OwnPtr.cc b/dev/kernel/src/OwnPtr.cc
index 8fd2b985..c716c2f4 100644
--- a/dev/kernel/src/OwnPtr.cc
+++ b/dev/kernel/src/OwnPtr.cc
@@ -4,4 +4,4 @@
------------------------------------------- */
-#include <NewKit/OwnPtr.h>
+#include <NeKit/OwnPtr.h>
diff --git a/dev/kernel/src/PEFCodeMgr.cc b/dev/kernel/src/PEFCodeMgr.cc
index 09a262d4..ed72473f 100644
--- a/dev/kernel/src/PEFCodeMgr.cc
+++ b/dev/kernel/src/PEFCodeMgr.cc
@@ -5,13 +5,13 @@
------------------------------------------- */
#include <KernelKit/DebugOutput.h>
-#include <KernelKit/MemoryMgr.h>
+#include <KernelKit/HeapMgr.h>
#include <KernelKit/PEFCodeMgr.h>
#include <KernelKit/ProcessScheduler.h>
-#include <NewKit/Defines.h>
-#include <NewKit/KString.h>
-#include <NewKit/KernelPanic.h>
-#include <NewKit/OwnPtr.h>
+#include <NeKit/Defines.h>
+#include <NeKit/KString.h>
+#include <NeKit/KernelPanic.h>
+#include <NeKit/OwnPtr.h>
/// @brief PEF stack size symbol.
#define kPefStackSizeSymbol "__PEFSizeOfReserveStack"
@@ -78,7 +78,7 @@ PEFLoader::PEFLoader(const Char* path) : fCachedBlob(nullptr), fFatBinary(false)
fBad = true;
- if (fCachedBlob) mm_delete_heap(fCachedBlob);
+ if (fCachedBlob) mm_free_ptr(fCachedBlob);
kout << "PEFLoader: Warning: Executable format error!\r";
@@ -89,7 +89,7 @@ PEFLoader::PEFLoader(const Char* path) : fCachedBlob(nullptr), fFatBinary(false)
/// @brief PEF destructor.
/***********************************************************************************/
PEFLoader::~PEFLoader() {
- if (fCachedBlob) mm_delete_heap(fCachedBlob);
+ if (fCachedBlob) mm_free_ptr(fCachedBlob);
fFile.Delete();
}
@@ -147,7 +147,7 @@ ErrorOr<VoidPtr> PEFLoader::FindSymbol(const Char* name, Int32 kind) {
if (container_header->Kind == kind) {
if (container_header->Cpu != Detail::ldr_get_platform()) {
if (!this->fFatBinary) {
- mm_delete_heap(blob);
+ mm_free_ptr(blob);
return ErrorOr<VoidPtr>{kErrorInvalidData};
}
}
@@ -156,16 +156,16 @@ ErrorOr<VoidPtr> PEFLoader::FindSymbol(const Char* name, Int32 kind) {
rt_copy_memory((VoidPtr) ((Char*) blob + sizeof(PEFCommandHeader)), container_blob_value,
container_header->Size);
- mm_delete_heap(blob);
+ mm_free_ptr(blob);
kout << "PEFLoader: Information: Loaded stub: " << container_header->Name << "!\r";
auto ret = HAL::mm_map_page((VoidPtr) container_header->VMAddress,
- (VoidPtr) HAL::mm_get_phys_address(container_blob_value),
+ (VoidPtr) HAL::mm_get_page_addr(container_blob_value),
HAL::kMMFlagsPresent | HAL::kMMFlagsUser);
if (ret != kErrorSuccess) {
- mm_delete_heap(container_blob_value);
+ mm_free_ptr(container_blob_value);
return ErrorOr<VoidPtr>{kErrorInvalidData};
}
@@ -174,7 +174,7 @@ ErrorOr<VoidPtr> PEFLoader::FindSymbol(const Char* name, Int32 kind) {
}
}
- mm_delete_heap(blob);
+ mm_free_ptr(blob);
return ErrorOr<VoidPtr>{kErrorInvalidData};
}
@@ -236,7 +236,7 @@ namespace Utils {
UserProcessScheduler::The().Spawn(reinterpret_cast<const Char*>(symname.Leak().Leak()),
errOrStart.Leak().Leak(), exec.GetBlob().Leak().Leak());
- mm_delete_heap(symname.Leak().Leak());
+ mm_free_ptr(symname.Leak().Leak());
if (id != kSchedInvalidPID) {
auto stacksym = exec.FindSymbol(kPefStackSizeSymbol, kPefData);
@@ -249,11 +249,11 @@ namespace Utils {
*(volatile UIntPtr*) stacksym.Leak().Leak() = kSchedMaxStackSz;
}
- UserProcessScheduler::The().CurrentTeam().AsArray()[id].Kind = process_kind;
- UserProcessScheduler::The().CurrentTeam().AsArray()[id].StackSize =
+ UserProcessScheduler::The().TheCurrentTeam().AsArray()[id].Kind = process_kind;
+ UserProcessScheduler::The().TheCurrentTeam().AsArray()[id].StackSize =
*(UIntPtr*) stacksym.Leak().Leak();
- mm_delete_heap(stacksym.Leak().Leak());
+ mm_free_ptr(stacksym.Leak().Leak());
}
return id;
diff --git a/dev/kernel/src/PRDT.cc b/dev/kernel/src/PRDT.cc
index f7380d2d..0c84fd29 100644
--- a/dev/kernel/src/PRDT.cc
+++ b/dev/kernel/src/PRDT.cc
@@ -5,7 +5,7 @@
------------------------------------------- */
#include <KernelKit/DebugOutput.h>
-#include <NewKit/KString.h>
+#include <NeKit/KString.h>
#include <StorageKit/PRDT.h>
namespace Kernel {
diff --git a/dev/kernel/src/PageMgr.cc b/dev/kernel/src/PageMgr.cc
index f60fa57a..e78f4908 100644
--- a/dev/kernel/src/PageMgr.cc
+++ b/dev/kernel/src/PageMgr.cc
@@ -5,7 +5,7 @@
------------------------------------------- */
#include <KernelKit/DebugOutput.h>
-#include <NewKit/PageMgr.h>
+#include <NeKit/PageMgr.h>
#ifdef __NE_AMD64__
#include <HALKit/AMD64/Paging.h>
diff --git a/dev/kernel/src/Pmm.cc b/dev/kernel/src/Pmm.cc
index 35ea4195..b9fba20e 100644
--- a/dev/kernel/src/Pmm.cc
+++ b/dev/kernel/src/Pmm.cc
@@ -5,7 +5,7 @@
------------------------------------------- */
#include <KernelKit/DebugOutput.h>
-#include <NewKit/Pmm.h>
+#include <NeKit/Pmm.h>
#if defined(__NE_ARM64__)
#include <HALKit/ARM64/Processor.h>
diff --git a/dev/kernel/src/Ref.cc b/dev/kernel/src/Ref.cc
index c185952b..db584d9c 100644
--- a/dev/kernel/src/Ref.cc
+++ b/dev/kernel/src/Ref.cc
@@ -4,4 +4,4 @@
------------------------------------------- */
-#include <NewKit/Ref.h>
+#include <NeKit/Ref.h>
diff --git a/dev/kernel/src/Stream.cc b/dev/kernel/src/Stream.cc
index 8fd4dab3..e05f6e6d 100644
--- a/dev/kernel/src/Stream.cc
+++ b/dev/kernel/src/Stream.cc
@@ -9,4 +9,4 @@
------------------------------------------- */
-#include <NewKit/Stream.h>
+#include <NeKit/Stream.h>
diff --git a/dev/kernel/src/Swap/DiskSwap.cc b/dev/kernel/src/Swap/DiskSwap.cc
index 118be0f6..8578450c 100644
--- a/dev/kernel/src/Swap/DiskSwap.cc
+++ b/dev/kernel/src/Swap/DiskSwap.cc
@@ -1,6 +1,6 @@
/* -------------------------------------------
- Copyright (C) 2024-2025 Amlal El Mahrouss Labs, all rights reserved.
+ Copyright (C) 2024-2025 Amlal El Mahrouss , all rights reserved.
------------------------------------------- */
diff --git a/dev/kernel/src/ThreadLocalStorage.cc b/dev/kernel/src/ThreadLocalStorage.cc
index e248e67c..ec315ddf 100644
--- a/dev/kernel/src/ThreadLocalStorage.cc
+++ b/dev/kernel/src/ThreadLocalStorage.cc
@@ -10,7 +10,7 @@
#include <CFKit/Property.h>
#include <KernelKit/ProcessScheduler.h>
#include <KernelKit/ThreadLocalStorage.h>
-#include <NewKit/KString.h>
+#include <NeKit/KString.h>
/***********************************************************************************/
/// @bugs: 0
diff --git a/dev/kernel/src/User.cc b/dev/kernel/src/UserMgr.cc
index 3e6aeeba..c41b445b 100644
--- a/dev/kernel/src/User.cc
+++ b/dev/kernel/src/UserMgr.cc
@@ -11,10 +11,10 @@
*/
#include <KernelKit/FileMgr.h>
+#include <KernelKit/HeapMgr.h>
#include <KernelKit/KPC.h>
-#include <KernelKit/MemoryMgr.h>
-#include <KernelKit/User.h>
-#include <NewKit/KernelPanic.h>
+#include <KernelKit/UserMgr.h>
+#include <NeKit/KernelPanic.h>
#define kStdUserType (0xEE)
#define kSuperUserType (0xEF)
@@ -29,20 +29,23 @@ namespace Detail {
/// \param password password to hash.
/// \return the hashed password
////////////////////////////////////////////////////////////
- Int32 user_standard_token_generator(Char* password, const Char* in_password, User* user,
- SizeT length) {
+ STATIC UInt64 user_fnv_generator(const Char* password, User* user) {
if (!password || !user) return 1;
if (*password == 0) return 1;
- kout << "user_standard_token_generator: Hashing user password...\r";
+ kout << "user_fnv_generator: Hashing user password...\r";
- for (SizeT i_pass = 0UL; i_pass < length; ++i_pass) {
- Char cur_chr = in_password[i_pass];
+ const UInt64 FNV_OFFSET_BASIS = 0xcbf29ce484222325ULL;
+ const UInt64 FNV_PRIME = 0x100000001b3ULL;
- password[i_pass] = cur_chr | (user->IsStdUser() ? kStdUserType : kSuperUserType);
+ UInt64 hash = FNV_OFFSET_BASIS;
+
+ while (*password) {
+ hash ^= (Utf8Char) (*password++);
+ hash *= FNV_PRIME;
}
- kout << "user_standard_token_generator: Hashed user password.\r";
+ kout << "user_fnv_generator: Hashed user password.\r";
return 0;
}
@@ -68,70 +71,26 @@ User::User(const UserRingKind& ring_kind, const Char* user_name) : mUserRing(rin
////////////////////////////////////////////////////////////
User::~User() = default;
-Bool User::Save(const UserPublicKey password_to_fill) noexcept {
- if (!password_to_fill || *password_to_fill == 0) return No;
-
- SizeT len = rt_string_len(password_to_fill);
-
- UserPublicKey password = new UserPublicKeyType[len];
-
- MUST_PASS(password);
-
- rt_set_memory(password, 0, len);
-
- // fill data first, generate hash.
- // return false on error.
-
- rt_copy_memory((VoidPtr) password_to_fill, password, len);
-
- if (!Detail::user_standard_token_generator(password, password_to_fill, this, len)) {
- delete[] password;
- password = nullptr;
-
- return No;
- }
-
- // then store password.
-
- rt_copy_memory(password, this->mUserKey, rt_string_len(password_to_fill));
+Bool User::Save(const UserPublicKey password) noexcept {
+ if (!password || *password == 0) return No;
- delete[] password;
- password = nullptr;
+ this->mUserFNV = Detail::user_fnv_generator(password, this);
kout << "User::Save: Saved password successfully...\r";
return Yes;
}
-Bool User::Matches(const UserPublicKey password_to_fill) noexcept {
- if (!password_to_fill || *password_to_fill) return No;
-
- SizeT len = rt_string_len(password_to_fill);
-
- Char* password = new Char[len];
- MUST_PASS(password);
-
- // fill data first, generate hash.
- // return false on error.
-
- rt_copy_memory((VoidPtr) password_to_fill, password, len);
-
- if (!Detail::user_standard_token_generator(password, password_to_fill, this, len)) {
- delete[] password;
- password = nullptr;
-
- return No;
- }
-
- kout << "User::Matches: Validating hashed passwords...\r";
+Bool User::Login(const UserPublicKey password) noexcept {
+ if (!password || !*password) return No;
// now check if the password matches.
- if (rt_string_cmp(password, this->mUserKey, rt_string_len(this->mUserKey)) == 0) {
- kout << "User::Matches: Password matches.\r";
+ if (this->mUserFNV == Detail::user_fnv_generator(password, this)) {
+ kout << "User::Login: Password matches.\r";
return Yes;
}
- kout << "User::Matches: Password doesn't match.\r";
+ kout << "User::Login: Password doesn't match.\r";
return No;
}
diff --git a/dev/kernel/src/UserProcessScheduler.cc b/dev/kernel/src/UserProcessScheduler.cc
index 2082642c..4bbd085a 100644
--- a/dev/kernel/src/UserProcessScheduler.cc
+++ b/dev/kernel/src/UserProcessScheduler.cc
@@ -14,13 +14,13 @@
/***********************************************************************************/
#include <ArchKit/ArchKit.h>
-#include <NewKit/KString.h>
-
#include <KernelKit/HardwareThreadScheduler.h>
+#include <KernelKit/HeapMgr.h>
#include <KernelKit/IPEFDylibObject.h>
#include <KernelKit/KPC.h>
-#include <KernelKit/MemoryMgr.h>
#include <KernelKit/ProcessScheduler.h>
+#include <NeKit/KString.h>
+#include <SignalKit/Signals.h>
///! BUGS: 0
@@ -31,14 +31,10 @@ namespace Kernel {
STATIC UInt32 kLastExitCode = 0U;
-STATIC BOOL kCurrentlySwitching = No;
-
/***********************************************************************************/
/// @brief Scheduler itself.
/***********************************************************************************/
-STATIC UserProcessScheduler kScheduler;
-
USER_PROCESS::USER_PROCESS() = default;
USER_PROCESS::~USER_PROCESS() = default;
@@ -101,16 +97,15 @@ Void USER_PROCESS::Wake(Bool should_wakeup) {
/** @param tree The tree to calibrate */
/***********************************************************************************/
-STATIC USER_PROCESS::USER_HEAP_TREE* sched_try_go_upper_heap_tree(
- USER_PROCESS::USER_HEAP_TREE* tree) {
+STATIC PROCESS_HEAP_TREE<VoidPtr>* sched_try_go_upper_ptr_tree(PROCESS_HEAP_TREE<VoidPtr>* tree) {
if (!tree) {
return nullptr;
}
- tree = tree->MemoryParent;
+ tree = tree->Parent;
if (tree) {
- auto tree_tmp = tree->MemoryNext;
+ auto tree_tmp = tree->Next;
if (!tree_tmp) {
return tree;
@@ -130,76 +125,75 @@ ErrorOr<VoidPtr> USER_PROCESS::New(SizeT sz, SizeT pad_amount) {
if (this->UsedMemory > kSchedMaxMemoryLimit) return ErrorOr<VoidPtr>(-kErrorHeapOutOfMemory);
#ifdef __NE_VIRTUAL_MEMORY_SUPPORT__
- auto vm_register = kKernelCR3;
+ auto vm_register = kKernelVM;
+
hal_write_cr3(this->VMRegister);
- auto ptr = mm_new_heap(sz, Yes, Yes, pad_amount);
+ auto ptr = mm_alloc_ptr(sz, Yes, Yes, pad_amount);
hal_write_cr3(vm_register);
#else
- auto ptr = mm_new_heap(sz, Yes, Yes, pad_amount);
+ auto ptr = mm_alloc_ptr(sz, Yes, Yes, pad_amount);
#endif
if (!this->HeapTree) {
- this->HeapTree = new USER_HEAP_TREE();
+ this->HeapTree = new PROCESS_HEAP_TREE<VoidPtr>();
- this->HeapTree->MemoryEntryPad = pad_amount;
- this->HeapTree->MemoryEntrySize = sz;
+ this->HeapTree->EntryPad = pad_amount;
+ this->HeapTree->EntrySize = sz;
- this->HeapTree->MemoryEntry = ptr;
+ this->HeapTree->Entry = ptr;
- this->HeapTree->MemoryColor = USER_HEAP_TREE::kBlackMemory;
+ this->HeapTree->Color = kBlackTreeKind;
- this->HeapTree->MemoryPrev = nullptr;
- this->HeapTree->MemoryNext = nullptr;
- this->HeapTree->MemoryParent = nullptr;
- this->HeapTree->MemoryChild = nullptr;
+ this->HeapTree->Prev = nullptr;
+ this->HeapTree->Next = nullptr;
+ this->HeapTree->Parent = nullptr;
+ this->HeapTree->Child = nullptr;
} else {
- USER_HEAP_TREE* entry = this->HeapTree;
- USER_HEAP_TREE* prev_entry = entry;
+ PROCESS_HEAP_TREE<VoidPtr>* entry = this->HeapTree;
+ PROCESS_HEAP_TREE<VoidPtr>* prev_entry = entry;
BOOL is_parent = NO;
while (entry) {
- if (entry->MemoryEntrySize < 1) break;
+ if (entry->EntrySize < 1) break;
prev_entry = entry;
- if (entry->MemoryColor == USER_HEAP_TREE::kBlackMemory) break;
+ if (entry->Color == kBlackTreeKind) break;
- if (entry->MemoryChild && entry->MemoryChild->MemoryEntrySize > 0 &&
- entry->MemoryChild->MemoryEntrySize == sz) {
- entry = entry->MemoryChild;
+ if (entry->Child && entry->Child->EntrySize > 0 && entry->Child->EntrySize == sz) {
+ entry = entry->Child;
is_parent = YES;
- } else if (entry->MemoryNext && entry->MemoryChild->MemoryEntrySize > 0 &&
- entry->MemoryNext->MemoryEntrySize == sz) {
+ } else if (entry->Next && entry->Child->EntrySize > 0 && entry->Next->EntrySize == sz) {
is_parent = NO;
- entry = entry->MemoryNext;
+ entry = entry->Next;
} else {
- entry = sched_try_go_upper_heap_tree(entry);
- if (entry && entry->MemoryColor == USER_HEAP_TREE::kBlackMemory) break;
+ entry = sched_try_go_upper_ptr_tree(entry);
+ if (entry && entry->Color == kBlackTreeKind) break;
}
}
- auto new_entry = new USER_HEAP_TREE();
+ auto new_entry = new PROCESS_HEAP_TREE<VoidPtr>();
- new_entry->MemoryEntry = ptr;
- new_entry->MemoryEntrySize = sz;
- new_entry->MemoryEntryPad = pad_amount;
- new_entry->MemoryParent = entry;
- new_entry->MemoryChild = nullptr;
- new_entry->MemoryNext = nullptr;
- new_entry->MemoryPrev = nullptr;
+ new_entry->Entry = ptr;
+ new_entry->EntrySize = sz;
+ new_entry->EntryPad = pad_amount;
+ new_entry->Parent = entry;
+ new_entry->Child = nullptr;
+ new_entry->Next = nullptr;
+ new_entry->Prev = nullptr;
- new_entry->MemoryColor = USER_HEAP_TREE::kBlackMemory;
- prev_entry->MemoryColor = USER_HEAP_TREE::kRedMemory;
+ new_entry->Color = kBlackTreeKind;
+ prev_entry->Color = kRedTreeKind;
if (is_parent) {
- prev_entry->MemoryChild = new_entry;
- new_entry->MemoryParent = prev_entry;
+ prev_entry->Child = new_entry;
+ new_entry->Parent = prev_entry;
} else {
- prev_entry->MemoryNext = new_entry;
- new_entry->MemoryPrev = prev_entry;
+ prev_entry->Next = new_entry;
+ new_entry->Prev = prev_entry;
}
}
@@ -243,20 +237,20 @@ const AffinityKind& USER_PROCESS::GetAffinity() noexcept {
/** @brief Free heap tree. */
/***********************************************************************************/
-STATIC Void sched_free_heap_tree(USER_PROCESS::USER_HEAP_TREE* memory_heap_list) {
+STATIC Void sched_free_ptr_tree(PROCESS_HEAP_TREE<VoidPtr>* memory_ptr_list) {
// Deleting memory lists. Make sure to free all of them.
- while (memory_heap_list) {
- if (memory_heap_list->MemoryEntry) {
- MUST_PASS(mm_delete_heap(memory_heap_list->MemoryEntry));
+ while (memory_ptr_list) {
+ if (memory_ptr_list->Entry) {
+ MUST_PASS(mm_free_ptr(memory_ptr_list->Entry));
}
- auto next = memory_heap_list->MemoryNext;
+ auto next = memory_ptr_list->Next;
- mm_delete_heap(memory_heap_list);
+ mm_free_ptr(memory_ptr_list);
- if (memory_heap_list->MemoryChild) sched_free_heap_tree(memory_heap_list->MemoryChild);
+ if (memory_ptr_list->Child) sched_free_ptr_tree(memory_ptr_list->Child);
- memory_heap_list = next;
+ memory_ptr_list = next;
}
}
@@ -273,14 +267,16 @@ Void USER_PROCESS::Exit(const Int32& exit_code) {
kLastExitCode = exit_code;
- auto memory_heap_list = this->HeapTree;
+ --this->ParentTeam->mProcessCount;
+
+ auto memory_ptr_list = this->HeapTree;
#ifdef __NE_VIRTUAL_MEMORY_SUPPORT__
- auto pd = kKernelCR3;
+ auto pd = kKernelVM;
hal_write_cr3(this->VMRegister);
#endif
- sched_free_heap_tree(memory_heap_list);
+ sched_free_ptr_tree(memory_ptr_list);
#ifdef __NE_VIRTUAL_MEMORY_SUPPORT__
hal_write_cr3(pd);
@@ -292,24 +288,19 @@ Void USER_PROCESS::Exit(const Int32& exit_code) {
#endif
//! Delete image if not done already.
- if (this->Image.fCode && mm_is_valid_heap(this->Image.fCode)) mm_delete_heap(this->Image.fCode);
+ if (this->Image.fCode && mm_is_valid_ptr(this->Image.fCode)) mm_free_ptr(this->Image.fCode);
//! Delete blob too.
- if (this->Image.fBlob && mm_is_valid_heap(this->Image.fBlob)) mm_delete_heap(this->Image.fBlob);
+ if (this->Image.fBlob && mm_is_valid_ptr(this->Image.fBlob)) mm_free_ptr(this->Image.fBlob);
//! Delete stack frame.
- if (this->StackFrame && mm_is_valid_heap(this->StackFrame))
- mm_delete_heap((VoidPtr) this->StackFrame);
-
- //! Delete stack reserve.
- if (this->StackReserve && mm_is_valid_heap(this->StackReserve))
- mm_delete_heap(reinterpret_cast<VoidPtr>(this->StackReserve));
+ if (this->StackFrame && mm_is_valid_ptr(this->StackFrame))
+ mm_free_ptr((VoidPtr) this->StackFrame);
//! Avoid use after free.
- this->Image.fBlob = nullptr;
- this->Image.fCode = nullptr;
- this->StackFrame = nullptr;
- this->StackReserve = nullptr;
+ this->Image.fBlob = nullptr;
+ this->Image.fCode = nullptr;
+ this->StackFrame = nullptr;
if (this->Kind == kExecutableDylibKind) {
Bool success = false;
@@ -330,6 +321,34 @@ Void USER_PROCESS::Exit(const Int32& exit_code) {
}
/***********************************************************************************/
+/// @brief Add dylib to process.
+/***********************************************************************************/
+
+Bool USER_PROCESS::SpawnDylib() {
+ // React according to process kind.
+ switch (this->Kind) {
+ case USER_PROCESS::kExecutableDylibKind: {
+ this->DylibDelegate = rtl_init_dylib_pef(*this);
+
+ if (!this->DylibDelegate) {
+ this->Crash();
+ return NO;
+ }
+
+ return YES;
+ }
+ case USER_PROCESS::kExecutableKind: {
+ return NO;
+ }
+ default: {
+ (Void)(kout << "Unknown process kind: " << hex_number(this->Kind) << kendl);
+ this->Crash();
+ return NO;
+ }
+ }
+}
+
+/***********************************************************************************/
/// @brief Add process to team.
/// @param process the process *Ref* class.
/// @return the process index inside the team.
@@ -366,18 +385,9 @@ ProcessID UserProcessScheduler::Spawn(const Char* name, VoidPtr code, VoidPtr im
rt_copy_memory(reinterpret_cast<VoidPtr>(const_cast<Char*>(name)), process.Name, len);
#ifdef __NE_VIRTUAL_MEMORY_SUPPORT__
- process.VMRegister = new PDE();
-
- if (!process.VMRegister) {
- process.Crash();
- return -kErrorProcessFault;
- }
-
- UInt32 flags = HAL::kMMFlagsPresent;
- flags |= HAL::kMMFlagsWr;
- flags |= HAL::kMMFlagsUser;
-
- HAL::mm_map_page((VoidPtr) process.VMRegister, process.VMRegister, flags);
+ process.VMRegister = kKernelVM;
+#else
+ process.VMRegister = 0UL;
#endif // ifdef __NE_VIRTUAL_MEMORY_SUPPORT__
process.StackFrame = new HAL::StackFrame();
@@ -389,52 +399,27 @@ ProcessID UserProcessScheduler::Spawn(const Char* name, VoidPtr code, VoidPtr im
rt_set_memory(process.StackFrame, 0, sizeof(HAL::StackFrame));
-#ifdef __NE_VIRTUAL_MEMORY_SUPPORT__
- flags = HAL::kMMFlagsPresent;
- flags |= HAL::kMMFlagsWr;
- flags |= HAL::kMMFlagsUser;
+ process.StackFrame->IP = reinterpret_cast<UIntPtr>(code);
+ process.StackFrame->SP = reinterpret_cast<UIntPtr>(&process.StackReserve[0] + process.StackSize);
- HAL::mm_map_page((VoidPtr) process.StackFrame, process.StackFrame, flags);
+#ifdef __NE_VIRTUAL_MEMORY_SUPPORT__
+ HAL::mm_map_page((VoidPtr) process.StackFrame->IP,
+ (VoidPtr) HAL::mm_get_page_addr((VoidPtr) process.StackFrame->IP),
+ HAL::kMMFlagsUser | HAL::kMMFlagsPresent);
+ HAL::mm_map_page((VoidPtr) process.StackFrame->SP,
+ (VoidPtr) HAL::mm_get_page_addr((VoidPtr) process.StackFrame->SP),
+ HAL::kMMFlagsUser | HAL::kMMFlagsPresent);
#endif // ifdef __NE_VIRTUAL_MEMORY_SUPPORT__
- // React according to process kind.
- switch (process.Kind) {
- case USER_PROCESS::kExecutableDylibKind: {
- process.DylibDelegate = rtl_init_dylib_pef(process);
- MUST_PASS(process.DylibDelegate);
- break;
- }
- case USER_PROCESS::kExecutableKind: {
- break;
- }
- default: {
- (Void)(kout << "Unknown process kind: " << hex_number(process.Kind) << kendl);
- break;
- }
- }
-
- process.StackReserve = new UInt8[process.StackSize];
-
- if (!process.StackReserve) {
- process.Crash();
- return -kErrorProcessFault;
- }
+ process.StackSize = kSchedMaxStackSz;
rt_set_memory(process.StackReserve, 0, process.StackSize);
-#ifdef __NE_VIRTUAL_MEMORY_SUPPORT__
- flags = HAL::kMMFlagsPresent;
- flags |= HAL::kMMFlagsWr;
- flags |= HAL::kMMFlagsUser;
-
- HAL::mm_map_page((VoidPtr) process.StackReserve, process.StackReserve, flags);
-#endif // ifdef __NE_VIRTUAL_MEMORY_SUPPORT__
-
process.ParentTeam = &mTeam;
process.ProcessId = pid;
- process.Status = ProcessStatusKind::kStarting;
- process.PTime = (UIntPtr) AffinityKind::kStandard;
+ process.Status = ProcessStatusKind::kRunning;
+ process.PTime = 0;
process.RTime = 0;
(Void)(kout << "PID: " << number(process.ProcessId) << kendl);
@@ -448,6 +433,7 @@ ProcessID UserProcessScheduler::Spawn(const Char* name, VoidPtr code, VoidPtr im
/***********************************************************************************/
UserProcessScheduler& UserProcessScheduler::The() {
+ STATIC UserProcessScheduler kScheduler;
return kScheduler;
}
@@ -501,10 +487,6 @@ SizeT UserProcessScheduler::Run() noexcept {
return 0UL;
}
- if (kCurrentlySwitching) return 0UL;
-
- kCurrentlySwitching = Yes;
-
SizeT process_index = 0UL; //! we store this guy to tell the scheduler how many
//! things we have scheduled.
@@ -513,65 +495,42 @@ SizeT UserProcessScheduler::Run() noexcept {
//! Check if the process needs to be run.
if (UserProcessHelper::CanBeScheduled(process)) {
- if (process.StackSize > kSchedMaxStackSz) {
- kout << "The process: " << process.Name << ", has not a valid stack size! Crashing it...\r";
- process.Crash();
- continue;
- }
+ kout << process.Name << " will be run...\r";
- // Set current process header.
- this->CurrentProcess() = process;
+ //! Increase the usage time of the process.
+ if (process.UTime < process.PTime) {
+ ++process.UTime;
+ }
- process.PTime = static_cast<Int32>(process.Affinity);
+ this->TheCurrentProcess() = process;
- // tell helper to find a core to schedule on.
- BOOL ret = UserProcessHelper::Switch(process.Image.Leak().Leak().Leak(),
- &process.StackReserve[process.StackSize - 1],
- process.StackFrame, process.ProcessId);
+ if (UserProcessHelper::Switch(process.StackFrame, process.ProcessId)) {
+ process.PTime = static_cast<Int32>(process.Affinity);
- if (!ret) {
- kout << "The process: " << process.Name << ", is not valid! Crashing it...\r";
- process.Crash();
- }
- } else {
- if (process.ProcessId == this->CurrentProcess().Leak().ProcessId) {
- if (process.PTime < process.RTime) {
- if (process.RTime < (Int32) AffinityKind::kRealTime)
- process.PTime = (Int32) AffinityKind::kVeryLowUsage;
- else if (process.RTime < (Int32) AffinityKind::kVeryHigh)
- process.PTime = (Int32) AffinityKind::kLowUsage;
+ if (process.PTime < process.RTime && AffinityKind::kRealTime != process.Affinity) {
+ if (process.RTime < (Int32) AffinityKind::kVeryHigh)
+ process.RTime = (Int32) AffinityKind::kLowUsage / 2;
else if (process.RTime < (Int32) AffinityKind::kHigh)
- process.PTime = (Int32) AffinityKind::kStandard;
+ process.RTime = (Int32) AffinityKind::kStandard / 3;
else if (process.RTime < (Int32) AffinityKind::kStandard)
- process.PTime = (Int32) AffinityKind::kHigh;
-
- process.RTime = static_cast<Int32>(process.Affinity);
+ process.RTime = (Int32) AffinityKind::kHigh / 4;
- BOOL ret = UserProcessHelper::Switch(process.Image.Leak().Leak().Leak(),
- &process.StackReserve[process.StackSize - 1],
- process.StackFrame, process.ProcessId);
-
- if (!ret) {
- kout << "The process: " << process.Name << ", is not valid! Crashing it...\r";
- process.Crash();
- }
- } else {
- ++process.RTime;
+ process.PTime -= process.RTime;
+ process.RTime = 0UL;
}
}
-
+ } else {
+ ++process.RTime;
--process.PTime;
}
}
- kCurrentlySwitching = No;
-
return process_index;
}
/// @brief Gets the current scheduled team.
/// @return
-UserProcessTeam& UserProcessScheduler::CurrentTeam() {
+UserProcessTeam& UserProcessScheduler::TheCurrentTeam() {
return mTeam;
}
@@ -585,26 +544,24 @@ UserProcessTeam& UserProcessScheduler::CurrentTeam() {
BOOL UserProcessScheduler::SwitchTeam(UserProcessTeam& team) {
if (team.AsArray().Count() < 1) return No;
- if (kCurrentlySwitching) return No;
-
- kScheduler.mTeam = team;
+ this->mTeam = team;
return Yes;
}
/// @brief Gets current running process.
/// @return
-Ref<USER_PROCESS>& UserProcessScheduler::CurrentProcess() {
+Ref<USER_PROCESS>& UserProcessScheduler::TheCurrentProcess() {
return mTeam.AsRef();
}
/// @brief Current proccess id getter.
/// @return USER_PROCESS ID integer.
ErrorOr<PID> UserProcessHelper::TheCurrentPID() {
- if (!kScheduler.CurrentProcess()) return ErrorOr<PID>{-kErrorProcessFault};
+ if (!UserProcessScheduler::The().TheCurrentProcess()) return ErrorOr<PID>{-kErrorProcessFault};
kout << "UserProcessHelper::TheCurrentPID: Leaking ProcessId...\r";
- return ErrorOr<PID>{kScheduler.CurrentProcess().Leak().ProcessId};
+ return ErrorOr<PID>{UserProcessScheduler::The().TheCurrentProcess().Leak().ProcessId};
}
/// @brief Check if process can be schedulded.
@@ -612,32 +569,28 @@ ErrorOr<PID> UserProcessHelper::TheCurrentPID() {
/// @retval true can be schedulded.
/// @retval false cannot be schedulded.
Bool UserProcessHelper::CanBeScheduled(const USER_PROCESS& process) {
- if (process.Status == ProcessStatusKind::kKilled ||
- process.Status == ProcessStatusKind::kFinished ||
- process.Status == ProcessStatusKind::kStarting ||
- process.Status == ProcessStatusKind::kFrozen)
- return No;
-
- if (process.Status == ProcessStatusKind::kInvalid) return No;
-
- if (!process.Image.HasCode()) return No;
-
+ if (process.Status != ProcessStatusKind::kRunning) return No;
+ if (process.StackSize > kSchedMaxStackSz) return No;
if (!process.Name[0]) return No;
// real time processes shouldn't wait that much.
if (process.Affinity == AffinityKind::kRealTime) return Yes;
+ if (process.Signal.SignalID == SIGTRAP) {
+ return No;
+ }
+
return process.PTime < 1;
}
/***********************************************************************************/
/**
- * @brief Start scheduling current AP.
+ * @brief Start scheduling the current team.
*/
/***********************************************************************************/
SizeT UserProcessHelper::StartScheduling() {
- return kScheduler.Run();
+ return UserProcessScheduler::The().Run();
}
/***********************************************************************************/
@@ -648,41 +601,35 @@ SizeT UserProcessHelper::StartScheduling() {
*/
/***********************************************************************************/
-Bool UserProcessHelper::Switch(VoidPtr image, UInt8* stack, HAL::StackFramePtr frame_ptr,
- PID new_pid) {
+Bool UserProcessHelper::Switch(HAL::StackFramePtr frame_ptr, PID new_pid) {
+ (Void)(kout << "IP: " << hex_number(frame_ptr->IP) << kendl);
+
for (SizeT index = 0UL; index < HardwareThreadScheduler::The().Capacity(); ++index) {
+ if (!HardwareThreadScheduler::The()[index].Leak()) continue;
+
if (HardwareThreadScheduler::The()[index].Leak()->Kind() == kAPInvalid ||
HardwareThreadScheduler::The()[index].Leak()->Kind() == kAPBoot)
continue;
- // A fallback is a special core for real-time tasks which needs immediate execution.
- if (HardwareThreadScheduler::The()[index].Leak()->Kind() == kAPRealTime) {
- if (UserProcessScheduler::The().CurrentTeam().AsArray()[new_pid].Affinity !=
- AffinityKind::kRealTime)
- continue;
-
- if (HardwareThreadScheduler::The()[index].Leak()->Switch(image, stack, frame_ptr, new_pid)) {
- HardwareThreadScheduler::The()[index].Leak()->fPTime =
- UserProcessScheduler::The().CurrentTeam().AsArray()[new_pid].PTime;
+ (Void)(kout << "AP_" << hex_number(index) << kendl);
- UserProcessHelper::TheCurrentPID().Leak().Leak() = UserProcessHelper::TheCurrentPID();
-
- return YES;
- }
+ if (HardwareThreadScheduler::The()[index].Leak()->IsBusy()) {
+ (Void)(kout << "AP_" << hex_number(index));
+ kout << " is busy\r";
continue;
}
- if (UserProcessScheduler::The().CurrentTeam().AsArray()[new_pid].Affinity ==
- AffinityKind::kRealTime)
- continue;
+ (Void)(kout << "AP_" << hex_number(index));
+ kout << " is now trying to run a new task!\r";
////////////////////////////////////////////////////////////
/// Prepare task switch. ///
////////////////////////////////////////////////////////////
- Bool ret =
- HardwareThreadScheduler::The()[index].Leak()->Switch(image, stack, frame_ptr, new_pid);
+ HardwareThreadScheduler::The()[index].Leak()->Busy(YES);
+
+ Bool ret = HardwareThreadScheduler::The()[index].Leak()->Switch(frame_ptr);
////////////////////////////////////////////////////////////
/// Rollback on fail. ///
@@ -693,26 +640,40 @@ Bool UserProcessHelper::Switch(VoidPtr image, UInt8* stack, HAL::StackFramePtr f
UserProcessHelper::TheCurrentPID().Leak().Leak() = new_pid;
HardwareThreadScheduler::The()[index].Leak()->fPTime =
- UserProcessScheduler::The().CurrentTeam().AsArray()[new_pid].PTime;
- HardwareThreadScheduler::The()[index].Leak()->Wake(YES);
+ UserProcessScheduler::The().TheCurrentTeam().AsArray()[new_pid].PTime;
+
+ (Void)(kout << "AP_" << hex_number(index));
+ kout << " is now running a new task!\r";
- return Yes;
+ return YES;
}
- return No;
+ kout << "Couldn't find a suitable core for the current process!\r";
+
+ return NO;
}
////////////////////////////////////////////////////////////
/// @brief this checks if any process is on the team.
////////////////////////////////////////////////////////////
UserProcessScheduler::operator bool() {
- return mTeam.AsArray().Count() > 0;
+ for (auto process_index = 0UL; process_index < mTeam.AsArray().Count(); ++process_index) {
+ auto& process = mTeam.AsArray()[process_index];
+ if (UserProcessHelper::CanBeScheduled(process)) return true;
+ }
+
+ return false;
}
////////////////////////////////////////////////////////////
/// @brief this checks if no process is on the team.
////////////////////////////////////////////////////////////
Bool UserProcessScheduler::operator!() {
- return mTeam.AsArray().Count() == 0;
+ for (auto process_index = 0UL; process_index < mTeam.AsArray().Count(); ++process_index) {
+ auto& process = mTeam.AsArray()[process_index];
+ if (UserProcessHelper::CanBeScheduled(process)) return false;
+ }
+
+ return true;
}
} // namespace Kernel
diff --git a/dev/kernel/src/UserProcessTeam.cc b/dev/kernel/src/UserProcessTeam.cc
index 7acbcf8d..8ef9a013 100644
--- a/dev/kernel/src/UserProcessTeam.cc
+++ b/dev/kernel/src/UserProcessTeam.cc
@@ -14,9 +14,11 @@
namespace Kernel {
UserProcessTeam::UserProcessTeam() {
for (SizeT i = 0U; i < this->mProcessList.Count(); ++i) {
- this->mProcessList[i] = USER_PROCESS();
- this->mProcessList[i].PTime = 0;
- this->mProcessList[i].Status = ProcessStatusKind::kKilled;
+ this->mProcessList[i] = USER_PROCESS();
+ this->mProcessList[i].PTime = 0;
+ this->mProcessList[i].RTime = 0;
+ this->mProcessList[i].Status = ProcessStatusKind::kKilled;
+ this->mProcessList[i].ParentTeam = this;
}
this->mProcessCount = 0UL;
diff --git a/dev/kernel/src/UtfUtils.cc b/dev/kernel/src/UtfUtils.cc
index 11d7471a..ae17aed7 100644
--- a/dev/kernel/src/UtfUtils.cc
+++ b/dev/kernel/src/UtfUtils.cc
@@ -4,7 +4,7 @@
------------------------------------------- */
-#include <NewKit/Utils.h>
+#include <NeKit/Utils.h>
namespace Kernel {
Size urt_string_len(const Utf8Char* str) {
@@ -25,7 +25,17 @@ Void urt_set_memory(const voidPtr src, UInt32 dst, Size len) {
}
}
-Int urt_copy_memory(const voidPtr src, voidPtr dst, Size len) {
+Int32 rt_string_cmp(const Utf8Char* src, const Utf8Char* cmp, Size size) {
+ Int32 counter = 0;
+
+ for (Size index = 0; index < size; ++index) {
+ if (src[index] != cmp[index]) ++counter;
+ }
+
+ return counter;
+}
+
+Int urt_copy_memory(const VoidPtr src, VoidPtr dst, Size len) {
Utf8Char* srcChr = reinterpret_cast<Utf8Char*>(src);
Utf8Char* dstChar = reinterpret_cast<Utf8Char*>(dst);
diff --git a/dev/kernel/src/Utils.cc b/dev/kernel/src/Utils.cc
index 4f47849b..d7cc08af 100644
--- a/dev/kernel/src/Utils.cc
+++ b/dev/kernel/src/Utils.cc
@@ -4,7 +4,7 @@
------------------------------------------- */
-#include <NewKit/Utils.h>
+#include <NeKit/Utils.h>
namespace Kernel {
Int32 rt_string_cmp(const Char* src, const Char* cmp, Size size) {
diff --git a/dev/kernel/src/Variant.cc b/dev/kernel/src/Variant.cc
index 5dd39926..51e5f5b8 100644
--- a/dev/kernel/src/Variant.cc
+++ b/dev/kernel/src/Variant.cc
@@ -4,7 +4,7 @@
------------------------------------------- */
-#include <NewKit/Variant.h>
+#include <NeKit/Variant.h>
namespace Kernel {
const Char* Variant::ToString() {