summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal@nekernel.org>2025-11-26 00:11:43 -0500
committerGitHub <noreply@github.com>2025-11-26 00:11:43 -0500
commit286c9c16a42399716b4ecaa7cab902e5434fa0a6 (patch)
tree5e82555fd3c5bf1e0484e9c6149c192b19708023
parent1dc16c306587b4d6410adfcd4dca8f7ba13df78f (diff)
parent2187ed0f67e21c6425b8770ff52ca02269a21a9d (diff)
Merge pull request #83 from nekernel-org/dev
Hotpatches.
-rw-r--r--src/kernel/KernelKit/TraceSrv.h1
-rw-r--r--src/kernel/KernelKit/UserProcessScheduler.inl16
-rw-r--r--src/kernel/KernelKit/ZXD.h8
-rw-r--r--src/kernel/StorageKit/SCSI.h21
-rw-r--r--src/kernel/src/Storage/AHCIDeviceInterface.cc2
-rw-r--r--src/kernel/src/Storage/NVMEDeviceInterface.cc11
-rw-r--r--src/kernel/src/Storage/SCSIDeviceInterface.cc15
-rw-r--r--src/libDDK/DriverKit/c++/checksum.h10
-rw-r--r--src/libDDK/DriverKit/c++/ddk.h13
-rw-r--r--src/libDDK/DriverKit/c++/driver_base.h48
-rw-r--r--src/libDDK/DriverKit/dev.h3
-rw-r--r--src/libDDK/DriverKit/dki/contract.h34
12 files changed, 131 insertions, 51 deletions
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<T*> 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<T*> 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 <modules/SCSI/SCSI.h>
+#include <KernelKit/DriveMgr.h>
+#include <NeKit/OwnPtr.h>
-namespace Kernel {} // namespace Kernel \ No newline at end of file
+namespace Kernel {
+class SCSIDeviceInterface final NE_DEVICE<IMountpoint*> {
+ 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<IMountpoint*> 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 <StorageKit/SCSI.h>
-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++/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 <DriverKit/c++/driver_base.h>
+#include <DriverKit/c++/checksum.h>
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 <CompilerKit/CompilerKit.h>
+#include <libDDK/DriverKit/macros.h>
+
+#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 <typename T>
+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<IsValidDriver T>
+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);
diff --git a/src/libDDK/DriverKit/dki/contract.h b/src/libDDK/DriverKit/dki/contract.h
deleted file mode 100644
index 7361d792..00000000
--- a/src/libDDK/DriverKit/dki/contract.h
+++ /dev/null
@@ -1,34 +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 <CompilerKit/CompilerKit.h>
-#include <libDDK/DriverKit/macros.h>
-
-#define DKI_CONTRACT_IMPL final : public ::Kernel::DKI::DKIContract
-
-/// @author Amlal El Mahrouss
-
-namespace Kernel::DKI {
-class DKIContract {
- public:
- explicit DKIContract() = default;
- virtual ~DKIContract() = default;
-
- NE_COPY_DEFAULT(DKIContract);
-
- using PtrType = VoidPtr;
-
- virtual BOOL IsCastable() { return NO; }
- virtual BOOL IsActive() { return NO; }
- virtual VoidPtr Leak() { return nullptr; }
- virtual Int32 Type() { return 0; }
-};
-} // namespace Kernel::DKI