summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/kernel-ahci-dev.yml2
-rw-r--r--.github/workflows/kernel-ahci.yml2
-rw-r--r--.github/workflows/kernel-pio-dev.yml2
-rw-r--r--.github/workflows/kernel-pio.yml2
-rwxr-xr-xscripts/any_ci_x64.sh (renamed from scripts/kernel_ci_x64.sh)0
-rwxr-xr-xscripts/gdb.sh (renamed from gdb.sh)0
-rw-r--r--src/kernel/HALKit/AMD64/HalApplicationProcessor.cpp2
-rw-r--r--src/kernel/HALKit/AMD64/HalCommonAPI.asm12
-rw-r--r--src/kernel/HALKit/AMD64/HalHandoverStub.asm12
-rw-r--r--src/kernel/HALKit/AMD64/HalInterruptAPI.asm14
-rw-r--r--src/kernel/HALKit/AMD64/HalKernelMain.cpp6
-rw-r--r--src/kernel/HALKit/AMD64/HalUtilsAPI.asm12
-rw-r--r--src/kernel/HALKit/AMD64/Network/Generic+Basic+BNID.cpp (renamed from src/kernel/HALKit/AMD64/Network/Generic+Basic+RTL8139.cpp)58
-rw-r--r--src/kernel/KernelKit/Config.h4
-rw-r--r--src/kernel/KernelKit/CoreProcessScheduler.h17
-rw-r--r--src/kernel/KernelKit/KernelTask.h4
-rw-r--r--src/kernel/KernelKit/PCI/Device.h2
-rw-r--r--src/kernel/KernelKit/TraceSrv.h1
-rw-r--r--src/kernel/KernelKit/UserProcessScheduler.h17
-rw-r--r--src/kernel/NeKit/Config.h4
-rw-r--r--src/kernel/amd64-ci.make2
-rw-r--r--src/kernel/amd64-desktop.make2
-rw-r--r--src/kernel/src/CodeMgr.cpp2
-rw-r--r--src/kernel/src/HardwareThreadScheduler.cpp3
-rw-r--r--src/kernel/src/PE32CodeMgr.cpp16
-rw-r--r--src/kernel/src/PEFCodeMgr.cpp16
-rw-r--r--src/kernel/src/UserMgr.cpp7
-rw-r--r--src/kernel/src/UserProcessScheduler.cpp19
-rw-r--r--src/kernel/src/UserProcessTeam.cpp2
-rw-r--r--src/launch/.launch_manifest4
-rw-r--r--src/launch/launch.json2
-rw-r--r--src/launch/src/CRuntimeZero.S18
-rw-r--r--src/launch/src/RuntimeMain.cpp4
-rw-r--r--src/libDDK/src/DDKVersion.cpp (renamed from src/libDDK/src/Version.cpp)6
-rw-r--r--src/libDDK/src/KernelAllocator.cpp (renamed from src/libDDK/src/Allocator.cpp)4
-rw-r--r--src/libDDK/src/KernelCall.cpp8
-rw-r--r--src/libDDK/src/KernelDevice.cpp (renamed from src/libDDK/src/Device.cpp)4
-rw-r--r--src/libDDK/src/KernelDriverBase.cpp (renamed from src/libDDK/src/DriverBase.cpp)0
-rw-r--r--src/libDDK/src/KernelIO.cpp (renamed from src/libDDK/src/IO.cpp)6
-rw-r--r--src/libDDK/src/KernelString.cpp (renamed from src/libDDK/src/String.cpp)0
-rw-r--r--src/libMsg/MsgKit/Server.h8
-rw-r--r--src/libMsg/libMsg.json2
-rw-r--r--src/libMsg/scripts/hello-world.json (renamed from src/libMsg/scripts/window_client.json)4
-rw-r--r--src/libMsg/src/Server.cpp37
-rw-r--r--src/libPThread/.keep0
-rw-r--r--src/libPThread/PThreadKit/.keep0
-rw-r--r--src/libPThread/PThreadKit/Thread.h22
-rw-r--r--src/libPThread/libPThread.json22
-rw-r--r--src/libPThread/src/.keep0
-rw-r--r--src/libPThread/src/Thread.cpp42
-rw-r--r--src/libSystem/SystemKit/Macros.h3
-rw-r--r--src/libSystem/SystemKit/System.h20
-rw-r--r--src/libSystem/libSystem.json2
53 files changed, 312 insertions, 148 deletions
diff --git a/.github/workflows/kernel-ahci-dev.yml b/.github/workflows/kernel-ahci-dev.yml
index 296f5e87..91f235ee 100644
--- a/.github/workflows/kernel-ahci-dev.yml
+++ b/.github/workflows/kernel-ahci-dev.yml
@@ -15,4 +15,4 @@ jobs:
- uses: actions/checkout@v4
- name: Build CI
run: sudo curl https://github.com/ne-foss-org/nebuild/releases/download/v0.0.6-apple-m1/nebuild-debian -o /bin/nebuild && sudo chmod +x /bin/nebuild && sudo apt update && sudo apt install mingw-w64 qemu-utils nasm &&
- ./scripts/modules_ahci_x64.sh && ./scripts/setup_x64_project.sh && ./scripts/kernel_ci_x64.sh \ No newline at end of file
+ ./scripts/modules_ahci_x64.sh && ./scripts/setup_x64_project.sh && ./scripts/any_ci_x64.sh \ No newline at end of file
diff --git a/.github/workflows/kernel-ahci.yml b/.github/workflows/kernel-ahci.yml
index aab4c4ec..766b892d 100644
--- a/.github/workflows/kernel-ahci.yml
+++ b/.github/workflows/kernel-ahci.yml
@@ -15,5 +15,5 @@ jobs:
- uses: actions/checkout@v4
- name: Build CI
run: sudo curl https://github.com/ne-foss-org/nebuild/releases/download/v0.0.6-apple-m1/nebuild-debian -o /bin/nebuild && sudo chmod +x /bin/nebuild && sudo apt update && sudo apt install mingw-w64 qemu-utils nasm &&
- ./scripts/modules_ahci_x64.sh && ./scripts/setup_x64_project.sh && ./scripts/kernel_ci_x64.sh
+ ./scripts/modules_ahci_x64.sh && ./scripts/setup_x64_project.sh && ./scripts/any_ci_x64.sh
diff --git a/.github/workflows/kernel-pio-dev.yml b/.github/workflows/kernel-pio-dev.yml
index a2e95db3..cc97e07b 100644
--- a/.github/workflows/kernel-pio-dev.yml
+++ b/.github/workflows/kernel-pio-dev.yml
@@ -15,5 +15,5 @@ jobs:
- uses: actions/checkout@v4
- name: Build CI
run: sudo curl https://github.com/ne-foss-org/nebuild/releases/download/v0.0.6-apple-m1/nebuild-debian -o /bin/nebuild && sudo chmod +x /bin/nebuild && sudo apt update && sudo apt install mingw-w64 qemu-utils nasm &&
- ./scripts/modules_pio_x64.sh && ./scripts/setup_x64_project.sh && ./scripts/kernel_ci_x64.sh
+ ./scripts/modules_pio_x64.sh && ./scripts/setup_x64_project.sh && ./scripts/any_ci_x64.sh
\ No newline at end of file
diff --git a/.github/workflows/kernel-pio.yml b/.github/workflows/kernel-pio.yml
index 2cd45b9e..d57eddde 100644
--- a/.github/workflows/kernel-pio.yml
+++ b/.github/workflows/kernel-pio.yml
@@ -15,5 +15,5 @@ jobs:
- uses: actions/checkout@v4
- name: Build CI
run: sudo curl https://github.com/ne-foss-org/nebuild/releases/download/v0.0.6-apple-m1/nebuild-debian -o /bin/nebuild && sudo chmod +x /bin/nebuild && sudo apt update && sudo apt install mingw-w64 qemu-utils nasm &&
- ./scripts/modules_pio_x64.sh && ./scripts/setup_x64_project.sh && ./scripts/kernel_ci_x64.sh
+ ./scripts/modules_pio_x64.sh && ./scripts/setup_x64_project.sh && ./scripts/any_ci_x64.sh
\ No newline at end of file
diff --git a/scripts/kernel_ci_x64.sh b/scripts/any_ci_x64.sh
index 614ff65e..614ff65e 100755
--- a/scripts/kernel_ci_x64.sh
+++ b/scripts/any_ci_x64.sh
diff --git a/gdb.sh b/scripts/gdb.sh
index f908da16..f908da16 100755
--- a/gdb.sh
+++ b/scripts/gdb.sh
diff --git a/src/kernel/HALKit/AMD64/HalApplicationProcessor.cpp b/src/kernel/HALKit/AMD64/HalApplicationProcessor.cpp
index 2ff27ee2..6e9f273f 100644
--- a/src/kernel/HALKit/AMD64/HalApplicationProcessor.cpp
+++ b/src/kernel/HALKit/AMD64/HalApplicationProcessor.cpp
@@ -59,7 +59,7 @@ STATIC Int32 kSMPInterrupt = 0;
STATIC UInt64 kAPICLocales[kMaxAPInsideSched] = {0};
STATIC VoidPtr kRawMADT = nullptr;
-STATIC HAL_HARDWARE_THREAD kHWThread[kSchedProcessLimitPerTeam] = {{}};
+STATIC HAL_HARDWARE_THREAD kHWThread[kCPSProcessLimitPerTeam] = {{}};
/// @brief Multiple APIC Descriptor Table.
struct HAL_APIC_MADT final SDT_OBJECT {
diff --git a/src/kernel/HALKit/AMD64/HalCommonAPI.asm b/src/kernel/HALKit/AMD64/HalCommonAPI.asm
index f571aba7..2202d046 100644
--- a/src/kernel/HALKit/AMD64/HalCommonAPI.asm
+++ b/src/kernel/HALKit/AMD64/HalCommonAPI.asm
@@ -1,11 +1,7 @@
-;; /*
-;; * ========================================================
-;; *
-;; * NeKernel
-;; * Copyright (C) 2024-2025, Amlal El Mahrouss, licensed under the Apache 2.0 license.
-;; *
-;; * ========================================================
-;; */
+;; // SPDX-License-Identifier: Apache-2.0
+;; // Copyright 2024-2026, Amlal El Mahrouss (amlal@nekernel.org)
+;; // Licensed under the Apache License, Version 2.0 (see LICENSE file)
+;; // Official repository: https://github.com/ne-foss-org/nekernel
section .text
diff --git a/src/kernel/HALKit/AMD64/HalHandoverStub.asm b/src/kernel/HALKit/AMD64/HalHandoverStub.asm
index b66f52e4..15c3a38b 100644
--- a/src/kernel/HALKit/AMD64/HalHandoverStub.asm
+++ b/src/kernel/HALKit/AMD64/HalHandoverStub.asm
@@ -1,11 +1,7 @@
-;; /*
-;; * ========================================================
-;; *
-;; * NeKernel
-;; * Copyright (C) 2024-2025, Amlal El Mahrouss, licensed under the Apache 2.0 license.
-;; *
-;; * ========================================================
-;; */
+;; // SPDX-License-Identifier: Apache-2.0
+;; // Copyright 2024-2026, Amlal El Mahrouss (amlal@nekernel.org)
+;; // Licensed under the Apache License, Version 2.0 (see LICENSE file)
+;; // Official repository: https://github.com/ne-foss-org/nekernel
[bits 64]
diff --git a/src/kernel/HALKit/AMD64/HalInterruptAPI.asm b/src/kernel/HALKit/AMD64/HalInterruptAPI.asm
index ada65474..cdb5ecdd 100644
--- a/src/kernel/HALKit/AMD64/HalInterruptAPI.asm
+++ b/src/kernel/HALKit/AMD64/HalInterruptAPI.asm
@@ -1,13 +1,7 @@
-;; /*
-;; * ---------------------------------------------------
-;; *
-;; * Copyright (C) 2024-2025, Amlal El Mahrouss, licensed under the Apache 2.0 license.
-;; *
-;; * File: HalInterruptAPI.asm
-;; * Purpose: Interrupt API, redirect raw interrupts into their handlers.
-;; *
-;; * ---------------------------------------------------
-;; */
+;; // SPDX-License-Identifier: Apache-2.0
+;; // Copyright 2024-2026, Amlal El Mahrouss (amlal@nekernel.org)
+;; // Licensed under the Apache License, Version 2.0 (see LICENSE file)
+;; // Official repository: https://github.com/ne-foss-org/nekernel
[bits 64]
diff --git a/src/kernel/HALKit/AMD64/HalKernelMain.cpp b/src/kernel/HALKit/AMD64/HalKernelMain.cpp
index 7468b76d..57f980c6 100644
--- a/src/kernel/HALKit/AMD64/HalKernelMain.cpp
+++ b/src/kernel/HALKit/AMD64/HalKernelMain.cpp
@@ -133,6 +133,8 @@ EXTERN_C Kernel::Int32 hal_init_platform(Kernel::HEL::BootInfoHeader* handover_h
return kEfiFail;
}
+EXTERN_C BOOL rtl_init_nic_rtl8139();
+
EXTERN_C Kernel::Void hal_real_init(Kernel::Void) {
HAL::mp_init_cores(kHandoverHeader->f_HardwareTables.f_VendorPtr);
@@ -161,6 +163,10 @@ EXTERN_C Kernel::Void hal_real_init(Kernel::Void) {
UserProcessScheduler::The().SwitchTeam(kMidUserTeam);
+#ifdef __HALKIT_INCLUDES_BNID__
+ rtl_init_nic_rtl8139();
+#endif
+
while (YES);
}
#endif // ifndef __NE_MODULAR_KERNEL_COMPONENTS__
diff --git a/src/kernel/HALKit/AMD64/HalUtilsAPI.asm b/src/kernel/HALKit/AMD64/HalUtilsAPI.asm
index 2a0a5eff..aeb54c50 100644
--- a/src/kernel/HALKit/AMD64/HalUtilsAPI.asm
+++ b/src/kernel/HALKit/AMD64/HalUtilsAPI.asm
@@ -1,11 +1,7 @@
-;; /*
-;; * ========================================================
-;; *
-;; * NeKernel
-;; * Copyright (C) 2024-2025, Amlal El Mahrouss, licensed under the Apache 2.0 license.
-;; *
-;; * ========================================================
-;; */
+;; // SPDX-License-Identifier: Apache-2.0
+;; // Copyright 2024-2026, Amlal El Mahrouss (amlal@nekernel.org)
+;; // Licensed under the Apache License, Version 2.0 (see LICENSE file)
+;; // Official repository: https://github.com/ne-foss-org/nekernel
[bits 64]
diff --git a/src/kernel/HALKit/AMD64/Network/Generic+Basic+RTL8139.cpp b/src/kernel/HALKit/AMD64/Network/Generic+Basic+BNID.cpp
index aacda36c..4c1d0f1f 100644
--- a/src/kernel/HALKit/AMD64/Network/Generic+Basic+RTL8139.cpp
+++ b/src/kernel/HALKit/AMD64/Network/Generic+Basic+BNID.cpp
@@ -5,66 +5,82 @@
#include <DmaKit/DmaPool.h>
#include <HALKit/AMD64/Processor.h>
+#include <KernelKit/PCI/Iterator.h>
#include <modules/ACPI/ACPIFactoryInterface.h>
+/// @note BNID (RTL8139' Basic Network Interface) driver
+
+#define kNetDevID (0x8139)
+#define kNetSubClass (0x10EC)
+
using namespace Kernel;
using namespace Kernel::HAL;
STATIC UInt16 kRTLIOBase = 0xFFFF;
-STATIC BOOL kTXRXEnabled = NO;
-
STATIC UInt32 kRXOffset = 0UL;
STATIC constexpr CONST UInt32 kRXBufferSize = 8192 + 16 + 1500;
STATIC UInt8* kRXUpperLayer = nullptr;
STATIC UInt8* kRXBuffer = nullptr;
+STATIC PCI::Device kNetDev;
+
/***********************************************************************************/
-///@brief RTL8139 Init routine.
+///@brief BNID Init routine.
/***********************************************************************************/
-EXTERN_C BOOL rtl_init_nic_rtl8139(UInt16 io_base) {
+EXTERN_C BOOL rtl_init_nic_rtl8139() {
+ STATIC BOOL kTXRXEnabled = NO;
if (kTXRXEnabled) return NO;
- kRTLIOBase = io_base;
+ PCI::Iterator iterator(Types::PciDeviceKind::NetworkController, 0x00);
- MUST_PASS(io_base != 0xFFFF);
+ for (SizeT device_index = 0; device_index < NE_BUS_COUNT; ++device_index) {
+ kNetDev = iterator[device_index].Leak(); // Leak device.
- kRXBuffer = reinterpret_cast<UInt8*>(rtl_dma_alloc(sizeof(UInt8) * kRXBufferSize, 0));
+ if (kNetDev.VendorId() == kNetSubClass && kNetDev.DeviceId() == kNetDevID) {
+ kNetDev.EnableMmio();
+ kNetDev.BecomeBusMaster();
+
+ break;
+ }
+ }
+
+ kRTLIOBase = kNetDev.Bar(0);
- MUST_PASS(kRXBuffer);
+ MUST_PASS(kRTLIOBase != 0xFFFF);
+
+ kRXBuffer = reinterpret_cast<UInt8*>(rtl_dma_alloc(sizeof(UInt8) * kRXBufferSize, 0));
/// Reset first.
- rt_out8(io_base + 0x37, 0x10);
+ rt_out8(kRTLIOBase + 0x37, 0x10);
UInt16 timeout = 0U;
- while (rt_in8(io_base + 0x37) & 0x10) {
+ while (rt_in8(kRTLIOBase + 0x37) & 0x10) {
++timeout;
if (timeout > 0x1000) break;
}
- if (timeout <= 0x1000) {
- return NO;
- }
-
- rt_out32(io_base + 0x30, (UInt32) (UIntPtr) kRXBuffer);
+ rt_out32(kRTLIOBase + 0x30, (UInt32) (UIntPtr) kRXBuffer);
- rt_out8(io_base + 0x37, 0x0C);
+ rt_out8(kRTLIOBase + 0x37, 0x0C);
- rt_out32(io_base + 0x44, 0xF | (1 << 7));
+ rt_out32(kRTLIOBase + 0x44, 0xF | (1 << 7));
- rt_out16(io_base + 0x3C, 0x0005);
+ rt_out16(kRTLIOBase + 0x3C, 0x0005);
kTXRXEnabled = YES;
+ kout << "The Basic Network Interface Driver (BNID) has been initialized.\r";
+
return YES;
}
/***********************************************************************************/
-/// @brief RTL8139 I/O interrupt handler.
+/// @brief BNID I/O interrupt handler.
/// @param rsp stack pointer.
/// @note This function is called when the device interrupts to retrieve network data.
/***********************************************************************************/
@@ -105,7 +121,7 @@ EXTERN_C Void rtl_rtl8139_interrupt_handler(UIntPtr rsp) {
}
/***********************************************************************************/
-/// @brief RTL8139 get upper layer function
+/// @brief BNID get upper layer function
/// @return the upper layer.
/// @retval nullptr if no upper layer is set.
/// @retval pointer to the upper layer if set.
@@ -116,7 +132,7 @@ EXTERN_C UInt8* rtl_rtl8139_get_upper_layer() {
}
/***********************************************************************************/
-/// @brief RTL8139 set upper layer function
+/// @brief BNID set upper layer function
/// @param layer the upper layer.
/***********************************************************************************/
diff --git a/src/kernel/KernelKit/Config.h b/src/kernel/KernelKit/Config.h
index 8076a1c2..2df23851 100644
--- a/src/kernel/KernelKit/Config.h
+++ b/src/kernel/KernelKit/Config.h
@@ -8,8 +8,8 @@
#include <NeKit/Config.h>
-#define KERNELKIT_VERSION "0.0.2"
-#define KERNELKIT_VERSION_BCD 0x0002
+#define KERNELKIT_VERSION "0.0.3"
+#define KERNELKIT_VERSION_BCD 0x0003
namespace Kernel {
class UserProcessScheduler;
diff --git a/src/kernel/KernelKit/CoreProcessScheduler.h b/src/kernel/KernelKit/CoreProcessScheduler.h
index 0d915f12..7ed23a92 100644
--- a/src/kernel/KernelKit/CoreProcessScheduler.h
+++ b/src/kernel/KernelKit/CoreProcessScheduler.h
@@ -13,15 +13,14 @@
/// @brief Core Process Scheduler header file.
/// @author Amlal El Mahrouss (amlal@nekernel.org)
-#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)
+#define kCPSMinMicroTime (AffinityKind::kStandard)
+#define kCPSInvalidPID (-1)
+#define kCPSProcessLimitPerTeam (32U)
+#define kCPSTeamCount (256U)
+
+#define kCPSMaxMemoryLimit (gib_cast(128)) /* max physical memory limit */
+#define kCPSMaxStackSz (kib_cast(8)) /* maximum stack size */
+#define kCPSNameLen (128U)
EXTERN_C void sched_idle_task(void);
diff --git a/src/kernel/KernelKit/KernelTask.h b/src/kernel/KernelKit/KernelTask.h
index 6e319cbe..8227f7d1 100644
--- a/src/kernel/KernelKit/KernelTask.h
+++ b/src/kernel/KernelKit/KernelTask.h
@@ -24,11 +24,11 @@ using KID = ProcessID;
/// @author Amlal
class KernelTask final {
public:
- Char Name[kSchedNameLen] = {"KernelTask"};
+ Char Name[kCPSNameLen] = {"KernelTask"};
ProcessSubsystem SubSystem{ProcessSubsystem::kProcessSubsystemKernel};
HAL::StackFramePtr StackFrame{nullptr};
UInt8* StackReserve{nullptr};
- SizeT StackSize{kSchedMaxStackSz};
+ SizeT StackSize{kCPSMaxStackSz};
ProcessImage Image{};
/// @brief a KID is a Kernel ID, it is used to find a task running within the kernel.
diff --git a/src/kernel/KernelKit/PCI/Device.h b/src/kernel/KernelKit/PCI/Device.h
index b7737385..1adc9f24 100644
--- a/src/kernel/KernelKit/PCI/Device.h
+++ b/src/kernel/KernelKit/PCI/Device.h
@@ -51,7 +51,7 @@ class Device final {
}
public:
- UShort DeviceId();
+ UInt16 DeviceId();
UShort VendorId();
UShort InterfaceId();
UChar Class();
diff --git a/src/kernel/KernelKit/TraceSrv.h b/src/kernel/KernelKit/TraceSrv.h
index 998a14e9..47877349 100644
--- a/src/kernel/KernelKit/TraceSrv.h
+++ b/src/kernel/KernelKit/TraceSrv.h
@@ -7,6 +7,7 @@
#define KERNELKIT_TRACESRV_H
#include <CompilerKit/CompilerKit.h>
+#include <NeKit/NeKit.h>
namespace Kernel {
diff --git a/src/kernel/KernelKit/UserProcessScheduler.h b/src/kernel/KernelKit/UserProcessScheduler.h
index 4a160121..ab3c713e 100644
--- a/src/kernel/KernelKit/UserProcessScheduler.h
+++ b/src/kernel/KernelKit/UserProcessScheduler.h
@@ -52,18 +52,19 @@ class UserProcess final {
UIntPtr SignalID{0};
};
- Char Name[kSchedNameLen] = {"UserProcess"};
+ Char Name[kCPSNameLen] = {"UserProcess"};
ProcessSubsystem SubSystem{ProcessSubsystem::kProcessSubsystemUser};
User* Owner{nullptr};
HAL::StackFramePtr StackFrame{nullptr};
AffinityKind Affinity{AffinityKind::kStandard};
ProcessStatusKind Status{ProcessStatusKind::kKilled};
- UInt8 StackReserve[kSchedMaxStackSz];
- SizeT StackSize{kSchedMaxStackSz};
+ UInt8 StackReserve[kCPSMaxStackSz];
+ SizeT StackSize{kCPSMaxStackSz};
IDylibObject* DylibDelegate{nullptr};
SizeT MemoryCursor{0UL};
- SizeT MemoryLimit{kSchedMaxMemoryLimit};
- SizeT UsedMemory{0UL};
+ SizeT MemoryLimit{kCPSMaxMemoryLimit};
+ SizeT UsedMemory{0UL}; /// AMLALE: This should be thread-safe as well.
+ SizeT UsedFiles{0UL}; /// AMLALE: This is a thread-safe counter to track file allocation count.
UserProcessSignal Signal;
ProcessImage Image;
@@ -86,7 +87,7 @@ class UserProcess final {
ProcessTime RTime{0}; //! @brief Process run time.
ProcessTime UTime{0}; //! #brief Process used time.
- ProcessID ProcessId{kSchedInvalidPID};
+ ProcessID ProcessId{kCPSInvalidPID};
ExecutableKind Kind{ExecutableKind::kExecutableKind};
public:
@@ -193,7 +194,7 @@ inline bool operator>=(UserProcess::ExecutableKind lhs, UserProcess::ExecutableK
return lhs_int >= rhs_int;
}
-using UserProcessArray = Array<UserProcess, kSchedProcessLimitPerTeam>;
+using UserProcessArray = Array<UserProcess, kCPSProcessLimitPerTeam>;
using UserProcessRef = Ref<UserProcess>;
/// \brief Processs Team (contains multiple processes inside it.)
@@ -205,7 +206,7 @@ class UserProcessTeam final {
NE_COPY_DEFAULT(UserProcessTeam)
- Array<UserProcess, kSchedProcessLimitPerTeam>& AsArray();
+ Array<UserProcess, kCPSProcessLimitPerTeam>& AsArray();
Ref<UserProcess>& AsRef();
ProcessID& Id();
diff --git a/src/kernel/NeKit/Config.h b/src/kernel/NeKit/Config.h
index 02189b47..caf17ebd 100644
--- a/src/kernel/NeKit/Config.h
+++ b/src/kernel/NeKit/Config.h
@@ -8,8 +8,8 @@
#include <NeKit/Macros.h>
-#define NEKIT_VERSION_STR "0.0.2"
-#define NEKIT_VERSION_BCD 0x0002
+#define NEKIT_VERSION "0.0.3"
+#define NEKIT_VERSION_BCD 0x0003
#if __cplusplus < 202002L
#error !!! NeKernel compiles with C++20 as of December 4, 2025 !!!
diff --git a/src/kernel/amd64-ci.make b/src/kernel/amd64-ci.make
index dcb1c97e..71e350e5 100644
--- a/src/kernel/amd64-ci.make
+++ b/src/kernel/amd64-ci.make
@@ -5,7 +5,7 @@
CXX = x86_64-w64-mingw32-g++
LD = x86_64-w64-mingw32-ld
-CCFLAGS = -fshort-wchar -D__nekernel_dma_best_align=8 -D__nekernel_max_cores=8 -c -D__NE_AMD64__ -D__NEOSKRNL__ -D__NE_VEPM__ -Werror -Wall -Wpedantic -Wextra -mno-red-zone -fno-rtti -fno-exceptions -std=c++20 -D__NE_SUPPORT_NX__ -O0 -I../vendor -D__FSKIT_INCLUDES_NEFS__ -D__NEKERNEL__ -D__HAVE_NE_API__ -D__FREESTANDING__ -D__NE_VIRTUAL_MEMORY_SUPPORT__ -D__NE_AUTO_FORMAT__ -D__NE__ -I./ -I../ -I../boot
+CCFLAGS = -fshort-wchar -D__nekernel_dma_best_align=8 -D__HALKIT_INCLUDES_BNID__=1 -D__nekernel_max_cores=8 -c -D__NE_AMD64__ -D__NEOSKRNL__ -D__NE_VEPM__ -Werror -Wall -Wpedantic -Wextra -mno-red-zone -fno-rtti -fno-exceptions -std=c++20 -D__NE_SUPPORT_NX__ -O0 -I../vendor -D__FSKIT_INCLUDES_NEFS__ -D__NEKERNEL__ -D__HAVE_NE_API__ -D__FREESTANDING__ -D__NE_VIRTUAL_MEMORY_SUPPORT__ -D__NE_AUTO_FORMAT__ -D__NE__ -I./ -I../ -I../boot
ASM = nasm
diff --git a/src/kernel/amd64-desktop.make b/src/kernel/amd64-desktop.make
index 4afcdfd2..73bb2f43 100644
--- a/src/kernel/amd64-desktop.make
+++ b/src/kernel/amd64-desktop.make
@@ -5,7 +5,7 @@
CXX = x86_64-w64-mingw32-g++
LD = x86_64-w64-mingw32-ld
-CCFLAGS = -fshort-wchar -D__nekernel_dma_pool_start=0x1000000 -D__nekernel_dma_pool_size=0x1000000 \
+CCFLAGS = -fshort-wchar -D__nekernel_dma_pool_start=0x1000000 -D__HALKIT_INCLUDES_BNID__=1 -D__nekernel_dma_pool_size=0x1000000 \
-D__nekernel_halkit_include_processor="<HALKit/AMD64/Processor.h>" -D__nekernel_max_cores=8 -c -D__NE_AMD64__ -D__NEOSKRNL__ -D__NE_VEPM__ -Wall -Wpedantic -Wextra -mno-red-zone -fno-rtti -fno-exceptions -std=c++20 -D__nekernel_dma_best_align=8 -D__FSKIT_INCLUDES_OPENHEFS__ -D__FSKIT_INCLUDES_EXT2__ -D__NE_SUPPORT_NX__ -O0 -I../vendor -D__NEKERNEL__ -D__HAVE_NE_API__ -D__FREESTANDING__ -D__NE_VIRTUAL_MEMORY_SUPPORT__ -D__NE_AUTO_FORMAT__ -D__NE__ -I./ -I../ -I../boot
ASM = nasm
diff --git a/src/kernel/src/CodeMgr.cpp b/src/kernel/src/CodeMgr.cpp
index b02c6c27..8344fefc 100644
--- a/src/kernel/src/CodeMgr.cpp
+++ b/src/kernel/src/CodeMgr.cpp
@@ -30,7 +30,7 @@ BOOL rtl_create_kernel_task(KernelTask& task, const KID& kid) {
/***********************************************************************************/
ProcessID rtl_create_user_process(rtl_start_kind main, const Char* process_name) {
- if (!process_name || *process_name == 0) return kSchedInvalidPID;
+ if (!process_name || *process_name == 0) return kCPSInvalidPID;
return UserProcessScheduler::The().Spawn(process_name, reinterpret_cast<VoidPtr>(main), nullptr);
}
diff --git a/src/kernel/src/HardwareThreadScheduler.cpp b/src/kernel/src/HardwareThreadScheduler.cpp
index b6c93b1b..77b8d67d 100644
--- a/src/kernel/src/HardwareThreadScheduler.cpp
+++ b/src/kernel/src/HardwareThreadScheduler.cpp
@@ -22,8 +22,6 @@ namespace Kernel {
EXTERN_C Bool hal_check_task(HAL::StackFramePtr frame);
EXTERN_C Bool mp_register_task(HAL::StackFramePtr frame, ProcessID pid);
-STATIC HardwareThreadScheduler kHardwareThreadScheduler;
-
///! A HardwareThread class takes care of it's owned hardware thread.
///! It has a stack for it's core.
@@ -126,6 +124,7 @@ HardwareThreadScheduler::~HardwareThreadScheduler() = default;
/// @brief Shared singleton function
/***********************************************************************************/
HardwareThreadScheduler& HardwareThreadScheduler::The() {
+ STATIC HardwareThreadScheduler kHardwareThreadScheduler;
return kHardwareThreadScheduler;
}
diff --git a/src/kernel/src/PE32CodeMgr.cpp b/src/kernel/src/PE32CodeMgr.cpp
index fbb761e4..375725ee 100644
--- a/src/kernel/src/PE32CodeMgr.cpp
+++ b/src/kernel/src/PE32CodeMgr.cpp
@@ -237,18 +237,18 @@ ErrorOr<VoidPtr> PE32Loader::GetBlob() {
namespace Utils {
ProcessID rtl_create_user_process(PE32Loader& exec,
const UserProcess::ExecutableKind& process_kind) {
- if (!exec.IsLoaded()) return kSchedInvalidPID;
+ if (!exec.IsLoaded()) return kCPSInvalidPID;
ErrorOrAny errOrStart = exec.FindStart();
- if (errOrStart.Error() != kErrorSuccess) return kSchedInvalidPID;
+ if (errOrStart.Error() != kErrorSuccess) return kCPSInvalidPID;
ErrorOrAny symname = exec.FindSymbol(kPeNameSymbol, 0);
if (!symname.Leak().Leak())
symname = ErrorOr<VoidPtr>{(VoidPtr) rt_alloc_string(kPeImageStart)};
- if (!symname.Leak().Leak()) return kSchedInvalidPID;
+ if (!symname.Leak().Leak()) return kCPSInvalidPID;
ProcessID id =
UserProcessScheduler::The().Spawn(reinterpret_cast<const Char*>(symname.Leak().Leak()),
@@ -256,21 +256,21 @@ namespace Utils {
mm_free_ptr(symname.Leak().Leak());
- if (id != kSchedInvalidPID) {
+ if (id != kCPSInvalidPID) {
auto stacksym = exec.FindSymbol(kPeStackSizeSymbol, 0);
if (!stacksym.Leak().Leak()) {
- stacksym = ErrorOr<VoidPtr>{(VoidPtr) new UIntPtr(kSchedMaxStackSz)};
+ stacksym = ErrorOr<VoidPtr>{(VoidPtr) new UIntPtr(kCPSMaxStackSz)};
}
if (!stacksym.Leak().Leak()) {
UserProcessScheduler::The().Remove(id);
mm_free_ptr(stacksym.Leak().Leak());
- return kSchedInvalidPID;
+ return kCPSInvalidPID;
}
- if ((*(volatile UIntPtr*) stacksym.Leak().Leak()) > kSchedMaxStackSz) {
- *(volatile UIntPtr*) stacksym.Leak().Leak() = kSchedMaxStackSz;
+ if ((*(volatile UIntPtr*) stacksym.Leak().Leak()) > kCPSMaxStackSz) {
+ *(volatile UIntPtr*) stacksym.Leak().Leak() = kCPSMaxStackSz;
}
UserProcessScheduler::The().TheCurrentTeam().Leak().AsArray()[id].Kind = process_kind;
diff --git a/src/kernel/src/PEFCodeMgr.cpp b/src/kernel/src/PEFCodeMgr.cpp
index 8f2225a4..3b03c81f 100644
--- a/src/kernel/src/PEFCodeMgr.cpp
+++ b/src/kernel/src/PEFCodeMgr.cpp
@@ -301,17 +301,17 @@ ErrorOr<VoidPtr> PEFLoader::GetBlob() {
ProcessID rtl_create_user_process(PEFLoader& exec,
const UserProcess::ExecutableKind& process_kind) {
- if (!exec.IsLoaded()) return kSchedInvalidPID;
+ if (!exec.IsLoaded()) return kCPSInvalidPID;
auto errOrStart = exec.FindStart();
- if (errOrStart.Error() != kErrorSuccess) return kSchedInvalidPID;
+ if (errOrStart.Error() != kErrorSuccess) return kCPSInvalidPID;
auto symname = exec.FindSymbol(kPefNameSymbol, kPefCode);
if (!symname.Leak().Leak()) symname = ErrorOr<VoidPtr>{(VoidPtr) rt_alloc_string(kPefImageStart)};
- if (!symname.Leak().Leak()) return kSchedInvalidPID;
+ if (!symname.Leak().Leak()) return kCPSInvalidPID;
ProcessID id =
UserProcessScheduler::The().Spawn(reinterpret_cast<const Char*>(symname.Leak().Leak()),
@@ -319,21 +319,21 @@ ProcessID rtl_create_user_process(PEFLoader& exec,
if (symname.Leak().Leak()) mm_free_ptr(symname.Leak().Leak());
- if (id != kSchedInvalidPID) {
+ if (id != kCPSInvalidPID) {
auto stacksym = exec.FindSymbol(kPefStackSizeSymbol, kPefData);
if (!stacksym.Leak().Leak()) {
- stacksym = ErrorOr<VoidPtr>{(VoidPtr) new UIntPtr(kSchedMaxStackSz)};
+ stacksym = ErrorOr<VoidPtr>{(VoidPtr) new UIntPtr(kCPSMaxStackSz)};
}
if (!stacksym.Leak().Leak()) {
UserProcessScheduler::The().Remove(id);
mm_free_ptr(stacksym.Leak().Leak());
- return kSchedInvalidPID;
+ return kCPSInvalidPID;
}
- if ((*(volatile UIntPtr*) stacksym.Leak().Leak()) > kSchedMaxStackSz) {
- *(volatile UIntPtr*) stacksym.Leak().Leak() = kSchedMaxStackSz;
+ if ((*(volatile UIntPtr*) stacksym.Leak().Leak()) > kCPSMaxStackSz) {
+ *(volatile UIntPtr*) stacksym.Leak().Leak() = kCPSMaxStackSz;
}
UserProcessScheduler::The().TheCurrentTeam().Leak().AsArray()[id].Kind = process_kind;
diff --git a/src/kernel/src/UserMgr.cpp b/src/kernel/src/UserMgr.cpp
index 264dcc5f..cceda53d 100644
--- a/src/kernel/src/UserMgr.cpp
+++ b/src/kernel/src/UserMgr.cpp
@@ -16,7 +16,8 @@
/// @brief Multi-user support.
namespace Kernel {
-
-
-
+ namespace Detail {
+ struct UserPermissionControl;
+ struct UserPermissionElevator;
+ }
}
diff --git a/src/kernel/src/UserProcessScheduler.cpp b/src/kernel/src/UserProcessScheduler.cpp
index c0b166cb..4b8d788b 100644
--- a/src/kernel/src/UserProcessScheduler.cpp
+++ b/src/kernel/src/UserProcessScheduler.cpp
@@ -3,7 +3,6 @@
// Licensed under the Apache License, Version 2.0 (see LICENSE file)
// Official repository: https://github.com/ne-foss-org/nekernel
-
#include <ArchKit/ArchKit.h>
#include <KernelKit/HardwareThreadScheduler.h>
#include <KernelKit/HeapMgr.h>
@@ -103,7 +102,7 @@ STATIC T* sched_try_go_upper_ptr_tree(T* tree) {
/***********************************************************************************/
ErrorOr<VoidPtr> UserProcess::New(SizeT sz, SizeT pad_amount) {
- if (this->UsedMemory > kSchedMaxMemoryLimit) return ErrorOr<VoidPtr>(-kErrorHeapOutOfMemory);
+ if (this->UsedMemory > kCPSMaxMemoryLimit) return ErrorOr<VoidPtr>(-kErrorHeapOutOfMemory);
#ifdef __NE_VIRTUAL_MEMORY_SUPPORT__
auto vm_register = kKernelVM;
@@ -348,7 +347,7 @@ ProcessID UserProcessScheduler::Spawn(const Char* name, VoidPtr code, VoidPtr im
ProcessID pid = this->mTeam.mProcessCur;
- if (pid > kSchedProcessLimitPerTeam) {
+ if (pid > kCPSProcessLimitPerTeam) {
return -kErrorProcessFault;
}
@@ -361,12 +360,12 @@ ProcessID UserProcessScheduler::Spawn(const Char* name, VoidPtr code, VoidPtr im
SizeT len = rt_string_len(name);
- if (len > kSchedNameLen) {
+ if (len > kCPSNameLen) {
return -kErrorProcessFault;
}
rt_copy_memory_safe(reinterpret_cast<VoidPtr>(const_cast<Char*>(name)), process.Name, len,
- kSchedNameLen);
+ kCPSNameLen);
#ifdef __NE_VIRTUAL_MEMORY_SUPPORT__
process.VMRegister = kKernelVM;
@@ -395,7 +394,7 @@ ProcessID UserProcessScheduler::Spawn(const Char* name, VoidPtr code, VoidPtr im
HAL::kMMFlagsUser | HAL::kMMFlagsPresent);
#endif // ifdef __NE_VIRTUAL_MEMORY_SUPPORT__
- process.StackSize = kSchedMaxStackSz;
+ process.StackSize = kCPSMaxStackSz;
rt_set_memory(process.StackReserve, 0, process.StackSize);
@@ -430,8 +429,8 @@ ProcessID UserProcessScheduler::Spawn(const Char* name, VoidPtr code, VoidPtr im
/***********************************************************************************/
UserProcessScheduler& UserProcessScheduler::The() {
- STATIC UserProcessScheduler kScheduler;
- return kScheduler;
+ STATIC UserProcessScheduler kUserScheduler;
+ return kUserScheduler;
}
/***********************************************************************************/
@@ -444,7 +443,7 @@ UserProcessScheduler& UserProcessScheduler::The() {
/***********************************************************************************/
Void UserProcessScheduler::Remove(ProcessID process_id) {
- if (process_id < 0 || process_id > kSchedProcessLimitPerTeam) return;
+ if (process_id < 0 || process_id > kCPSProcessLimitPerTeam) return;
if (this->mTeam.mProcessList[process_id].Status == ProcessStatusKind::kInvalid) return;
mTeam.mProcessList[process_id].Exit(kErrorSuccess);
@@ -567,7 +566,7 @@ Bool UserProcessHelper::CanBeScheduled(const UserProcess& process) {
if (process.Status != ProcessStatusKind::kRunning) return No;
if (process.Affinity == AffinityKind::kInvalid) return No;
- if (process.StackSize > kSchedMaxStackSz) return No;
+ if (process.StackSize > kCPSMaxStackSz) return No;
if (!process.Name[0]) return No;
if (process.Signal.SignalID == sig_generate_unique<SIGTRAP>()) return No;
diff --git a/src/kernel/src/UserProcessTeam.cpp b/src/kernel/src/UserProcessTeam.cpp
index fe598795..293fd45a 100644
--- a/src/kernel/src/UserProcessTeam.cpp
+++ b/src/kernel/src/UserProcessTeam.cpp
@@ -24,7 +24,7 @@ UserProcessTeam::UserProcessTeam() {
/// @return The list of process to schedule.
/***********************************************************************************/
-Array<UserProcess, kSchedProcessLimitPerTeam>& UserProcessTeam::AsArray() {
+Array<UserProcess, kCPSProcessLimitPerTeam>& UserProcessTeam::AsArray() {
return this->mProcessList;
}
diff --git a/src/launch/.launch_manifest b/src/launch/.launch_manifest
new file mode 100644
index 00000000..201b1f61
--- /dev/null
+++ b/src/launch/.launch_manifest
@@ -0,0 +1,4 @@
+[Launch]
+RunAsRoot=YES
+# NOTE: This has to be generated and passed here to enable all-trustee permissions.
+RootKey=
diff --git a/src/launch/launch.json b/src/launch/launch.json
index 1230b34d..77774618 100644
--- a/src/launch/launch.json
+++ b/src/launch/launch.json
@@ -3,7 +3,7 @@
"compiler_std": "c++20",
"headers_path": ["../", "./", "../../public/frameworks"],
"sources_path": ["src/*.cpp", "src/*.S"],
- "output_name": "ne_launch.exe",
+ "output_name": "launch.exe",
"compiler_flags": [
"-ffreestanding",
"-shared",
diff --git a/src/launch/src/CRuntimeZero.S b/src/launch/src/CRuntimeZero.S
index 7dd283c9..1e5e2cbb 100644
--- a/src/launch/src/CRuntimeZero.S
+++ b/src/launch/src/CRuntimeZero.S
@@ -20,7 +20,21 @@ _NeMain:
callq launch_startup_fn
movq %rcx, 0
-
callq ThrExitMainThread
-
popq %rbp
+
+.data
+.global _ProgramData
+_ProgramData:
+ //;; ident
+ .word 0xffeecc
+ //;; version
+ .word 0x0110
+ //;; kind: 0x0 = LaunchSystem
+ .word 0x0
+ //;; flags
+ .word 0x0
+ //;; Launcher name
+ .asciz "NeKernel Launcher"
+
+
diff --git a/src/launch/src/RuntimeMain.cpp b/src/launch/src/RuntimeMain.cpp
index 3216dad0..833a2f55 100644
--- a/src/launch/src/RuntimeMain.cpp
+++ b/src/launch/src/RuntimeMain.cpp
@@ -12,13 +12,13 @@
IMPORT_C SInt32 launch_startup_fn(Void) {
/// Start LaunchHelpers.fwrk services, and make the launcher manageable too (via mgmt.launch)
UInt32* ret =
- static_cast<UInt32*>(libsys_syscall_arg_1(libsys_hash_64("__launch_register_service")));
+ static_cast<UInt32*>(libsys_syscall_arg_1(libsys_hash_64("__launch_register_service"))); // Register service based on program data.
if (ret) {
switch (*ret) {
case kErrorSuccess: {
ret =
- static_cast<UInt32*>(libsys_syscall_arg_1(libsys_hash_64("__launch_listen_as_super")));
+ static_cast<UInt32*>(libsys_syscall_arg_1(libsys_hash_64("__launch_attach_service"))); // Attach this program as the service process.
return *ret;
}
default:
diff --git a/src/libDDK/src/Version.cpp b/src/libDDK/src/DDKVersion.cpp
index 5e60fbc4..eb65da89 100644
--- a/src/libDDK/src/Version.cpp
+++ b/src/libDDK/src/DDKVersion.cpp
@@ -7,15 +7,15 @@
#include <DriverKit/DriverKit.h>
#ifndef kDDKVersionHighest
-#define kDDKVersionHighest 1
+#define kDDKVersionHighest 0x010000
#endif // !kDDKVersionHighest
#ifndef kDDKVersionLowest
-#define kDDKVersionLowest 1
+#define kDDKVersionLowest 0x010000
#endif // !kDDKVersionLowest
#ifndef kDDKVersion
-#define kDDKVersion 1
+#define kDDKVersion 0x010000
#endif // !kDDKVersion
uint32_t kApiVersionHighest = kDDKVersionHighest;
diff --git a/src/libDDK/src/Allocator.cpp b/src/libDDK/src/KernelAllocator.cpp
index f350ab22..f2dd7b45 100644
--- a/src/libDDK/src/Allocator.cpp
+++ b/src/libDDK/src/KernelAllocator.cpp
@@ -14,7 +14,7 @@
DDK_EXTERN void* kalloc(size_t sz) {
if (!sz) ++sz;
- void* ptr = ke_call_dispatch("mm_alloc_ptr", 1, &sz, sizeof(size_t));
+ void* ptr = ::ke_call_dispatch("mm_alloc_ptr", 1, &sz, sizeof(size_t));
return ptr;
}
@@ -26,5 +26,5 @@ DDK_EXTERN void* kalloc(size_t sz) {
DDK_EXTERN void kfree(void* ptr) {
if (!ptr) return;
- ke_call_dispatch("mm_free_ptr", 1, ptr, 0);
+ ::ke_call_dispatch("mm_free_ptr", 1, ptr, 0);
}
diff --git a/src/libDDK/src/KernelCall.cpp b/src/libDDK/src/KernelCall.cpp
index bbaded64..43e4b79f 100644
--- a/src/libDDK/src/KernelCall.cpp
+++ b/src/libDDK/src/KernelCall.cpp
@@ -40,14 +40,14 @@ static uint64_t ddk_fnv_64(const char* path) {
/// @retval nil Kernel call failed, call KernelLastError(void)
DDK_EXTERN void* ke_call_dispatch(const char* name, int32_t cnt, void* data, size_t sz) {
if (name == nil || *name == 0 || data == nil || cnt == 0) return nil;
- return __ke_call_dispatch(ddk_fnv_64(name), cnt, data, sz);
+ return ::__ke_call_dispatch(ddk_fnv_64(name), cnt, data, sz);
}
/// @brief Add system call.
/// @param slot system call slot
/// @param slotFn, syscall slot.
DDK_EXTERN void ke_set_syscall(const int slot, void (*slotFn)(void* a0)) {
- ke_call_dispatch("ke_set_syscall", slot, (ptr_t) slotFn, 1);
+ ::ke_call_dispatch("ke_set_syscall", slot, (ptr_t) slotFn, 1);
}
/// @brief Get a Kernel object.
@@ -56,7 +56,7 @@ DDK_EXTERN void ke_set_syscall(const int slot, void (*slotFn)(void* a0)) {
/// @return Object manifest.
DDK_EXTERN struct DDK_OBJECT_MANIFEST* ke_get_obj(const int slot, const char* name) {
struct DDK_OBJECT_MANIFEST* manifest =
- (struct DDK_OBJECT_MANIFEST*) ke_call_dispatch("cfkit_get_kobj", slot, (void*) name, 1);
+ (struct DDK_OBJECT_MANIFEST*) ::ke_call_dispatch("cfkit_get_kobj", slot, (void*) name, 1);
if (!manifest) return nil;
@@ -70,5 +70,5 @@ DDK_EXTERN struct DDK_OBJECT_MANIFEST* ke_get_obj(const int slot, const char* na
/// @return property's object.
DDK_EXTERN void* ke_set_obj(const int slot, const struct DDK_OBJECT_MANIFEST* ddk_ptr) {
if (ddk_ptr == nil) return nil;
- return ke_call_dispatch("cfkit_set_kobj", slot, (void*) ddk_ptr, 1);
+ return ::ke_call_dispatch("cfkit_set_kobj", slot, (void*) ddk_ptr, 1);
}
diff --git a/src/libDDK/src/Device.cpp b/src/libDDK/src/KernelDevice.cpp
index 6390f05c..c5fb785f 100644
--- a/src/libDDK/src/Device.cpp
+++ b/src/libDDK/src/KernelDevice.cpp
@@ -11,7 +11,7 @@
DDK_EXTERN DDK_DEVICE_PTR kopen_dev(const char* devicePath) {
if (nil == devicePath) return nil;
- return (DDK_DEVICE_PTR) ke_call_dispatch("dk_open_dev", 1, (void*) devicePath,
+ return (DDK_DEVICE_PTR) ::ke_call_dispatch("dk_open_dev", 1, (void*) devicePath,
kstrlen(devicePath));
}
@@ -20,6 +20,6 @@ DDK_EXTERN DDK_DEVICE_PTR kopen_dev(const char* devicePath) {
DDK_EXTERN BOOL kclose_dev(DDK_DEVICE_PTR device) {
if (nil == device) return NO;
- ke_call_dispatch("dk_close_dev", 1, device, sizeof(DDK_DEVICE));
+ ::ke_call_dispatch("dk_close_dev", 1, device, sizeof(DDK_DEVICE));
return YES;
}
diff --git a/src/libDDK/src/DriverBase.cpp b/src/libDDK/src/KernelDriverBase.cpp
index 37b138a0..37b138a0 100644
--- a/src/libDDK/src/DriverBase.cpp
+++ b/src/libDDK/src/KernelDriverBase.cpp
diff --git a/src/libDDK/src/IO.cpp b/src/libDDK/src/KernelIO.cpp
index fc247e15..e978525d 100644
--- a/src/libDDK/src/IO.cpp
+++ b/src/libDDK/src/KernelIO.cpp
@@ -13,7 +13,7 @@ DDK_EXTERN void kputc(const char ch) {
assembled[0] = ch;
assembled[1] = 0;
- ke_call_dispatch("ke_put_string", 2, assembled, 2);
+ ::ke_call_dispatch("ke_put_string", 2, assembled, 2);
}
/// @brief print string to UART.
@@ -23,10 +23,10 @@ DDK_EXTERN void kprint(const char* message) {
if (*message == '\0') return;
size_t index = 0;
- size_t len = kstrlen(message);
+ size_t len = ::kstrlen(message);
while (index < len) {
- kputc(message[index]);
+ ::kputc(message[index]);
++index;
}
}
diff --git a/src/libDDK/src/String.cpp b/src/libDDK/src/KernelString.cpp
index 7aee7495..7aee7495 100644
--- a/src/libDDK/src/String.cpp
+++ b/src/libDDK/src/KernelString.cpp
diff --git a/src/libMsg/MsgKit/Server.h b/src/libMsg/MsgKit/Server.h
index 3ab8eb73..faac0b0b 100644
--- a/src/libMsg/MsgKit/Server.h
+++ b/src/libMsg/MsgKit/Server.h
@@ -6,6 +6,7 @@
#ifndef MSGKIT_SERVER_H
#define MSGKIT_SERVER_H
+#include "libSystem/SystemKit/Macros.h"
#ifdef __cplusplus
#include <CoreFoundation.fwrk/headers/String.h>
#else
@@ -25,9 +26,12 @@ struct LIBMSG_EXPR final {
CF::CFString* l_value{nullptr};
#else
// if we use C, we won't know about CF, so let's make those private.
- VoidPtr l_private_data[2]{nullptr};
+ VoidPtr l_key{nullptr};
+ VoidPtr l_value{nullptr};
#endif
+ SizeT l_index{};
+
LIBMSG_EXPR* l_head{nullptr};
LIBMSG_EXPR* l_tail{nullptr};
LIBMSG_EXPR* l_child{nullptr};
@@ -38,6 +42,6 @@ typedef Void (*libmsg_func_type)(struct LIBMSG_EXPR* self, VoidPtr arg, SizeT ar
IMPORT_C Void libmsg_init_library(libmsg_func_type* funcs, SizeT cnt);
IMPORT_C UInt32 libmsg_close_library(Void);
-IMPORT_C UInt32 libmsg_eval_expr(struct LIBMSG_EXPR* head);
+IMPORT_C UInt32 libmsg_eval_expr(struct LIBMSG_EXPR* head, VoidPtr arg, SizeT arg_size);
#endif
diff --git a/src/libMsg/libMsg.json b/src/libMsg/libMsg.json
index 4b22534f..54f284b8 100644
--- a/src/libMsg/libMsg.json
+++ b/src/libMsg/libMsg.json
@@ -17,5 +17,5 @@
"kLibSystemVersionHighest=0x0100",
"kLibSystemVersionLowest=0x0100"
],
- "description": "OpenMessage Kit for NeKernel."
+ "description": "OpenMessage Kit for the NeSystem."
}
diff --git a/src/libMsg/scripts/window_client.json b/src/libMsg/scripts/hello-world.json
index 4c8a21ba..f23a3714 100644
--- a/src/libMsg/scripts/window_client.json
+++ b/src/libMsg/scripts/hello-world.json
@@ -2,6 +2,6 @@
"id": 1,
"pos": { "x": 100, "y": 100 },
"size": { "w": 300, "h": 200 },
- "title": "Window Client",
- "on-click": "_OnClickCSymbol"
+ "title": "Message",
+ "on-init": "_PrintHelloWorld"
} \ No newline at end of file
diff --git a/src/libMsg/src/Server.cpp b/src/libMsg/src/Server.cpp
index 3f2e8f5a..e4602047 100644
--- a/src/libMsg/src/Server.cpp
+++ b/src/libMsg/src/Server.cpp
@@ -5,9 +5,40 @@
#include <libMsg/MsgKit/Server.h>
-IMPORT_C UInt32 libmsg_close_library(Void) { return 0; }
+static libmsg_func_type* kFuncs{nullptr};
+static SizeT kFuncCnt{0};
+static SemaphoreRef kSemaphore{nullptr};
-IMPORT_C UInt32 libmsg_eval_expr(struct LIBMSG_EXPR* head) { return 0; }
+IMPORT_C UInt32 libmsg_close_library(Void) {
+ if (kSemaphore) return 0;
-IMPORT_C Void libmsg_init_library(libmsg_func_type* funcs, SizeT cnt) {}
+ kFuncs = nullptr;
+ kFuncCnt = 0;
+ return 0;
+}
+
+IMPORT_C UInt32 libmsg_eval_expr(struct LIBMSG_EXPR* head, VoidPtr arg, SizeT arg_size) {
+ if (kSemaphore) return 0;
+
+ if (!head) return 0;
+
+ kSemaphore = SemCreate(1000, 1000, "libmsg_semaphore");
+
+ if (!kSemaphore) return 0;
+
+ kFuncs[head->l_index](head, arg, arg_size);
+
+ SemClose(kSemaphore);
+ kSemaphore = nullptr;
+
+ return 0;
+}
+
+IMPORT_C Void libmsg_init_library(libmsg_func_type* funcs, SizeT cnt) {
+ kFuncs = funcs;
+ kFuncCnt = cnt;
+
+ MUST_PASS(kFuncs != nullptr);
+ MUST_PASS(kFuncCnt > 0);
+}
diff --git a/src/libPThread/.keep b/src/libPThread/.keep
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/src/libPThread/.keep
diff --git a/src/libPThread/PThreadKit/.keep b/src/libPThread/PThreadKit/.keep
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/src/libPThread/PThreadKit/.keep
diff --git a/src/libPThread/PThreadKit/Thread.h b/src/libPThread/PThreadKit/Thread.h
new file mode 100644
index 00000000..5282a623
--- /dev/null
+++ b/src/libPThread/PThreadKit/Thread.h
@@ -0,0 +1,22 @@
+// SPDX-License-Identifier: Apache-2.0
+// Copyright 2026, Amlal El Mahrouss (amlal@nekernel.org)
+// Licensed under the Apache License, Version 2.0 (see LICENSE file)
+// Official repository: https://github.com/ne-foss-org/nekernel
+
+#ifndef LIBPOSIX_POSIXKIT_THREAD_H
+#define LIBPOSIX_POSIXKIT_THREAD_H
+
+#include <libPOSIXWrapper/POSIXKit/unistd.h>
+
+/// @brief Please use these macros to specify whether your function is thread safe or not.
+#define PTHREAD_UNSAFE __THREAD_UNSAFE
+#define PTHREAD_SAFE __THREAD_SAFE
+
+PTHREAD_SAFE SInt32 pthread_create(_Output ThreadRef* thread, VoidPtr attr, VoidPtr (*start_routine)(VoidPtr), VoidPtr arg);
+PTHREAD_SAFE SInt32 pthread_join(ThreadRef thread, VoidPtr* retval);
+PTHREAD_SAFE SInt32 pthread_exit(SInt32 retval);
+PTHREAD_SAFE SInt32 pthread_detach(ThreadRef thread);
+PTHREAD_SAFE ThreadRef pthread_self(Void);
+PTHREAD_SAFE SInt32 pthread_yield(void);
+
+#endif // LIBPOSIX_POSIXKIT_THREAD_H
diff --git a/src/libPThread/libPThread.json b/src/libPThread/libPThread.json
new file mode 100644
index 00000000..a5cfba73
--- /dev/null
+++ b/src/libPThread/libPThread.json
@@ -0,0 +1,22 @@
+{
+ "compiler_path": "x86_64-w64-mingw32-gcc",
+ "compiler_std": "c++20",
+ "headers_path": ["../", "./"],
+ "sources_path": ["src/*.cpp"],
+ "output_name": "libPThread.dll",
+ "compiler_flags": [
+ "-ffreestanding",
+ "-shared",
+ "-std=c++20",
+ "-fno-rtti",
+ "-fno-exceptions",
+ "-Wl,--subsystem=17"
+ ],
+ "cpp_macros": [
+ "__NEOSKRNL__",
+ "kPosixVersionHighest=0x0100",
+ "kPosixVersionLowest=0x0100",
+ "kPosixVersion=0x0100"
+ ],
+ "description": "The NeKernel PThread System. Refer to: https://man7.org/linux/man-pages/man7/pthreads.7.html"
+}
diff --git a/src/libPThread/src/.keep b/src/libPThread/src/.keep
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/src/libPThread/src/.keep
diff --git a/src/libPThread/src/Thread.cpp b/src/libPThread/src/Thread.cpp
new file mode 100644
index 00000000..5a351be8
--- /dev/null
+++ b/src/libPThread/src/Thread.cpp
@@ -0,0 +1,42 @@
+// SPDX-License-Identifier: Apache-2.0
+// Copyright 2026, Amlal El Mahrouss (amlal@nekernel.org)
+// Licensed under the Apache License, Version 2.0 (see LICENSE file)
+// Official repository: https://github.com/ne-foss-org/nekernel
+
+#include <libPThread/PThreadKit/Thread.h>
+
+PTHREAD_SAFE SInt32 pthread_detach(ThreadRef thread) {
+ return ThrDetachThread(thread);
+}
+
+PTHREAD_SAFE SInt32 pthread_yield(void) {
+ return ThrYieldThread(pthread_self());
+}
+
+PTHREAD_SAFE ThreadRef pthread_self(Void) {
+ return ThrCurrentThread();
+}
+
+PTHREAD_SAFE SInt32 pthread_exit(SInt32 retval) {
+ return ThrExitCurrentThread(retval);
+}
+
+PTHREAD_SAFE SInt32 pthread_join(ThreadRef thread, VoidPtr* retval) {
+ SInt32* ret = (SInt32*)retval;
+ *ret = ThrJoinThread(thread);
+
+ return 0;
+}
+
+PTHREAD_SAFE SInt32 pthread_create(_Output ThreadRef* thread, VoidPtr attr, VoidPtr (*start_routine)(VoidPtr), VoidPtr arg) {
+ LIBSYS_UNUSED(attr);
+
+ /// @note passing zero means you'd have to read the argv until you hit a nullptr.
+ ThreadRef thrd = ThrCreateThread("pthread_thread", (ThrProcKind)start_routine, 0, arg, 0);
+
+ if (!thrd) return -1;
+
+ *thread = thrd;
+ return 0;
+}
+
diff --git a/src/libSystem/SystemKit/Macros.h b/src/libSystem/SystemKit/Macros.h
index 37150b01..14918c41 100644
--- a/src/libSystem/SystemKit/Macros.h
+++ b/src/libSystem/SystemKit/Macros.h
@@ -15,6 +15,9 @@
#define ATTRIBUTE(X) __attribute__((X))
+#define __THREAD_SAFE ATTRIBUTE(thread_safe)
+#define __THREAD_UNSAFE
+
#define IMPORT_CXX extern "C++"
#define IMPORT_C extern "C"
diff --git a/src/libSystem/SystemKit/System.h b/src/libSystem/SystemKit/System.h
index 1a7298d8..69cce9a7 100644
--- a/src/libSystem/SystemKit/System.h
+++ b/src/libSystem/SystemKit/System.h
@@ -14,12 +14,14 @@
/// @brief Secure TTY device path.
#define kSecurePrintDevicePath "/devices/stty{}{}"
+/// @brief Laser-disc path (Blu-ray, DVD, CD, etc.)
#define kCDDevicePath "/devices/dvd{}{}"
// ------------------------------------------------------------------------------------------ //
/// @brief Types API.
// ------------------------------------------------------------------------------------------ //
+/// @brief Reference type, used for all references in the system, such as file descriptors, dylib handles, thread handles, etc.
struct REF_TYPE {
UInt64 __hash; /// @brief Hash of the syscall
VoidPtr __self; /// @brief Syscall self value.
@@ -209,12 +211,15 @@ typedef SInt32 (*ThrProcKind)(SInt32 argc, Char** argv);
/// @param flags Thread flags.
/// @return the thread object.
IMPORT_C ThreadRef ThrCreateThread(const Char* thread_name, ThrProcKind procedure,
- SInt32 argument_count, SInt32 flags);
+ SInt32 argument_count, VoidPtr args, SInt32 flags);
/// @brief Yields the current thread.
/// @param thread the thread to yield.
IMPORT_C SInt32 ThrYieldThread(ThreadRef thrd);
+/// @brief Get the current thread's ID.
+IMPORT_C ThreadRef ThrCurrentThread(Void);
+
/// @brief Joins a thread.
/// @param thread the thread to join.
IMPORT_C SInt32 ThrJoinThread(ThreadRef thrd);
@@ -388,4 +393,17 @@ IMPORT_C Char* StrFmt(const Char* fmt, ...);
IMPORT_C UInt64 StrMathToNumber(const Char* in, const Char** endp, const SInt16 base);
+// ------------------------------------------------------------------------------------------ //
+// @brief Semaphore API.
+// ------------------------------------------------------------------------------------------ //
+
+/// @brief Create a semaphore.
+IMPORT_C _Output SemaphoreRef SemCreate(_Input UInt32 initial_count, _Input UInt32 max_count, _Input const Char* name);
+
+/// @brief Wait on a semaphore.
+IMPORT_C SInt32 SemWait(_Input SemaphoreRef sem);
+
+/// @brief Close a semaphore.
+IMPORT_C SInt32 SemClose(_Input SemaphoreRef sem);
+
#endif // ifndef SYSTEMKIT_SYSTEM_H
diff --git a/src/libSystem/libSystem.json b/src/libSystem/libSystem.json
index 16557645..14f4bfc5 100644
--- a/src/libSystem/libSystem.json
+++ b/src/libSystem/libSystem.json
@@ -17,5 +17,5 @@
"kLibSystemVersionHighest=0x0100",
"kLibSystemVersionLowest=0x0100"
],
- "description": "The System Call Kit for the NeKernel Stack."
+ "description": "The System Call Kit for the NeSystem."
}