summaryrefslogtreecommitdiffhomepage
path: root/dev
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal@nekernel.org>2025-09-09 21:28:04 +0200
committerAmlal El Mahrouss <amlal@nekernel.org>2025-09-09 21:28:04 +0200
commitb1e3dac861c0d6c28bdb7768d7f96f19456e9ad0 (patch)
tree7868c5e081e86f72ec0203f3c8b1ed4bcb9b1598 /dev
parent42832ec1b72baf244a1290ccf747b79db0caa69f (diff)
feat:! ddk/dki, ne_launch, ifs: Big architectural changes and
improvements. Signed-off-by: Amlal El Mahrouss <amlal@nekernel.org>
Diffstat (limited to 'dev')
-rw-r--r--dev/kernel/FSKit/Ext2+IFS.h (renamed from dev/kernel/FSKit/Ext2IFS.h)37
-rw-r--r--dev/kernel/HALKit/AMD64/HalKernelMain.cc2
-rw-r--r--dev/kernel/HALKit/ARM64/HalKernelMain.cc2
-rw-r--r--dev/kernel/src/FS/Ext2+FileSystemParser.cc2
-rw-r--r--dev/launch/LaunchKit/LaunchKit.h2
-rw-r--r--dev/launch/ne_launch.json2
-rw-r--r--dev/launch/src/CRT0.S17
-rw-r--r--dev/launch/src/LaunchSrv.cc5
-rw-r--r--dev/libDDK/DriverKit/cpp/object.hpp16
-rw-r--r--dev/libDDK/DriverKit/dki/contract.h32
-rw-r--r--dev/libSystem/src/System.cc15
11 files changed, 91 insertions, 41 deletions
diff --git a/dev/kernel/FSKit/Ext2IFS.h b/dev/kernel/FSKit/Ext2+IFS.h
index 2550cfea..d73ae43c 100644
--- a/dev/kernel/FSKit/Ext2IFS.h
+++ b/dev/kernel/FSKit/Ext2+IFS.h
@@ -8,33 +8,32 @@
#include <NeKit/KernelPanic.h>
#include <NeKit/Utils.h>
-namespace Ext2 {
-
+namespace Kernel::Ext2 {
/// @brief Context for an EXT2 filesystem on a given drive
-struct Context {
+struct Ext2Context {
Kernel::DriveTrait* drive{nullptr};
EXT2_SUPER_BLOCK* superblock{nullptr};
/// @brief context with a drive
- explicit Context(Kernel::DriveTrait* drv) : drive(drv) {}
+ Ext2Context(Kernel::DriveTrait* drv) : drive(drv) {}
/// @brief Clean up
- ~Context() {
+ ~Ext2Context() {
if (superblock) {
Kernel::mm_free_ptr(superblock);
superblock = nullptr;
}
}
- Context(const Context&) = delete;
- Context& operator=(const Context&) = delete;
+ Ext2Context(const Ext2Context&) = delete;
+ Ext2Context& operator=(const Ext2Context&) = delete;
- Context(Context&& other) noexcept : drive(other.drive), superblock(other.superblock) {
+ Ext2Context(Ext2Context&& other) noexcept : drive(other.drive), superblock(other.superblock) {
other.drive = nullptr;
other.superblock = nullptr;
}
- Context& operator=(Context&& other) noexcept {
+ Ext2Context& operator=(Ext2Context&& other) noexcept {
if (this != &other) {
if (superblock) {
Kernel::mm_free_ptr(superblock);
@@ -47,12 +46,18 @@ struct Context {
return *this;
}
- inline Kernel::UInt32 BlockSize() const {
+ Kernel::SizeT LeakBlockSize() const {
if (!superblock) return kExt2FSBlockSizeBase;
return kExt2FSBlockSizeBase << superblock->fLogBlockSize;
}
+
+ BOOL operator bool() { return superblock != nullptr; }
};
+/// ======================================================================= ///
+/// IFS FUNCTIONS
+/// ======================================================================= ///
+
inline bool ext2_read_block(Kernel::DriveTrait* drv, Kernel::UInt32 lba, void* buffer,
Kernel::UInt32 size) {
if (!drv || !buffer) return false;
@@ -62,6 +67,7 @@ inline bool ext2_read_block(Kernel::DriveTrait* drv, Kernel::UInt32 lba, void* b
pkt.fPacketSize = size;
pkt.fPacketLba = lba;
drv->fInput(pkt);
+
return pkt.fPacketGood;
}
@@ -77,14 +83,14 @@ inline bool ext2_write_block(Kernel::DriveTrait* drv, Kernel::UInt32 lba, const
return pkt.fPacketGood;
}
-// Load superblock
-inline Kernel::ErrorOr<EXT2_SUPER_BLOCK*> ext2_load_superblock(Context* ctx) {
+inline Kernel::ErrorOr<EXT2_SUPER_BLOCK*> ext2_load_superblock(Ext2Context* ctx) {
if (!ctx || !ctx->drive) return Kernel::ErrorOr<EXT2_SUPER_BLOCK*>(Kernel::kErrorInvalidData);
auto buf = Kernel::mm_alloc_ptr(sizeof(EXT2_SUPER_BLOCK), true, false);
if (!buf) return Kernel::ErrorOr<EXT2_SUPER_BLOCK*>(Kernel::kErrorHeapOutOfMemory);
Kernel::UInt32 blockLba = kExt2FSSuperblockOffset / ctx->drive->fSectorSz;
+
if (!ext2_read_block(ctx->drive, blockLba, buf, sizeof(EXT2_SUPER_BLOCK))) {
Kernel::mm_free_ptr(buf);
return Kernel::ErrorOr<EXT2_SUPER_BLOCK*>(Kernel::kErrorDisk);
@@ -101,7 +107,7 @@ inline Kernel::ErrorOr<EXT2_SUPER_BLOCK*> ext2_load_superblock(Context* ctx) {
}
// Load inode
-inline Kernel::ErrorOr<Ext2Node*> ext2_load_inode(Context* ctx, Kernel::UInt32 inodeNumber) {
+inline Kernel::ErrorOr<Ext2Node*> ext2_load_inode(Ext2Context* ctx, Kernel::UInt32 inodeNumber) {
if (!ctx || !ctx->superblock) return Kernel::ErrorOr<Ext2Node*>(Kernel::kErrorInvalidData);
auto nodePtr = Kernel::mm_alloc_ptr(sizeof(Ext2Node), true, false);
@@ -127,9 +133,8 @@ inline Kernel::ErrorOr<Ext2Node*> ext2_load_inode(Context* ctx, Kernel::UInt32 i
return Kernel::ErrorOr<Ext2Node*>(ext2Node);
}
-inline Kernel::UInt32 inode_offset(const Context* ctx, Kernel::UInt32 inodeNumber) {
+inline Kernel::UInt32 inode_offset(const Ext2Context* ctx, Kernel::UInt32 inodeNumber) {
if (!ctx || !ctx->superblock) return 0;
return ((inodeNumber - 1) % ctx->superblock->fInodesPerGroup) * ctx->superblock->fInodeSize;
}
-
-} // namespace Ext2
+} // namespace Kernel::Ext2
diff --git a/dev/kernel/HALKit/AMD64/HalKernelMain.cc b/dev/kernel/HALKit/AMD64/HalKernelMain.cc
index 16670f5c..6f4d7e0a 100644
--- a/dev/kernel/HALKit/AMD64/HalKernelMain.cc
+++ b/dev/kernel/HALKit/AMD64/HalKernelMain.cc
@@ -119,7 +119,7 @@ EXTERN_C Int32 hal_init_platform(Kernel::HEL::BootInfoHeader* handover_hdr) {
kGDTArray[4].fBaseHigh = 0;
FB::fb_clear_video();
-
+
// Load memory descriptors.
HAL::Register64 gdt_reg;
diff --git a/dev/kernel/HALKit/ARM64/HalKernelMain.cc b/dev/kernel/HALKit/ARM64/HalKernelMain.cc
index 240b3ac8..b711b833 100644
--- a/dev/kernel/HALKit/ARM64/HalKernelMain.cc
+++ b/dev/kernel/HALKit/ARM64/HalKernelMain.cc
@@ -48,7 +48,7 @@ EXTERN_C void hal_init_platform(Kernel::HEL::BootInfoHeader* handover_hdr) {
/* INITIALIZE BIT MAP. */
/************************************** */
- kBitMapCursor = 0UL;
+ kBitMapCursor = 0UL;
kKernelBitMpSize = kHandoverHeader->f_BitMapSize;
kKernelBitMpStart = reinterpret_cast<Kernel::VoidPtr>(
reinterpret_cast<Kernel::UIntPtr>(kHandoverHeader->f_BitMapStart));
diff --git a/dev/kernel/src/FS/Ext2+FileSystemParser.cc b/dev/kernel/src/FS/Ext2+FileSystemParser.cc
index 80449ed9..318f83d6 100644
--- a/dev/kernel/src/FS/Ext2+FileSystemParser.cc
+++ b/dev/kernel/src/FS/Ext2+FileSystemParser.cc
@@ -6,7 +6,7 @@
#ifdef __FSKIT_INCLUDES_EXT2__
-#include <FSKit/Ext2.h>
+#include <FSKit/Ext2+IFS.h>
#include <FirmwareKit/EPM.h>
#include <KernelKit/KPC.h>
#include <KernelKit/ProcessScheduler.h>
diff --git a/dev/launch/LaunchKit/LaunchKit.h b/dev/launch/LaunchKit/LaunchKit.h
index 1a134e8f..2fa9607b 100644
--- a/dev/launch/LaunchKit/LaunchKit.h
+++ b/dev/launch/LaunchKit/LaunchKit.h
@@ -14,5 +14,7 @@
#define NELAUNCH_INFO(MSG) PrintOut(nullptr, "INFO: [LAUNCH] %s\n", MSG)
#define NELAUNCH_WARN(MSG) PrintOut(nullptr, "WARN: [LAUNCH] %s\n", MSG)
+namespace Launch {
using LaunchHandle = VoidPtr;
using KernelStatus = SInt32;
+} // namespace Launch
diff --git a/dev/launch/ne_launch.json b/dev/launch/ne_launch.json
index 38379de9..e3d26a46 100644
--- a/dev/launch/ne_launch.json
+++ b/dev/launch/ne_launch.json
@@ -2,7 +2,7 @@
"compiler_path": "x86_64-w64-mingw32-g++",
"compiler_std": "c++20",
"headers_path": ["../", "./"],
- "sources_path": ["src/*.cc"],
+ "sources_path": ["src/*.cc", "src/*.S"],
"output_name": "ne_launch",
"compiler_flags": [
"-ffreestanding",
diff --git a/dev/launch/src/CRT0.S b/dev/launch/src/CRT0.S
new file mode 100644
index 00000000..ffc7398a
--- /dev/null
+++ b/dev/launch/src/CRT0.S
@@ -0,0 +1,17 @@
+/* -------------------------------------------
+
+ Copyright (C) 2025, Amlal El Mahrouss, all rights reserved.
+
+ ------------------------------------------- */
+
+ .text
+
+.extern nelaunch_startup_fn
+
+_NeMain:
+ push %rbp
+ movq %rsp, %rbp
+ callq nelaunch_startup_fn
+ popq %rbp
+
+ retq
diff --git a/dev/launch/src/LaunchSrv.cc b/dev/launch/src/LaunchSrv.cc
index 40027f65..f5c9ee3c 100644
--- a/dev/launch/src/LaunchSrv.cc
+++ b/dev/launch/src/LaunchSrv.cc
@@ -7,10 +7,11 @@
#include <LaunchKit/LaunchKit.h>
#include <libSystem/SystemKit/Err.h>
-SInt32 _NeMain(Void) {
+/// @note This called by _NeMain from its own runtime.
+extern "C" SInt32 nelaunch_startup_fn(Void) {
/// @todo Start LaunchServices.fwrk services, make the launcher manageable too (via mgmt.launch)
- NELAUNCH_INFO("Starting services...");
+ NELAUNCH_INFO("Starting NeKernel services...");
return kErrorSuccess;
}
diff --git a/dev/libDDK/DriverKit/cpp/object.hpp b/dev/libDDK/DriverKit/cpp/object.hpp
deleted file mode 100644
index 3bf52657..00000000
--- a/dev/libDDK/DriverKit/cpp/object.hpp
+++ /dev/null
@@ -1,16 +0,0 @@
-/* -------------------------------------------
-
- Copyright Amlal El Mahrouss 2025, all rights reserved.
-
- FILE: ddk.h
- PURPOSE: DDK Driver model base header.
-
- ------------------------------------------- */
-
-#pragma once
-
-#include <DriverKit/macros.h>
-
-#define DK_INTERFACE_IMPL : public ::DKInterface
-
-class DKInterface;
diff --git a/dev/libDDK/DriverKit/dki/contract.h b/dev/libDDK/DriverKit/dki/contract.h
new file mode 100644
index 00000000..23884e02
--- /dev/null
+++ b/dev/libDDK/DriverKit/dki/contract.h
@@ -0,0 +1,32 @@
+/* -------------------------------------------
+
+ Copyright Amlal El Mahrouss 2025, all rights reserved.
+
+ FILE: ddk.h
+ PURPOSE: Driver Kernel Interface Model base header.
+
+ ------------------------------------------- */
+
+#pragma once
+
+#include <CompilerKit/CompilerKit.h>
+#include <DriverKit/macros.h>
+
+#define DKI_CONTRACT_IMPL : public ::Kernel::DKIContract
+
+/// @author Amlal El Mahrouss
+
+namespace Kernel::DKI {
+class DKIContract {
+ public:
+ explicit DKIContract() = default;
+ virtual ~DKIContract() = default;
+
+ NE_COPY_DEFAULT(DKIContract);
+
+ virtual BOOL IsCastable() { return false; }
+ virtual BOOL IsActive() { return false; }
+ virtual VoidPtr Leak() { return nullptr; }
+ virtual Int32 Type() { return 0; }
+};
+} // namespace Kernel::DKI
diff --git a/dev/libSystem/src/System.cc b/dev/libSystem/src/System.cc
index ba848a18..2215c4d8 100644
--- a/dev/libSystem/src/System.cc
+++ b/dev/libSystem/src/System.cc
@@ -40,6 +40,12 @@ IMPORT_C UInt64 libsys_hash_64(const Char* path) {
return hash;
}
+IMPORT_C Char* StrFmt(const Char* fmt, ...) {
+ if (!fmt || *fmt == 0) return const_cast<Char*>("(null)");
+
+ return const_cast<Char*>("");
+}
+
// memmove-style copy
IMPORT_C VoidPtr MmCopyMemory(_Input VoidPtr dest, _Input VoidPtr src, _Input SizeT len) {
// handles overlap, prefers 64-bit word copies when aligned
@@ -58,8 +64,9 @@ IMPORT_C VoidPtr MmCopyMemory(_Input VoidPtr dest, _Input VoidPtr src, _Input Si
// try 64-bit aligned backward copy
if (len >= sizeof(UInt64) && (reinterpret_cast<UIntPtr>(rs) % sizeof(UInt64) == 0) &&
(reinterpret_cast<UIntPtr>(rd) % sizeof(UInt64) == 0)) {
- auto rsw = reinterpret_cast<const UInt64*>(rs);
- auto rdw = reinterpret_cast<UInt64*>(rd);
+ auto rsw = reinterpret_cast<const UInt64*>(rs);
+ auto rdw = reinterpret_cast<UInt64*>(rd);
+
SizeT words = len / sizeof(UInt64);
for (SizeT i = 0; i < words; ++i) {
@@ -105,9 +112,11 @@ IMPORT_C VoidPtr MmCopyMemory(_Input VoidPtr dest, _Input VoidPtr src, _Input Si
IMPORT_C SInt64 MmStrLen(const Char* in) {
// strlen via pointer walk
- if (!in) return 0;
+ if (!in) return -kErrorInvalidData;
+
const Char* p = in;
while (*p) ++p;
+
return static_cast<SInt64>(p - in);
}