From 2187ed0f67e21c6425b8770ff52ca02269a21a9d Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Wed, 26 Nov 2025 00:08:26 -0500 Subject: kernel: a long set of kernel patches. Signed-off-by: Amlal El Mahrouss --- src/kernel/KernelKit/TraceSrv.h | 1 + src/kernel/KernelKit/UserProcessScheduler.inl | 16 ++++----- src/kernel/KernelKit/ZXD.h | 8 +++-- src/kernel/StorageKit/SCSI.h | 21 +++++++++++- src/kernel/src/Storage/AHCIDeviceInterface.cc | 2 +- src/kernel/src/Storage/NVMEDeviceInterface.cc | 11 +++++- src/kernel/src/Storage/SCSIDeviceInterface.cc | 15 ++++++++- src/libDDK/DriverKit/c++/checksum.h | 10 ++++++ src/libDDK/DriverKit/c++/contract.h | 48 --------------------------- src/libDDK/DriverKit/c++/ddk.h | 13 ++++++++ src/libDDK/DriverKit/c++/driver_base.h | 48 +++++++++++++++++++++++++++ src/libDDK/DriverKit/dev.h | 3 ++ 12 files changed, 131 insertions(+), 65 deletions(-) create mode 100644 src/libDDK/DriverKit/c++/checksum.h delete mode 100644 src/libDDK/DriverKit/c++/contract.h create mode 100644 src/libDDK/DriverKit/c++/ddk.h create mode 100644 src/libDDK/DriverKit/c++/driver_base.h (limited to 'src') diff --git a/src/kernel/KernelKit/TraceSrv.h b/src/kernel/KernelKit/TraceSrv.h index df188ea2..4af5e2ae 100644 --- a/src/kernel/KernelKit/TraceSrv.h +++ b/src/kernel/KernelKit/TraceSrv.h @@ -17,6 +17,7 @@ namespace Detail { inline constexpr auto kDebugVersion = 0x0100; inline constexpr auto kDebugDelim = ';'; inline constexpr auto kDebugEnd = '\r'; + typedef UInt64 dk_socket_type; } // namespace Detail } // namespace Kernel \ No newline at end of file diff --git a/src/kernel/KernelKit/UserProcessScheduler.inl b/src/kernel/KernelKit/UserProcessScheduler.inl index 3d3659d6..e8a57212 100644 --- a/src/kernel/KernelKit/UserProcessScheduler.inl +++ b/src/kernel/KernelKit/UserProcessScheduler.inl @@ -7,7 +7,7 @@ ======================================== */ -/// @brief USER_PROCESS inline definitions. +/// @brief UPS inline definitions. /// @author Amlal El Mahrouss (amlal@nekernel.org) /// @date Tue Apr 22 22:01:07 CEST 2025 @@ -25,7 +25,7 @@ BOOL USER_PROCESS::Delete(ErrorOr ptr) { if (!ptr) return No; if (!this->HeapTree) { - kout << "USER_PROCESS's heap is empty.\r"; + kout << "USER_PROCESS: Heap is empty.\r"; return No; } @@ -36,20 +36,16 @@ BOOL USER_PROCESS::Delete(ErrorOr ptr) { this->UsedMemory -= entry->EntrySize; #ifdef __NE_AMD64__ - auto pd = hal_read_cr3(); + auto page_dir = hal_read_cr3(); hal_write_cr3(this->VMRegister); - auto ret = mm_free_ptr(entry->Entry); - - hal_write_cr3(pd); - - return ret == kErrorSuccess; + hal_write_cr3(page_dir); #else - Bool ret = mm_free_ptr(ptr.Leak().Leak()); + auto ret = mm_free_ptr(ptr.Leak().Leak()); +#endif return ret == kErrorSuccess; -#endif } entry = entry->Next; diff --git a/src/kernel/KernelKit/ZXD.h b/src/kernel/KernelKit/ZXD.h index a4b07bfa..81df0ade 100644 --- a/src/kernel/KernelKit/ZXD.h +++ b/src/kernel/KernelKit/ZXD.h @@ -16,9 +16,11 @@ struct ZXD_EXEC_HEADER; struct ZXD_STUB_HEADER; enum ZXD_FLAGS { - kZXDFlagsInvalid, - kZXDFlagsDriver, - kZXDFlagsCount, + kZXDFlagsInvalid = 0, + kZXDFlagsDriver = 120, + kZXDFlagsBoot, + kZXDFlagsKernel, + kZXDFlagsCount = kZXDFlagsKernel - kZXDFlagsDriver + 1, }; /// @brief ZXD executable header diff --git a/src/kernel/StorageKit/SCSI.h b/src/kernel/StorageKit/SCSI.h index 4dad00ad..12eb52d3 100644 --- a/src/kernel/StorageKit/SCSI.h +++ b/src/kernel/StorageKit/SCSI.h @@ -7,5 +7,24 @@ #pragma once #include +#include +#include -namespace Kernel {} // namespace Kernel \ No newline at end of file +namespace Kernel { +class SCSIDeviceInterface final NE_DEVICE { + public: + explicit SCSIDeviceInterface(Void (*out)(DeviceInterface*, IMountpoint* out_packet), + Void (*in)(DeviceInterface*, IMountpoint* in_packet), + Void (*cleanup)(Void)); + + ~SCSIDeviceInterface() override; + + public: + NE_COPY_DEFAULT(SCSIDeviceInterface) + + const Char* Name() const override; + + private: + Void (*fCleanup)(Void) = {nullptr}; +}; +} // namespace Kernel diff --git a/src/kernel/src/Storage/AHCIDeviceInterface.cc b/src/kernel/src/Storage/AHCIDeviceInterface.cc index 02b39fb5..4faad175 100644 --- a/src/kernel/src/Storage/AHCIDeviceInterface.cc +++ b/src/kernel/src/Storage/AHCIDeviceInterface.cc @@ -55,7 +55,7 @@ AHCIDeviceInterface& AHCIDeviceInterface::operator>>(IMountpoint* mnt) { for (SizeT driveCount = 0; driveCount < kDriveMaxCount; ++driveCount) { auto interface = mnt->GetAddressOf(driveCount); - // really check if it's ATA. + // really check if it's AHCI. if ((interface) && rt_string_cmp((interface)->fProtocol(), "AHCI", rt_string_len("AHCI")) == 0) { continue; diff --git a/src/kernel/src/Storage/NVMEDeviceInterface.cc b/src/kernel/src/Storage/NVMEDeviceInterface.cc index f05d384e..12d9e363 100644 --- a/src/kernel/src/Storage/NVMEDeviceInterface.cc +++ b/src/kernel/src/Storage/NVMEDeviceInterface.cc @@ -17,6 +17,15 @@ NVMEDeviceInterface::~NVMEDeviceInterface() { } const Char* NVMEDeviceInterface::Name() const { - return ("/devices/nvme{}"); + return ("/devices/nvm{}"); +} + +OwnPtr NVMEDeviceInterface::operator()(UInt32 dma_low, UInt32 dma_high, + SizeT dma_sz) { + NE_UNUSED(dma_low); + NE_UNUSED(dma_high); + NE_UNUSED(dma_sz); + + return {}; } } // namespace Kernel diff --git a/src/kernel/src/Storage/SCSIDeviceInterface.cc b/src/kernel/src/Storage/SCSIDeviceInterface.cc index 2e331ae9..921e660a 100644 --- a/src/kernel/src/Storage/SCSIDeviceInterface.cc +++ b/src/kernel/src/Storage/SCSIDeviceInterface.cc @@ -6,4 +6,17 @@ #include -using namespace Kernel; +namespace Kernel { +SCSIDeviceInterface::SCSIDeviceInterface(void (*out)(DeviceInterface*, IMountpoint* outpacket), + void (*in)(DeviceInterface*, IMountpoint* inpacket), + void (*cleanup)(void)) + : DeviceInterface(out, in), fCleanup(cleanup) {} + +SCSIDeviceInterface::~SCSIDeviceInterface() { + if (fCleanup) fCleanup(); +} + +const Char* SCSIDeviceInterface::Name() const { + return ("/devices/sda{}"); +} +} // namespace Kernel diff --git a/src/libDDK/DriverKit/c++/checksum.h b/src/libDDK/DriverKit/c++/checksum.h new file mode 100644 index 00000000..0aa206be --- /dev/null +++ b/src/libDDK/DriverKit/c++/checksum.h @@ -0,0 +1,10 @@ +/* ======================================== + + Copyright Amlal El Mahrouss 2025, licensed under the Apache 2.0 license. + + FILE: checksum.h + PURPOSE: Object DDK checksums. + + ======================================== */ + +#pragma once \ No newline at end of file diff --git a/src/libDDK/DriverKit/c++/contract.h b/src/libDDK/DriverKit/c++/contract.h deleted file mode 100644 index e341f1a0..00000000 --- a/src/libDDK/DriverKit/c++/contract.h +++ /dev/null @@ -1,48 +0,0 @@ -/* ======================================== - - Copyright Amlal El Mahrouss 2025, licensed under the Apache 2.0 license. - - FILE: ddk.h - PURPOSE: Driver Kernel Interface Model base header. - - ======================================== */ - -#pragma once - -#include -#include - -#define DKI_DRIVER_IMPL \ - final: \ - public \ - ::Kernel::DDK::IDriverBase - -/// @author Amlal El Mahrouss - -namespace Kernel::DDK { -class IDriverBase { - public: - explicit IDriverBase() = default; - virtual ~IDriverBase() = default; - - NE_COPY_DEFAULT(IDriverBase); - - using PtrType = VoidPtr; - - virtual BOOL IsCastable() { return NO; } - virtual constexpr BOOL IsActive() { return NO; } - virtual PtrType Leak() { return nullptr; } - virtual constexpr Int32 Type() { return 0; } -}; - -/// @brief This concept requires the Driver to be IDriverBase compliant. -template -concept IsValidDriver = requires(T a) { - { a.IsActive() && a.Type() > 0 }; -}; - -/// @note This helper is consteval only. -template -inline consteval void ce_ddk_is_valid(T) {} - -} // namespace Kernel::DDK diff --git a/src/libDDK/DriverKit/c++/ddk.h b/src/libDDK/DriverKit/c++/ddk.h new file mode 100644 index 00000000..2c83f935 --- /dev/null +++ b/src/libDDK/DriverKit/c++/ddk.h @@ -0,0 +1,13 @@ +/* ======================================== + + Copyright Amlal El Mahrouss 2025, licensed under the Apache 2.0 license. + + FILE: ddk.h + PURPOSE: Object DDK header. + + ======================================== */ + +#pragma once + +#include +#include diff --git a/src/libDDK/DriverKit/c++/driver_base.h b/src/libDDK/DriverKit/c++/driver_base.h new file mode 100644 index 00000000..89cc04d8 --- /dev/null +++ b/src/libDDK/DriverKit/c++/driver_base.h @@ -0,0 +1,48 @@ +/* ======================================== + + Copyright Amlal El Mahrouss 2025, licensed under the Apache 2.0 license. + + FILE: driver_base.h + PURPOSE: IDriverBase and friends. + + ======================================== */ + +#pragma once + +#include +#include + +#define DKI_DRIVER_IMPL \ + final: \ + public \ + ::Kernel::DDK::IDriverBase + +/// @author Amlal El Mahrouss + +namespace Kernel::DDK { +class IDriverBase { + public: + explicit IDriverBase() = default; + virtual ~IDriverBase() = default; + + NE_COPY_DEFAULT(IDriverBase); + + using PtrType = VoidPtr; + + virtual BOOL IsCastable() { return NO; } + virtual constexpr BOOL IsActive() { return NO; } + virtual PtrType Leak() { return nullptr; } + virtual constexpr Int32 Type() { return 0; } +}; + +/// @brief This concept requires the Driver to be IDriverBase compliant. +template +concept IsValidDriver = requires(T a) { + { a.IsActive() && a.Type() > 0 }; +}; + +/// @brief Consteval helper to detect whether a template is truly based on IDriverBase. +/// @note This helper is consteval only. +template +inline consteval void ce_ddk_is_valid(T) {} +} // namespace Kernel::DDK diff --git a/src/libDDK/DriverKit/dev.h b/src/libDDK/DriverKit/dev.h index a88a00dd..1dda544e 100644 --- a/src/libDDK/DriverKit/dev.h +++ b/src/libDDK/DriverKit/dev.h @@ -27,6 +27,9 @@ typedef struct _DDK_DEVICE DDK_FINAL { size_t (*d_tell)(struct _DDK_DEVICE* dev); } DDK_DEVICE, *DDK_DEVICE_PTR; +#define kopen kopen_dev +#define kclose kclose_dev + /// @brief Open a new device from path. /// @param path the device's path. DDK_EXTERN DDK_DEVICE_PTR kopen_dev(const char* path); -- cgit v1.2.3