diff options
Diffstat (limited to 'dev/kernel')
38 files changed, 287 insertions, 289 deletions
diff --git a/dev/kernel/DmaKit/DmaPool.h b/dev/kernel/DmaKit/DmaPool.h index ec98745d..9decb3f1 100644 --- a/dev/kernel/DmaKit/DmaPool.h +++ b/dev/kernel/DmaKit/DmaPool.h @@ -44,7 +44,7 @@ inline VoidPtr rtl_dma_alloc(SizeT size, SizeT align) { kDmaPoolPtr = (UInt8*) (addr + size); - HAL::mm_memory_fence((VoidPtr)addr); + HAL::mm_memory_fence((VoidPtr) addr); return (VoidPtr) addr; } diff --git a/dev/kernel/FirmwareKit/EFI/EFI.h b/dev/kernel/FirmwareKit/EFI/EFI.h index ed22f1e9..97e3ad01 100644 --- a/dev/kernel/FirmwareKit/EFI/EFI.h +++ b/dev/kernel/FirmwareKit/EFI/EFI.h @@ -664,7 +664,7 @@ typedef struct EfiSystemTable { /// The configuration table (contains the RSD PTR entry.) struct { EFI_GUID VendorGUID; - VoidPtr VendorTable; + VoidPtr VendorTable; } * ConfigurationTable; } EfiSystemTable; diff --git a/dev/kernel/FirmwareKit/GPT.h b/dev/kernel/FirmwareKit/GPT.h index df0ed286..f361c4a2 100644 --- a/dev/kernel/FirmwareKit/GPT.h +++ b/dev/kernel/FirmwareKit/GPT.h @@ -20,29 +20,29 @@ struct GPT_PARTITION_TABLE; struct GPT_PARTITION_ENTRY; struct PACKED GPT_PARTITION_TABLE final { - Char Signature[kMagicLenGPT]; - UInt32 Revision; - UInt32 HeaderSize; - UInt32 CRC32; - UInt32 Reserved1; - UInt64 LBAHeader; - UInt64 LBAAltHeader; - UInt64 FirstGPTEntry; - UInt64 LastGPTEntry; + Char Signature[kMagicLenGPT]; + UInt32 Revision; + UInt32 HeaderSize; + UInt32 CRC32; + UInt32 Reserved1; + UInt64 LBAHeader; + UInt64 LBAAltHeader; + UInt64 FirstGPTEntry; + UInt64 LastGPTEntry; EFI_GUID Guid; - UInt64 StartingLBA; - UInt32 NumPartitionEntries; - UInt32 SizeOfEntries; - UInt32 CRC32PartEntry; - UInt8 Reserved2[kSectorAlignGPT_PartTbl]; + UInt64 StartingLBA; + UInt32 NumPartitionEntries; + UInt32 SizeOfEntries; + UInt32 CRC32PartEntry; + UInt8 Reserved2[kSectorAlignGPT_PartTbl]; }; struct PACKED GPT_PARTITION_ENTRY { EFI_GUID PartitionTypeGUID; EFI_GUID UniquePartitionGUID; - UInt64 StartLBA; - UInt64 EndLBA; - UInt64 Attributes; - UInt8 Name[kSectorAlignGPT_PartEntry]; + UInt64 StartLBA; + UInt64 EndLBA; + UInt64 Attributes; + UInt8 Name[kSectorAlignGPT_PartEntry]; }; } // namespace Kernel diff --git a/dev/kernel/GfxKit/FB.h b/dev/kernel/GfxKit/FB.h index e30f1800..14f0393c 100644 --- a/dev/kernel/GfxKit/FB.h +++ b/dev/kernel/GfxKit/FB.h @@ -32,11 +32,11 @@ struct PACKED FBDevicePacket final { /// @brief Framebuffer device interface. /// @details This class is used to send and receive data from the framebuffer device. -/// @note The class is derived from the IDeviceObject class. +/// @note The class is derived from the DeviceInterface class. class FBDeviceInterface NE_DEVICE<FBDevicePacket*> { public: - explicit FBDeviceInterface(void (*out)(IDeviceObject* self, FBDevicePacket* out), - void (*in)(IDeviceObject* self, FBDevicePacket* in)); + explicit FBDeviceInterface(void (*out)(DeviceInterface* self, FBDevicePacket* out), + void (*in)(DeviceInterface* self, FBDevicePacket* in)); virtual ~FBDeviceInterface() override; diff --git a/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc b/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc index 3e10d577..24a81af9 100644 --- a/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc +++ b/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc @@ -120,7 +120,9 @@ EXTERN_C BOOL mp_register_task(HAL::StackFramePtr stack_frame, ThreadID thrdid) HardwareThreadScheduler::The()[thrdid].Leak()->Busy(NO); - sched_jump_to_task(kHWThread[thrdid].mFramePtr); + if (!kSMPAware) { + sched_jump_to_task(kHWThread[thrdid].mFramePtr); + } return YES; } @@ -201,9 +203,9 @@ Void mp_init_cores(VoidPtr vendor_ptr) noexcept { volatile LAPIC* entry_struct = (volatile LAPIC*) entry_ptr; if (entry_struct->Flags & 0x1) { - kAPICLocales[kSMPCount] = entry_struct->ProcessorID; + kAPICLocales[kSMPCount] = entry_struct->ProcessorID; kHWThread[kSMPCount].mThreadID = kAPICLocales[kSMPCount]; - + ++kSMPCount; kout << "Kind: LAPIC: ON\r"; diff --git a/dev/kernel/HALKit/AMD64/HalDebugOutput.cc b/dev/kernel/HALKit/AMD64/HalDebugOutput.cc index b0463eb5..1e9fbab3 100644 --- a/dev/kernel/HALKit/AMD64/HalDebugOutput.cc +++ b/dev/kernel/HALKit/AMD64/HalDebugOutput.cc @@ -59,7 +59,7 @@ TerminalDevice::~TerminalDevice() = default; STATIC SizeT kX = kFontSizeX, kY = kFontSizeY; -EXTERN_C void ke_utf_io_write(IDeviceObject<const Utf8Char*>* obj, const Utf8Char* bytes) { +EXTERN_C void ke_utf_io_write(DeviceInterface<const Utf8Char*>* obj, const Utf8Char* bytes) { NE_UNUSED(bytes); NE_UNUSED(obj); @@ -115,7 +115,7 @@ EXTERN_C void ke_utf_io_write(IDeviceObject<const Utf8Char*>* obj, const Utf8Cha #endif // __DEBUG__ } -EXTERN_C void ke_io_write(IDeviceObject<const Char*>* obj, const Char* bytes) { +EXTERN_C void ke_io_write(DeviceInterface<const Char*>* obj, const Char* bytes) { NE_UNUSED(bytes); NE_UNUSED(obj); @@ -171,7 +171,7 @@ EXTERN_C void ke_io_write(IDeviceObject<const Char*>* obj, const Char* bytes) { #endif // __DEBUG__ } -EXTERN_C void ke_io_read(IDeviceObject<const Char*>*, const Char* bytes) { +EXTERN_C void ke_io_read(DeviceInterface<const Char*>*, const Char* bytes) { NE_UNUSED(bytes); #ifdef __DEBUG__ @@ -218,7 +218,7 @@ Utf8TerminalDevice::~Utf8TerminalDevice() = default; Utf8TerminalDevice Utf8TerminalDevice::The() noexcept { Utf8TerminalDevice out(Kernel::ke_utf_io_write, - [](IDeviceObject<const Utf8Char*>*, const Utf8Char*) -> Void {}); + [](DeviceInterface<const Utf8Char*>*, const Utf8Char*) -> Void {}); return out; } diff --git a/dev/kernel/HALKit/AMD64/HalSchedulerCorePrimitives.cc b/dev/kernel/HALKit/AMD64/HalSchedulerCorePrimitives.cc index 0c468e14..1dbce4ac 100644 --- a/dev/kernel/HALKit/AMD64/HalSchedulerCorePrimitives.cc +++ b/dev/kernel/HALKit/AMD64/HalSchedulerCorePrimitives.cc @@ -22,7 +22,7 @@ EXTERN_C Void __zka_pure_call(USER_PROCESS* process) { /// @param stack_ptr the frame pointer. /***********************************************************************************/ -EXTERN_C Bool hal_check_stack(HAL::StackFramePtr stack_ptr) { +EXTERN_C Bool hal_check_task(HAL::StackFramePtr stack_ptr) { if (!stack_ptr) return No; return stack_ptr->SP != 0 && stack_ptr->IP != 0; diff --git a/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc b/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc index b30bfc32..cd41480a 100644 --- a/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc +++ b/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc @@ -546,7 +546,8 @@ namespace Detail { /// @brief Read AHCI device. /// @param self device /// @param mnt mounted disk. - STATIC Void sk_io_read_ahci(IDeviceObject<MountpointInterface*>* self, MountpointInterface* mnt) { + STATIC Void sk_io_read_ahci(DeviceInterface<MountpointInterface*>* self, + MountpointInterface* mnt) { AHCIDeviceInterface* dev = (AHCIDeviceInterface*) self; err_global_get() = kErrorDisk; @@ -567,8 +568,8 @@ namespace Detail { /// @brief Write AHCI device. /// @param self device /// @param mnt mounted disk. - STATIC Void sk_io_write_ahci(IDeviceObject<MountpointInterface*>* self, - MountpointInterface* mnt) { + STATIC Void sk_io_write_ahci(DeviceInterface<MountpointInterface*>* self, + MountpointInterface* mnt) { AHCIDeviceInterface* dev = (AHCIDeviceInterface*) self; err_global_get() = kErrorDisk; diff --git a/dev/kernel/HALKit/AMD64/Storage/PIO+Generic.cc b/dev/kernel/HALKit/AMD64/Storage/PIO+Generic.cc index 99e1c619..6fccbdfa 100644 --- a/dev/kernel/HALKit/AMD64/Storage/PIO+Generic.cc +++ b/dev/kernel/HALKit/AMD64/Storage/PIO+Generic.cc @@ -200,7 +200,8 @@ namespace Detail { /// @brief Read PIO device. /// @param self device /// @param mnt mounted disk. - STATIC Void sk_io_read_pio(IDeviceObject<MountpointInterface*>* self, MountpointInterface* mnt) { + STATIC Void sk_io_read_pio(DeviceInterface<MountpointInterface*>* self, + MountpointInterface* mnt) { ATADeviceInterface* dev = (ATADeviceInterface*) self; err_global_get() = kErrorDisk; @@ -221,7 +222,8 @@ namespace Detail { /// @brief Write PIO device. /// @param self device /// @param mnt mounted disk. - STATIC Void sk_io_write_pio(IDeviceObject<MountpointInterface*>* self, MountpointInterface* mnt) { + STATIC Void sk_io_write_pio(DeviceInterface<MountpointInterface*>* self, + MountpointInterface* mnt) { ATADeviceInterface* dev = (ATADeviceInterface*) self; err_global_get() = kErrorDisk; diff --git a/dev/kernel/HALKit/ARM64/HalCommonAPI.s b/dev/kernel/HALKit/ARM64/HalCommonAPI.s index e76b6e3f..f0c69368 100644 --- a/dev/kernel/HALKit/ARM64/HalCommonAPI.s +++ b/dev/kernel/HALKit/ARM64/HalCommonAPI.s @@ -5,5 +5,5 @@ .global hal_flush_tlb hal_flush_tlb: - tlbi + tlbi vmalle1 ret diff --git a/dev/kernel/HALKit/ARM64/HalDebugOutput.cc b/dev/kernel/HALKit/ARM64/HalDebugOutput.cc index 3c518e2f..64004ac3 100644 --- a/dev/kernel/HALKit/ARM64/HalDebugOutput.cc +++ b/dev/kernel/HALKit/ARM64/HalDebugOutput.cc @@ -10,7 +10,7 @@ #include <NeKit/Utils.h> namespace Kernel { -EXTERN_C void ke_io_write(IDeviceObject<const Char*>* self, const Char* bytes) { +EXTERN_C void ke_io_write(DeviceInterface<const Char*>* self, const Char* bytes) { #ifdef __DEBUG__ if (*bytes == 0) return; @@ -33,7 +33,7 @@ EXTERN_C void ke_io_write(IDeviceObject<const Char*>* self, const Char* bytes) { TerminalDevice::~TerminalDevice() = default; -EXTERN_C void ke_io_read(IDeviceObject<const Char*>* self, const Char* bytes) { +EXTERN_C void ke_io_read(DeviceInterface<const Char*>* self, const Char* bytes) { #ifdef __DEBUG__ SizeT index = 0; diff --git a/dev/kernel/HALKit/ARM64/HalKernelPanic.cc b/dev/kernel/HALKit/ARM64/HalKernelPanic.cc index 5feb6c75..d70fef00 100644 --- a/dev/kernel/HALKit/ARM64/HalKernelPanic.cc +++ b/dev/kernel/HALKit/ARM64/HalKernelPanic.cc @@ -33,7 +33,6 @@ Void ke_panic(const Kernel::Int32& id, const Char* message) { (Void)(kout << "*** STOP ***\r"); (Void)(kout << "Kernel_Panic_MSG: " << message << kendl); (Void)(kout << "Kernel_Panic_ID: " << hex_number(id) << kendl); - (Void)(kout << "Kernel_Panic_CR2: " << hex_number((UIntPtr) hal_read_cr2()) << kendl); RecoveryFactory::Recover(); } diff --git a/dev/kernel/HALKit/ARM64/HalSchedulerCorePrimitives.cc b/dev/kernel/HALKit/ARM64/HalSchedulerCorePrimitives.cc index ee286639..10f95e29 100644 --- a/dev/kernel/HALKit/ARM64/HalSchedulerCorePrimitives.cc +++ b/dev/kernel/HALKit/ARM64/HalSchedulerCorePrimitives.cc @@ -22,7 +22,7 @@ EXTERN_C Void __zka_pure_call(USER_PROCESS* process) { /// @param stack_ptr the frame pointer.
/***********************************************************************************/
-EXTERN_C Bool hal_check_stack(HAL::StackFramePtr stack_ptr) {
+EXTERN_C Bool hal_check_task(HAL::StackFramePtr stack_ptr) {
if (!stack_ptr) return No;
return stack_ptr->SP != 0 && stack_ptr->IP != 0;
diff --git a/dev/kernel/KernelKit/CoreProcessScheduler.h b/dev/kernel/KernelKit/CoreProcessScheduler.h index 5ba29d3a..c06ef92c 100644 --- a/dev/kernel/KernelKit/CoreProcessScheduler.h +++ b/dev/kernel/KernelKit/CoreProcessScheduler.h @@ -130,7 +130,7 @@ enum class ProcessStatusKind : Int32 { //! @brief Affinity is the amount of nano-seconds this process is going to run. /***********************************************************************************/ enum class AffinityKind : Int32 { - kRealTime = 50, + kRealTime = 100, kVeryHigh = 150, kHigh = 200, kStandard = 1000, @@ -208,7 +208,7 @@ struct PROCESS_IMAGE final { Bool HasImage() const { return this->fBlob != nullptr; } - ErrorOr<ImagePtr> Leak() { + ErrorOr<ImagePtr> LeakImage() { if (this->fCode) { return ErrorOr<ImagePtr>{this->fCode}; } diff --git a/dev/kernel/KernelKit/DebugOutput.h b/dev/kernel/KernelKit/DebugOutput.h index 9598f590..de3bc997 100644 --- a/dev/kernel/KernelKit/DebugOutput.h +++ b/dev/kernel/KernelKit/DebugOutput.h @@ -37,9 +37,9 @@ inline TerminalDevice hex_number(const Long& x); // @brief Emulates a VT100 terminal. class TerminalDevice final NE_DEVICE<const Char*> { public: - TerminalDevice(void (*print)(IDeviceObject*, const Char*), - void (*gets)(IDeviceObject*, const Char*)) - : IDeviceObject<const Char*>(print, gets) {} + TerminalDevice(void (*print)(DeviceInterface*, const Char*), + void (*gets)(DeviceInterface*, const Char*)) + : DeviceInterface<const Char*>(print, gets) {} ~TerminalDevice() override; @@ -54,9 +54,9 @@ class TerminalDevice final NE_DEVICE<const Char*> { class Utf8TerminalDevice final NE_DEVICE<const Utf8Char*> { public: - Utf8TerminalDevice(void (*print)(IDeviceObject*, const Utf8Char*), - void (*gets)(IDeviceObject*, const Utf8Char*)) - : IDeviceObject<const Utf8Char*>(print, gets) {} + Utf8TerminalDevice(void (*print)(DeviceInterface*, const Utf8Char*), + void (*gets)(DeviceInterface*, const Utf8Char*)) + : DeviceInterface<const Utf8Char*>(print, gets) {} ~Utf8TerminalDevice() override; diff --git a/dev/kernel/KernelKit/DeviceMgr.h b/dev/kernel/KernelKit/DeviceMgr.h index 7c7b9da3..c6467190 100644 --- a/dev/kernel/KernelKit/DeviceMgr.h +++ b/dev/kernel/KernelKit/DeviceMgr.h @@ -24,13 +24,13 @@ #define kDeviceMgrRootDirPath "/devices/" -#define NE_DEVICE : public ::Kernel::IDeviceObject +#define NE_DEVICE : public ::Kernel::DeviceInterface // Last Rev: Wed, May 27, 2025 6:22 PM namespace Kernel { template <typename T> -class IDeviceObject; +class DeviceInterface; template <typename T> class IOBuf; @@ -39,24 +39,26 @@ class IOBuf; /// @brief Device contract interface, represents an HW device. /***********************************************************************************/ template <typename T> -class IDeviceObject { +class DeviceInterface { public: - explicit IDeviceObject(void (*Out)(IDeviceObject<T>*, T), void (*In)(IDeviceObject<T>*, T)) + DeviceInterface() = default; + + explicit DeviceInterface(void (*Out)(DeviceInterface<T>*, T), void (*In)(DeviceInterface<T>*, T)) : fOut(Out), fIn(In) {} - virtual ~IDeviceObject() = default; + virtual ~DeviceInterface() = default; public: - IDeviceObject& operator=(const IDeviceObject<T>&) = default; - IDeviceObject(const IDeviceObject<T>&) = default; + DeviceInterface& operator=(const DeviceInterface<T>&) = default; + DeviceInterface(const DeviceInterface<T>&) = default; public: - virtual IDeviceObject<T>& operator<<(T Data) { + virtual DeviceInterface<T>& operator<<(T Data) { fOut(this, Data); return *this; } - virtual IDeviceObject<T>& operator>>(T Data) { + virtual DeviceInterface<T>& operator>>(T Data) { fIn(this, Data); return *this; } @@ -68,8 +70,8 @@ class IDeviceObject { Bool operator!() { return !fOut || !fIn; } protected: - Void (*fOut)(IDeviceObject<T>*, T Data) = {nullptr}; - Void (*fIn)(IDeviceObject<T>*, T Data) = {nullptr}; + Void (*fOut)(DeviceInterface<T>*, T Data) = {nullptr}; + Void (*fIn)(DeviceInterface<T>*, T Data) = {nullptr}; }; /// diff --git a/dev/kernel/KernelKit/UserMgr.h b/dev/kernel/KernelKit/UserMgr.h index 82f8ca66..ef1cc659 100644 --- a/dev/kernel/KernelKit/UserMgr.h +++ b/dev/kernel/KernelKit/UserMgr.h @@ -20,8 +20,8 @@ #include <NeKit/Defines.h> #include <NeKit/KString.h> -///! We got the Super, Standard (%s format) and Guest user, -///! all are used to make authorization operations on the OS. +///! We got the MGMT, STD (%s format) and GUEST users, +///! all are used to make authorized operations. #define kSuperUser "OS AUTHORITY/MGMT/%s" #define kGuestUser "OS AUTHORITY/GUEST/%s" #define kStdUser "OS AUTHORITY/STD/%s" @@ -34,11 +34,11 @@ namespace Kernel { class User; -enum class UserRingKind { +enum class UserRingKind : Int32 { kRingInvalid = 0, - kRingStdUser = 1, - kRingSuperUser = 2, - kRingGuestUser = 5, + kRingStdUser = 444, + kRingSuperUser = 666, + kRingGuestUser = 777, kRingCount = 3, }; diff --git a/dev/kernel/KernelKit/UserProcessScheduler.h b/dev/kernel/KernelKit/UserProcessScheduler.h index 14986ab6..7c994726 100644 --- a/dev/kernel/KernelKit/UserProcessScheduler.h +++ b/dev/kernel/KernelKit/UserProcessScheduler.h @@ -125,7 +125,7 @@ class USER_PROCESS final { /***********************************************************************************/ //! @brief Gets the local exit code. /***********************************************************************************/ - const UInt32& GetExitCode() noexcept; + KPCError& GetExitCode() noexcept; /***********************************************************************************/ ///! @brief Get the process's name @@ -137,21 +137,22 @@ class USER_PROCESS final { //! @brief return local error code of process. //! @return Int32 local error code. /***********************************************************************************/ - Int32& GetLocalCode() noexcept; + KPCError& GetLocalCode() noexcept; const User* GetOwner() noexcept; const ProcessStatusKind& GetStatus() noexcept; const AffinityKind& GetAffinity() noexcept; private: - UInt32 fLastExitCode{0}; - Int32 fLocalCode{0}; + KPCError LastExitCode{0}; + KPCError LocalCode{0}; friend UserProcessScheduler; friend UserProcessHelper; }; typedef Array<USER_PROCESS, kSchedProcessLimitPerTeam> USER_PROCESS_ARRAY; +typedef Ref<USER_PROCESS> USER_PROCESS_REF; /// \brief Processs Team (contains multiple processes inside it.) /// Equivalent to a process batch @@ -168,9 +169,9 @@ class UserProcessTeam final { public: USER_PROCESS_ARRAY mProcessList; - Ref<USER_PROCESS> mCurrentProcess; + USER_PROCESS_REF mCurrentProcess; ProcessID mTeamId{0}; - ProcessID mProcessCount{0}; + ProcessID mProcessCur{0}; }; /***********************************************************************************/ @@ -204,8 +205,8 @@ class UserProcessScheduler final : public ISchedulable { Bool HasMP() override; public: - Ref<USER_PROCESS>& TheCurrentProcess(); - SizeT Run() noexcept; + USER_PROCESS_REF& TheCurrentProcess(); + SizeT Run() noexcept; public: STATIC UserProcessScheduler& The(); diff --git a/dev/kernel/NeKit/ErrorOr.h b/dev/kernel/NeKit/ErrorOr.h index d7751b7e..b653e0ee 100644 --- a/dev/kernel/NeKit/ErrorOr.h +++ b/dev/kernel/NeKit/ErrorOr.h @@ -18,13 +18,13 @@ using ErrorT = UInt; template <typename T> class ErrorOr final { public: - ErrorOr() = default; - ~ErrorOr() = default; + explicit ErrorOr() = default; + ~ErrorOr() = default; public: - explicit ErrorOr(Int32 err) : mId(err) {} + explicit ErrorOr(Int32 err) : mRef((T*) RTL_ALLOCA(sizeof(T))), mId(err) {} - explicit ErrorOr(nullPtr Null) {} + explicit ErrorOr(nullPtr) {} explicit ErrorOr(T* Class) : mRef(Class) {} @@ -48,7 +48,7 @@ class ErrorOr final { private: Ref<T> mRef; - UInt32 mId{0}; + Int32 mId{0}; }; using ErrorOrAny = ErrorOr<voidPtr>; diff --git a/dev/kernel/NeKit/Ref.h b/dev/kernel/NeKit/Ref.h index 9920aa6f..4d343bc5 100644 --- a/dev/kernel/NeKit/Ref.h +++ b/dev/kernel/NeKit/Ref.h @@ -8,6 +8,7 @@ #ifndef _NEWKIT_REF_H_ #define _NEWKIT_REF_H_ +#include <CompilerKit/CompilerKit.h> #include <KernelKit/HeapMgr.h> #include <NeKit/Defines.h> #include <NeKit/KernelPanic.h> @@ -16,41 +17,33 @@ namespace Kernel { template <typename T> class Ref final { public: - Ref() = default; - - ~Ref() { - if (mm_is_valid_ptr(fClass)) delete fClass; - } + explicit Ref() = default; + ~Ref() = default; public: - Ref(T* cls) : fClass(cls) {} - - Ref(T cls) : fClass(nullptr) { fClass = &cls; } + Ref(T* cls) : fClass(*cls) {} + Ref(T cls) : fClass(cls) {} Ref& operator=(T ref) { - fClass = &ref; + fClass = ref; return *this; } + NE_COPY_DEFAULT(Ref); + public: - T operator->() const { - MUST_PASS(*fClass); - return *fClass; - } + T operator->() const { return fClass; } - T& Leak() noexcept { return *fClass; } + T& Leak() noexcept { return fClass; } - T& TryLeak() const noexcept { - MUST_PASS(*fClass); - return *fClass; - } + T& TryLeak() const noexcept { return fClass; } - T operator*() { return *fClass; } + T operator*() { return fClass; } - operator bool() noexcept { return fClass; } + operator bool() noexcept { return true; } private: - T* fClass{nullptr}; + T fClass; }; template <typename T> @@ -70,7 +63,7 @@ class NonNullRef final { NonNullRef(const NonNullRef<T>& ref) = default; private: - Ref<T> fRef{nullptr}; + Ref<T> fRef{}; }; } // namespace Kernel diff --git a/dev/kernel/NetworkKit/NetworkDevice.h b/dev/kernel/NetworkKit/NetworkDevice.h index c37d8504..04d208c5 100644 --- a/dev/kernel/NetworkKit/NetworkDevice.h +++ b/dev/kernel/NetworkKit/NetworkDevice.h @@ -21,8 +21,8 @@ class NetworkDevice; */ class NetworkDevice final NE_DEVICE<NetworkDeviceCommand> { public: - NetworkDevice(void (*out)(IDeviceObject<NetworkDeviceCommand>*, NetworkDeviceCommand), - void (*in)(IDeviceObject<NetworkDeviceCommand>*, NetworkDeviceCommand), + NetworkDevice(void (*out)(DeviceInterface<NetworkDeviceCommand>*, NetworkDeviceCommand), + void (*in)(DeviceInterface<NetworkDeviceCommand>*, NetworkDeviceCommand), void (*cleanup)(void) = nullptr); ~NetworkDevice() override; diff --git a/dev/kernel/NetworkKit/NetworkDevice.inl b/dev/kernel/NetworkKit/NetworkDevice.inl index 84ec9edc..6ef480a9 100644 --- a/dev/kernel/NetworkKit/NetworkDevice.inl +++ b/dev/kernel/NetworkKit/NetworkDevice.inl @@ -13,12 +13,12 @@ #endif // __INC_NETWORK_DEVICE_H__ namespace Kernel { -inline NetworkDevice::NetworkDevice(void (*out)(IDeviceObject<NetworkDeviceCommand>*, +inline NetworkDevice::NetworkDevice(void (*out)(DeviceInterface<NetworkDeviceCommand>*, NetworkDeviceCommand), - void (*in)(IDeviceObject<NetworkDeviceCommand>*, + void (*in)(DeviceInterface<NetworkDeviceCommand>*, NetworkDeviceCommand), void (*on_cleanup)(void)) - : IDeviceObject<NetworkDeviceCommand>(out, in), fCleanup(on_cleanup) { + : DeviceInterface<NetworkDeviceCommand>(out, in), fCleanup(on_cleanup) { kout << "NetworkDevice initialized.\r"; MUST_PASS(out && in && on_cleanup); diff --git a/dev/kernel/StorageKit/AHCI.h b/dev/kernel/StorageKit/AHCI.h index e2220719..3b9dac67 100644 --- a/dev/kernel/StorageKit/AHCI.h +++ b/dev/kernel/StorageKit/AHCI.h @@ -13,11 +13,11 @@ namespace Kernel { /// @brief AHCIDeviceInterface class /// @details This class is used to send and receive data from the AHCI device. -/// @note The class is derived from the IDeviceObject class. +/// @note The class is derived from the DeviceInterface class. class AHCIDeviceInterface NE_DEVICE<MountpointInterface*> { public: - explicit AHCIDeviceInterface(void (*out)(IDeviceObject* self, MountpointInterface* out), - void (*in)(IDeviceObject* self, MountpointInterface* in)); + explicit AHCIDeviceInterface(void (*out)(DeviceInterface* self, MountpointInterface* out), + void (*in)(DeviceInterface* self, MountpointInterface* in)); virtual ~AHCIDeviceInterface() override; diff --git a/dev/kernel/StorageKit/ATA.h b/dev/kernel/StorageKit/ATA.h index abf255a5..d4c894a3 100644 --- a/dev/kernel/StorageKit/ATA.h +++ b/dev/kernel/StorageKit/ATA.h @@ -13,10 +13,10 @@ namespace Kernel { /// @brief ATA device interface class. -class ATADeviceInterface : public IDeviceObject<MountpointInterface*> { +class ATADeviceInterface : public DeviceInterface<MountpointInterface*> { public: - explicit ATADeviceInterface(void (*Out)(IDeviceObject*, MountpointInterface* outpacket), - void (*In)(IDeviceObject*, MountpointInterface* inpacket)); + explicit ATADeviceInterface(void (*Out)(DeviceInterface*, MountpointInterface* outpacket), + void (*In)(DeviceInterface*, MountpointInterface* inpacket)); virtual ~ATADeviceInterface(); diff --git a/dev/kernel/StorageKit/NVME.h b/dev/kernel/StorageKit/NVME.h index aae36a94..1b2b6358 100644 --- a/dev/kernel/StorageKit/NVME.h +++ b/dev/kernel/StorageKit/NVME.h @@ -12,8 +12,8 @@ namespace Kernel { class NVMEDeviceInterface final NE_DEVICE<MountpointInterface*> { public: - explicit NVMEDeviceInterface(Void (*out)(IDeviceObject*, MountpointInterface* out_packet), - Void (*in)(IDeviceObject*, MountpointInterface* in_packet), + explicit NVMEDeviceInterface(Void (*out)(DeviceInterface*, MountpointInterface* out_packet), + Void (*in)(DeviceInterface*, MountpointInterface* in_packet), Void (*cleanup)(Void)); ~NVMEDeviceInterface() override; diff --git a/dev/kernel/StorageKit/StorageKit.h b/dev/kernel/StorageKit/StorageKit.h index adb9f5dc..411aa6ae 100644 --- a/dev/kernel/StorageKit/StorageKit.h +++ b/dev/kernel/StorageKit/StorageKit.h @@ -12,7 +12,7 @@ namespace Kernel { template <typename T> -class IDeviceObject; +class DeviceInterface; class NVMEDeviceInterface; class AHCIDeviceInterface; diff --git a/dev/kernel/src/CxxAbi-ARM64.cc b/dev/kernel/src/CxxAbi-ARM64.cc index 02f3dbcf..d351b024 100644 --- a/dev/kernel/src/CxxAbi-ARM64.cc +++ b/dev/kernel/src/CxxAbi-ARM64.cc @@ -19,7 +19,7 @@ Kernel::UIntPtr __dso_handle; EXTERN_C void __chkstk(void) {} -EXTERN_C int atexit(void (*f)(void*), void* arg, void* dso) { +EXTERN_C int atexit(void (*f)(), void* arg, void* dso) { if (__atexit_func_count >= kAtExitMacDestructors) return 1; __atexit_funcs[__atexit_func_count].destructor_func = f; @@ -36,7 +36,8 @@ EXTERN_C void __cxa_finalize(void* f) { if (!f) { while (i--) { if (__atexit_funcs[i].destructor_func) { - (*__atexit_funcs[i].destructor_func)(__atexit_funcs[i].obj_ptr); + (*__atexit_funcs[i].destructor_func)(); + __atexit_funcs[i].destructor_func = 0; }; } @@ -45,7 +46,7 @@ EXTERN_C void __cxa_finalize(void* f) { while (i--) { if (__atexit_funcs[i].destructor_func) { - (*__atexit_funcs[i].destructor_func)(__atexit_funcs[i].obj_ptr); + (*__atexit_funcs[i].destructor_func)(); __atexit_funcs[i].destructor_func = 0; }; } diff --git a/dev/kernel/src/Gfx/FBDeviceInterface.cc b/dev/kernel/src/Gfx/FBDeviceInterface.cc index d588e8c8..f1867b45 100644 --- a/dev/kernel/src/Gfx/FBDeviceInterface.cc +++ b/dev/kernel/src/Gfx/FBDeviceInterface.cc @@ -12,9 +12,9 @@ using namespace Kernel; /// @param Out Drive output /// @param In Drive input /// @param Cleanup Drive cleanup. -FBDeviceInterface::FBDeviceInterface(void (*out)(IDeviceObject* self, FBDevicePacket* outpacket), - void (*in)(IDeviceObject* self, FBDevicePacket* inpacket)) - : IDeviceObject(out, in) {} +FBDeviceInterface::FBDeviceInterface(void (*out)(DeviceInterface* self, FBDevicePacket* outpacket), + void (*in)(DeviceInterface* self, FBDevicePacket* inpacket)) + : DeviceInterface(out, in) {} /// @brief Class desctructor FBDeviceInterface::~FBDeviceInterface() = default; diff --git a/dev/kernel/src/HardwareThreadScheduler.cc b/dev/kernel/src/HardwareThreadScheduler.cc index 78bad9d6..86f46718 100644 --- a/dev/kernel/src/HardwareThreadScheduler.cc +++ b/dev/kernel/src/HardwareThreadScheduler.cc @@ -20,7 +20,7 @@ namespace Kernel { /// @note Those symbols are needed in order to switch and validate the stack. /***********************************************************************************/ -EXTERN_C Bool hal_check_stack(HAL::StackFramePtr frame); +EXTERN_C Bool hal_check_task(HAL::StackFramePtr frame); EXTERN_C Bool mp_register_task(HAL::StackFramePtr frame, ProcessID pid); STATIC HardwareThreadScheduler kHardwareThreadScheduler; @@ -96,7 +96,7 @@ Bool HardwareThread::Switch(HAL::StackFramePtr frame) { return NO; } - if (!hal_check_stack(frame)) { + if (!hal_check_task(frame)) { return NO; } @@ -145,7 +145,7 @@ HAL::StackFramePtr HardwareThreadScheduler::Leak() noexcept { */ /***********************************************************************************/ Ref<HardwareThread*> HardwareThreadScheduler::operator[](SizeT idx) { - if (idx >= kMaxAPInsideSched) { + if (idx > kMaxAPInsideSched) { HardwareThread* kFakeThread = nullptr; return {kFakeThread}; } diff --git a/dev/kernel/src/KString.cc b/dev/kernel/src/KString.cc index 9f332cdf..f5732280 100644 --- a/dev/kernel/src/KString.cc +++ b/dev/kernel/src/KString.cc @@ -64,7 +64,7 @@ bool KString::operator!=(const Char* rhs) const { } ErrorOr<KString> KStringBuilder::Construct(const Char* data) { - if (!data || *data == 0) return {}; + if (!data || *data == 0) return ErrorOr<KString>(new KString(0)); KString* view = new KString(rt_string_len(data)); (*view) += data; diff --git a/dev/kernel/src/Pmm.cc b/dev/kernel/src/Pmm.cc index b9fba20e..7f5050f9 100644 --- a/dev/kernel/src/Pmm.cc +++ b/dev/kernel/src/Pmm.cc @@ -35,7 +35,7 @@ Ref<PTEWrapper> Pmm::RequestPage(Boolean user, Boolean readWrite) { if (pt.fPresent) { kout << "[PMM]: Allocation failed.\r"; - return {}; + return {pt}; } return Ref<PTEWrapper>(pt); diff --git a/dev/kernel/src/Storage/AHCIDeviceInterface.cc b/dev/kernel/src/Storage/AHCIDeviceInterface.cc index 2d97eee7..39570665 100644 --- a/dev/kernel/src/Storage/AHCIDeviceInterface.cc +++ b/dev/kernel/src/Storage/AHCIDeviceInterface.cc @@ -12,11 +12,11 @@ using namespace Kernel; /// @param Out Drive output /// @param In Drive input /// @param Cleanup Drive cleanup. -AHCIDeviceInterface::AHCIDeviceInterface(void (*out)(IDeviceObject* self, +AHCIDeviceInterface::AHCIDeviceInterface(void (*out)(DeviceInterface* self, MountpointInterface* outpacket), - void (*in)(IDeviceObject* self, + void (*in)(DeviceInterface* self, MountpointInterface* inpacket)) - : IDeviceObject(out, in) {} + : DeviceInterface(out, in) {} /// @brief Class desctructor AHCIDeviceInterface::~AHCIDeviceInterface() = default; @@ -45,7 +45,7 @@ AHCIDeviceInterface& AHCIDeviceInterface::operator<<(MountpointInterface* mnt) { } } - return (AHCIDeviceInterface&) IDeviceObject<MountpointInterface*>::operator<<(mnt); + return (AHCIDeviceInterface&) DeviceInterface<MountpointInterface*>::operator<<(mnt); } /// @brief Input operator. @@ -67,7 +67,7 @@ AHCIDeviceInterface& AHCIDeviceInterface::operator>>(MountpointInterface* mnt) { } } - return (AHCIDeviceInterface&) IDeviceObject<MountpointInterface*>::operator>>(mnt); + return (AHCIDeviceInterface&) DeviceInterface<MountpointInterface*>::operator>>(mnt); } const UInt16& AHCIDeviceInterface::GetPortsImplemented() { diff --git a/dev/kernel/src/Storage/ATADeviceInterface.cc b/dev/kernel/src/Storage/ATADeviceInterface.cc index a66d812b..609837af 100644 --- a/dev/kernel/src/Storage/ATADeviceInterface.cc +++ b/dev/kernel/src/Storage/ATADeviceInterface.cc @@ -12,9 +12,10 @@ using namespace Kernel; /// @param Out Drive output /// @param In Drive input /// @param Cleanup Drive cleanup. -ATADeviceInterface::ATADeviceInterface(void (*Out)(IDeviceObject*, MountpointInterface* outpacket), - void (*In)(IDeviceObject*, MountpointInterface* inpacket)) - : IDeviceObject(Out, In) {} +ATADeviceInterface::ATADeviceInterface(void (*Out)(DeviceInterface*, + MountpointInterface* outpacket), + void (*In)(DeviceInterface*, MountpointInterface* inpacket)) + : DeviceInterface(Out, In) {} /// @brief Class desctructor ATADeviceInterface::~ATADeviceInterface() = default; @@ -43,7 +44,7 @@ ATADeviceInterface& ATADeviceInterface::operator<<(MountpointInterface* Data) { } } - return (ATADeviceInterface&) IDeviceObject<MountpointInterface*>::operator<<(Data); + return (ATADeviceInterface&) DeviceInterface<MountpointInterface*>::operator<<(Data); } /// @brief Input operator. @@ -65,7 +66,7 @@ ATADeviceInterface& ATADeviceInterface::operator>>(MountpointInterface* Data) { } } - return (ATADeviceInterface&) IDeviceObject<MountpointInterface*>::operator>>(Data); + return (ATADeviceInterface&) DeviceInterface<MountpointInterface*>::operator>>(Data); } const UInt32& ATADeviceInterface::GetIndex() { diff --git a/dev/kernel/src/Storage/NVMEDeviceInterface.cc b/dev/kernel/src/Storage/NVMEDeviceInterface.cc index cff776c9..077595cf 100644 --- a/dev/kernel/src/Storage/NVMEDeviceInterface.cc +++ b/dev/kernel/src/Storage/NVMEDeviceInterface.cc @@ -7,11 +7,10 @@ #include <StorageKit/NVME.h> namespace Kernel { -NVMEDeviceInterface::NVMEDeviceInterface(void (*out)(IDeviceObject*, - MountpointInterface* outpacket), - void (*in)(IDeviceObject*, MountpointInterface* inpacket), - void (*cleanup)(void)) - : IDeviceObject(out, in), fCleanup(cleanup) {} +NVMEDeviceInterface::NVMEDeviceInterface( + void (*out)(DeviceInterface*, MountpointInterface* outpacket), + void (*in)(DeviceInterface*, MountpointInterface* inpacket), void (*cleanup)(void)) + : DeviceInterface(out, in), fCleanup(cleanup) {} NVMEDeviceInterface::~NVMEDeviceInterface() { if (fCleanup) fCleanup(); diff --git a/dev/kernel/src/UserMgr.cc b/dev/kernel/src/UserMgr.cc index c41b445b..8eade85e 100644 --- a/dev/kernel/src/UserMgr.cc +++ b/dev/kernel/src/UserMgr.cc @@ -4,8 +4,8 @@ * NeKernel * Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. * - * File: User.cc - * Purpose: User class, used to provide authentication and security. + * File: UserMgr.cc + * Purpose: User Manager, used to provide authentication and security. * * ======================================================== */ diff --git a/dev/kernel/src/UserProcessScheduler.cc b/dev/kernel/src/UserProcessScheduler.cc index 4bbd085a..e417cc8d 100644 --- a/dev/kernel/src/UserProcessScheduler.cc +++ b/dev/kernel/src/UserProcessScheduler.cc @@ -31,10 +31,6 @@ namespace Kernel { STATIC UInt32 kLastExitCode = 0U; -/***********************************************************************************/ -/// @brief Scheduler itself. -/***********************************************************************************/ - USER_PROCESS::USER_PROCESS() = default; USER_PROCESS::~USER_PROCESS() = default; @@ -71,16 +67,16 @@ USER_PROCESS::operator bool() { /// @return Int32 the last exit code. /***********************************************************************************/ -const UInt32& USER_PROCESS::GetExitCode() noexcept { - return this->fLastExitCode; +KPCError& USER_PROCESS::GetExitCode() noexcept { + return this->LastExitCode; } /***********************************************************************************/ /// @brief Error code variable getter. /***********************************************************************************/ -Int32& USER_PROCESS::GetLocalCode() noexcept { - return this->fLocalCode; +KPCError& USER_PROCESS::GetLocalCode() noexcept { + return this->LocalCode; } /***********************************************************************************/ @@ -262,12 +258,13 @@ STATIC Void sched_free_ptr_tree(PROCESS_HEAP_TREE<VoidPtr>* memory_ptr_list) { /***********************************************************************************/ Void USER_PROCESS::Exit(const Int32& exit_code) { - this->Status = exit_code > 0 ? ProcessStatusKind::kKilled : ProcessStatusKind::kFrozen; - this->fLastExitCode = exit_code; + this->Status = exit_code > 0 ? ProcessStatusKind::kKilled : ProcessStatusKind::kFrozen; + this->LastExitCode = exit_code; + this->UTime = 0; kLastExitCode = exit_code; - --this->ParentTeam->mProcessCount; + --this->ParentTeam->mProcessCur; auto memory_ptr_list = this->HeapTree; @@ -317,7 +314,7 @@ Void USER_PROCESS::Exit(const Int32& exit_code) { this->ProcessId = 0UL; this->Status = ProcessStatusKind::kFinished; - --this->ParentTeam->mProcessCount; + --this->ParentTeam->mProcessCur; } /***********************************************************************************/ @@ -363,13 +360,13 @@ ProcessID UserProcessScheduler::Spawn(const Char* name, VoidPtr code, VoidPtr im return -kErrorProcessFault; } - ProcessID pid = this->mTeam.mProcessCount; + ProcessID pid = this->mTeam.mProcessCur; if (pid > kSchedProcessLimitPerTeam) { return -kErrorProcessFault; } - ++this->mTeam.mProcessCount; + ++this->mTeam.mProcessCur; USER_PROCESS& process = this->mTeam.mProcessList[pid]; @@ -447,7 +444,7 @@ UserProcessScheduler& UserProcessScheduler::The() { /***********************************************************************************/ Void UserProcessScheduler::Remove(ProcessID process_id) { - if (process_id < 0 || process_id >= kSchedProcessLimitPerTeam) { + if (process_id < 0 || process_id > kSchedProcessLimitPerTeam) { return; } @@ -483,7 +480,7 @@ Bool UserProcessScheduler::HasMP() { /***********************************************************************************/ SizeT UserProcessScheduler::Run() noexcept { - if (mTeam.mProcessCount < 1) { + if (mTeam.mProcessCur < 1) { return 0UL; } @@ -507,6 +504,7 @@ SizeT UserProcessScheduler::Run() noexcept { if (UserProcessHelper::Switch(process.StackFrame, process.ProcessId)) { process.PTime = static_cast<Int32>(process.Affinity); + // We add a bigger cooldown according to the RTime and affinity here. if (process.PTime < process.RTime && AffinityKind::kRealTime != process.Affinity) { if (process.RTime < (Int32) AffinityKind::kVeryHigh) process.RTime = (Int32) AffinityKind::kLowUsage / 2; diff --git a/dev/kernel/src/UserProcessTeam.cc b/dev/kernel/src/UserProcessTeam.cc index 8ef9a013..dd21ac49 100644 --- a/dev/kernel/src/UserProcessTeam.cc +++ b/dev/kernel/src/UserProcessTeam.cc @@ -21,7 +21,7 @@ UserProcessTeam::UserProcessTeam() { this->mProcessList[i].ParentTeam = this; } - this->mProcessCount = 0UL; + this->mProcessCur = 0UL; } /***********************************************************************************/ diff --git a/dev/kernel/src/Utils.cc b/dev/kernel/src/Utils.cc index d7cc08af..087b6d5f 100644 --- a/dev/kernel/src/Utils.cc +++ b/dev/kernel/src/Utils.cc @@ -7,189 +7,188 @@ #include <NeKit/Utils.h> namespace Kernel { -Int32 rt_string_cmp(const Char* src, const Char* cmp, Size size) { - Int32 counter = 0; - - for (Size index = 0; index < size; ++index) { - if (src[index] != cmp[index]) ++counter; - } - return counter; -} +STATIC Int rt_copy_memory_safe(const voidPtr src, voidPtr dst, Size len, Size dst_size); +STATIC voidPtr rt_set_memory_safe(voidPtr dst, UInt32 value, Size len, Size dst_size); -Void rt_zero_memory(voidPtr pointer, Size len) { - rt_set_memory(pointer, 0, len); +Int32 rt_string_cmp(const Char* src, const Char* cmp, Size size) { + for (Size i = 0; i < size; ++i) { + if (src[i] != cmp[i]) + return static_cast<Int32>(src[i]) - static_cast<Int32>(cmp[i]); + } + return 0; } -SizeT rt_string_len(const Char* str, SizeT _len) { - SizeT len{0}; - - do { - if (len > _len) { - return _len; - } - +SizeT rt_string_len(const Char* str, SizeT max_len) { + SizeT len = 0; + while (len < max_len && str[len] != '\0') ++len; - } while (str[len] != '\0'); - return len; } Size rt_string_len(const Char* ptr) { - SizeT cnt{0}; - - while (ptr[cnt] != 0) ++cnt; - + Size cnt = 0; + while (ptr[cnt] != '\0') + ++cnt; return cnt; } -voidPtr rt_set_memory(voidPtr src, UInt32 value, Size len) { - UInt32* start = reinterpret_cast<UInt32*>(src); - - while (len) { - *start = value; - ++start; - --len; +const Char* rt_alloc_string(const Char* src) { + SizeT slen = rt_string_len(src); + Char* buffer = new Char[slen + 1]; + if (!buffer) return nullptr; + + if (rt_copy_memory_safe(reinterpret_cast<voidPtr>(const_cast<Char*>(src)), + reinterpret_cast<voidPtr>(buffer), + slen, + slen + 1) < 0) { + delete[] buffer; + return nullptr; } - return (voidPtr) start; + buffer[slen] = '\0'; + return buffer; } -Int rt_move_memory(const voidPtr src, voidPtr dst, Size len) { - Char* srcChr = reinterpret_cast<Char*>(src); - Char* dstChar = reinterpret_cast<Char*>(dst); - SizeT index = 0; - - while (index < len) { - dstChar[index] = srcChr[index]; - srcChr[index] = 0; - - ++index; +STATIC Int rt_copy_memory_safe(const voidPtr src, voidPtr dst, Size len, Size dst_size) { + if (!src || !dst || len > dst_size) { + if (dst && dst_size) { + rt_set_memory_safe(dst, 0, dst_size, dst_size); + } + return -1; } - - return 0; + auto s = reinterpret_cast<const UInt8*>(src); + auto d = reinterpret_cast<UInt8*>(dst); + for (Size i = 0; i < len; ++i) + d[i] = s[i]; + return static_cast<Int>(len); +} + +STATIC voidPtr rt_set_memory_safe(voidPtr dst, UInt32 value, Size len, Size dst_size) { + if (!dst || len > dst_size) return nullptr; + auto p = reinterpret_cast<UInt8*>(dst); + UInt8 v = static_cast<UInt8>(value & 0xFF); + for (Size i = 0; i < len; ++i) + p[i] = v; + return dst; } -Int rt_copy_memory(const voidPtr src, voidPtr dst, Size len) { - char* srcChr = reinterpret_cast<char*>(src); - char* dstChar = reinterpret_cast<char*>(dst); - Size index = 0; - - while (index < len) { - dstChar[index] = srcChr[index]; - ++index; - } - - dstChar[index] = 0; - - return index; +Void rt_zero_memory(voidPtr pointer, Size len) { + rt_set_memory_safe(pointer, 0, len, len); } -const Char* rt_alloc_string(const Char* src) { - const Char* string = new Char[rt_string_len(src) + 1]; - - if (!string) return nullptr; - - voidPtr v_src = reinterpret_cast<voidPtr>(const_cast<char*>(src)); - voidPtr v_dst = reinterpret_cast<voidPtr>(const_cast<char*>(string)); - - rt_copy_memory(v_src, v_dst, rt_string_len(src) + 1); - - return string; +#ifdef __NE_ENFORCE_DEPRECATED_WARNINGS +[[deprecated("Use rt_set_memory_safe instead")]] +#endif +voidPtr rt_set_memory(voidPtr src, UInt32 value, Size len) { + if (!src) return nullptr; + auto p = reinterpret_cast<UInt8*>(src); + UInt8 v = static_cast<UInt8>(value & 0xFF); + for (Size i = 0; i < len; ++i) + p[i] = v; + return src; } -Int32 rt_to_uppercase(Int32 character) { - if (character >= 'a' && character <= 'z') return character - 0x20; +#ifdef __NE_ENFORCE_DEPRECATED_WARNINGS +[[deprecated("Use rt_copy_memory_safe instead")]] +#endif +Int rt_copy_memory(const voidPtr src, voidPtr dst, Size len) { + if (!src || !dst) return -1; + auto s = reinterpret_cast<const UInt8*>(src); + auto d = reinterpret_cast<UInt8*>(dst); - return character; -} + for (Size i = 0; i < len; ++i) + d[i] = s[i]; -Int32 rt_is_alnum(Int32 character) { - return (character >= 'a' && character <= 'z') || (character >= 'A' && character <= 'Z') || - (character >= '0' && character <= '9'); + return static_cast<Int>(len); } -Int32 rt_to_lower(Int32 character) { - if (character >= 'A' && character <= 'Z') return character + 0x20; - return character; +Int32 rt_to_uppercase(Int32 ch) { + return (ch >= 'a' && ch <= 'z') ? ch - 0x20 : ch; } -Boolean rt_is_space(Char chr) { - return chr == ' '; +Int32 rt_to_lower(Int32 ch) { + return (ch >= 'A' && ch <= 'Z') ? ch + 0x20 : ch; } -Boolean rt_is_newln(Char chr) { - return chr == '\n'; +Int32 rt_is_alnum(Int32 ch) { + return (ch >= 'a' && ch <= 'z') || + (ch >= 'A' && ch <= 'Z') || + (ch >= '0' && ch <= '9'); } -VoidPtr rt_string_in_string(const Char* in, const Char* needle) { - for (SizeT i = 0; i < rt_string_len(in); ++i) { - if (rt_string_cmp(in + i, needle, rt_string_len(needle)) == 0) - return reinterpret_cast<voidPtr>(const_cast<char*>(in + i)); - } +Boolean rt_is_space(Char ch) { + return ch == ' '; +} - return nullptr; +Boolean rt_is_newln(Char ch) { + return ch == '\n'; } -Char rt_to_char(UInt64 base, Int32 limit) { - Char kNumbers[17] = "0123456789ABCDEF"; - return kNumbers[base % limit]; +Char rt_to_char(UInt64 value, Int32 base) { + static constexpr Char kDigits[] = "0123456789ABCDEF"; + return kDigits[value % base]; } -Bool rt_to_string(Char* str, UInt64 base, Int32 limit) { +Bool rt_to_string(Char* str, UInt64 value, Int32 base) { #ifdef __NE_AMD64__ - auto i = 0; - - auto final_number = base; - - auto mult = 1; - auto elems = 0L; - - base /= 10; - - while (base > 0) { - elems++; - mult *= 10; - base /= 10; - } - - while (elems > -1) { - final_number = (final_number % mult) * 10 + final_number / mult; - str[i] = rt_to_char(final_number, limit); - - --elems; - ++i; + Int i = 0; + do { + str[i++] = rt_to_char(value, base); + value /= base; + } while (value); + str[i] = '\0'; + // in-place + for (Int j = 0; j < i / 2; ++j) { + Char tmp = str[j]; + str[j] = str[i - j - 1]; + str[i - j - 1] = tmp; } #endif - - return YES; + return true; } -/// @brief Checks for a string start at the character. -Char* rt_string_has_char(Char* str, Char chr) { - while (*str != chr) { - ++str; +VoidPtr rt_string_in_string(const Char* haystack, const Char* needle) { + SizeT needle_len = rt_string_len(needle); + SizeT hay_len = rt_string_len(haystack); - if (*str == 0) return nullptr; + if (needle_len > hay_len) return nullptr; + for (SizeT i = 0; i <= hay_len - needle_len; ++i) { + if (rt_string_cmp(haystack + i, needle, needle_len) == 0) { + return reinterpret_cast<voidPtr>(const_cast<Char*>(haystack + i)); + } } + return nullptr; +} - return str; +Char* rt_string_has_char(Char* str, Char ch) { + while (*str && *str != ch) ++str; + return (*str == ch) ? str : nullptr; } -} // namespace Kernel -////// @note These symbols were written to satisfy gcc, clang and other compiler complaints. +Int32 rt_strcmp(const Char* a, const Char* b) { + Size i = 0; + while (a[i] != '\0' && b[i] != '\0' && a[i] == b[i]) { + ++i; + } + return static_cast<Int32>(static_cast<UInt8>(a[i]) - + static_cast<UInt8>(b[i])); +} -EXTERN_C void* memset(void* dst, int c, long long unsigned int len) { - return Kernel::rt_set_memory(dst, c, len); + // @uses the deprecated version callers should ensure 'len' is valid. +extern "C" void* memset(void* dst, int c, long long unsigned int len) { + return Kernel::rt_set_memory(dst, c, static_cast<Size>(len)); } -EXTERN_C void* memcpy(void* dst, const void* src, long long unsigned int len) { - Kernel::rt_copy_memory(const_cast<void*>(src), dst, len); +extern "C" void* memcpy(void* dst, const void* src, long long unsigned int len) { + Kernel::rt_copy_memory(const_cast<void*>(src), dst, static_cast<Size>(len)); return dst; } -EXTERN_C Kernel::Int32 strcmp(const char* dst, const char* src) { - return Kernel::rt_string_cmp(dst, src, Kernel::rt_string_len(dst)); +extern "C" Kernel::Int32 strcmp(const char* a, const char* b) { + return Kernel::rt_strcmp(a, b); } + +} |
