summaryrefslogtreecommitdiffhomepage
path: root/dev/kernel
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal@nekernel.org>2025-06-03 09:31:01 +0200
committerGitHub <noreply@github.com>2025-06-03 09:31:01 +0200
commit6511afbf405c31513bc88ab06bca58218610a994 (patch)
treee2509b7f9b59643b2a97773604aa383a2fd2e2f3 /dev/kernel
parent5c0bb7ee7b1b0fee02cc179fb21f4c57a61d6c2d (diff)
parentbebcbe04c2b47b3b4fcdc093b1736cc0295109fe (diff)
Merge pull request #36 from nekernel-org/dev
0.0.3 — NeKernel
Diffstat (limited to 'dev/kernel')
-rw-r--r--dev/kernel/DmaKit/DmaPool.h2
-rw-r--r--dev/kernel/FirmwareKit/EFI/EFI.h2
-rw-r--r--dev/kernel/FirmwareKit/GPT.h36
-rw-r--r--dev/kernel/GfxKit/FB.h6
-rw-r--r--dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc8
-rw-r--r--dev/kernel/HALKit/AMD64/HalDebugOutput.cc8
-rw-r--r--dev/kernel/HALKit/AMD64/HalSchedulerCorePrimitives.cc2
-rw-r--r--dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc7
-rw-r--r--dev/kernel/HALKit/AMD64/Storage/PIO+Generic.cc6
-rw-r--r--dev/kernel/HALKit/ARM64/HalCommonAPI.s2
-rw-r--r--dev/kernel/HALKit/ARM64/HalDebugOutput.cc4
-rw-r--r--dev/kernel/HALKit/ARM64/HalKernelPanic.cc1
-rw-r--r--dev/kernel/HALKit/ARM64/HalSchedulerCorePrimitives.cc2
-rw-r--r--dev/kernel/KernelKit/CoreProcessScheduler.h4
-rw-r--r--dev/kernel/KernelKit/DebugOutput.h12
-rw-r--r--dev/kernel/KernelKit/DeviceMgr.h24
-rw-r--r--dev/kernel/KernelKit/UserMgr.h12
-rw-r--r--dev/kernel/KernelKit/UserProcessScheduler.h17
-rw-r--r--dev/kernel/NeKit/ErrorOr.h10
-rw-r--r--dev/kernel/NeKit/Ref.h37
-rw-r--r--dev/kernel/NetworkKit/NetworkDevice.h4
-rw-r--r--dev/kernel/NetworkKit/NetworkDevice.inl6
-rw-r--r--dev/kernel/StorageKit/AHCI.h6
-rw-r--r--dev/kernel/StorageKit/ATA.h6
-rw-r--r--dev/kernel/StorageKit/NVME.h4
-rw-r--r--dev/kernel/StorageKit/StorageKit.h2
-rw-r--r--dev/kernel/src/CxxAbi-ARM64.cc7
-rw-r--r--dev/kernel/src/Gfx/FBDeviceInterface.cc6
-rw-r--r--dev/kernel/src/HardwareThreadScheduler.cc6
-rw-r--r--dev/kernel/src/KString.cc2
-rw-r--r--dev/kernel/src/Pmm.cc2
-rw-r--r--dev/kernel/src/Storage/AHCIDeviceInterface.cc10
-rw-r--r--dev/kernel/src/Storage/ATADeviceInterface.cc11
-rw-r--r--dev/kernel/src/Storage/NVMEDeviceInterface.cc9
-rw-r--r--dev/kernel/src/UserMgr.cc4
-rw-r--r--dev/kernel/src/UserProcessScheduler.cc30
-rw-r--r--dev/kernel/src/UserProcessTeam.cc2
-rw-r--r--dev/kernel/src/Utils.cc257
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);
}
+
+}