diff options
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/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." } |
