diff options
| author | Amlal El Mahrouss <amlal@nekernel.org> | 2025-08-16 19:56:21 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-08-16 19:56:21 +0200 |
| commit | 1a32b9307357ac0fc9095e853b2b6d94f9fe62bb (patch) | |
| tree | f41f723659c8926e38182fbe062746d821ab487e /dev/kernel | |
| parent | eb9df5eea339812513c25a8d3b2eeb03c633e7ac (diff) | |
| parent | b301047903b79560dce69085fc271a653a1eb4b6 (diff) | |
Merge pull request #55 from nekernel-org/dev
v0.0.4
Diffstat (limited to 'dev/kernel')
83 files changed, 794 insertions, 423 deletions
diff --git a/dev/kernel/ArchKit/ArchKit.h b/dev/kernel/ArchKit/ArchKit.h index a9dca240..37793370 100644 --- a/dev/kernel/ArchKit/ArchKit.h +++ b/dev/kernel/ArchKit/ArchKit.h @@ -77,9 +77,19 @@ struct HAL_DISPATCH_ENTRY final { operator bool() { return fHooked; } }; +typedef Kernel::Void (*rt_kerncall_proc)(Kernel::SizeT, Kernel::VoidPtr, Kernel::SizeT); + +struct HAL_KERNEL_DISPATCH_ENTRY final { + Kernel::UInt64 fHash; + Kernel::Bool fHooked; + rt_kerncall_proc fProc; + + operator bool() { return fHooked; } +}; + inline Kernel::Array<HAL_DISPATCH_ENTRY, kMaxDispatchCallCount> kSysCalls; -inline Kernel::Array<HAL_DISPATCH_ENTRY, kMaxDispatchCallCount> kKernCalls; +inline Kernel::Array<HAL_KERNEL_DISPATCH_ENTRY, kMaxDispatchCallCount> kKernCalls; #ifdef __NE_VIRTUAL_MEMORY_SUPPORT__ diff --git a/dev/kernel/DmaKit/DmaPool.h b/dev/kernel/DmaKit/DmaPool.h index ada8299e..99f43725 100644 --- a/dev/kernel/DmaKit/DmaPool.h +++ b/dev/kernel/DmaKit/DmaPool.h @@ -23,7 +23,11 @@ #define kNeDMAPoolSize (0x1000000) #endif +#ifdef __GNUC__ #define kNeDMABestAlign __BIGGEST_ALIGNMENT__ +#else +#define kNeDMABestAlign (8) +#endif namespace Kernel { /// @brief DMA pool base pointer, here we're sure that AHCI or whatever tricky standard sees it. @@ -37,7 +41,7 @@ inline const UInt8* kDmaPoolEnd = (UInt8*) (kNeDMAPoolStart + kNeDMAPoolSize); /***********************************************************************************/ inline VoidPtr rtl_dma_alloc(SizeT size, SizeT align) { if (!size) { - return nullptr; + ++size; } /// Check alignement according to architecture. @@ -69,7 +73,7 @@ inline VoidPtr rtl_dma_alloc(SizeT size, SizeT align) { inline Void rtl_dma_free(SizeT size) { if (!size) return; - auto ptr = (UInt8*) (kDmaPoolPtr - size); + auto ptr = (kDmaPoolPtr - size); if (!ptr || ptr < (UInt8*) kNeDMAPoolStart) { err_global_get() = kErrorDmaExhausted; @@ -98,4 +102,4 @@ inline Void rtl_dma_flush(VoidPtr ptr, SizeT size_buffer) { HAL::mm_memory_fence((VoidPtr) ((UInt8*) ptr + buf_idx)); } } -} // namespace Kernel
\ No newline at end of file +} // namespace Kernel diff --git a/dev/kernel/FSKit/HeFS.h b/dev/kernel/FSKit/HeFS.h index 845ef467..bb4e3dc0 100644 --- a/dev/kernel/FSKit/HeFS.h +++ b/dev/kernel/FSKit/HeFS.h @@ -259,7 +259,7 @@ inline UInt32 hefs_hour_get(ATime raw_atime) noexcept { /// @return the minute value.
/// @note The minute is stored in the lower 8 bits of the ATime value.
inline UInt32 hefs_minute_get(ATime raw_atime) noexcept {
- return (raw_atime) &0xFF;
+ return (raw_atime) & 0xFF;
}
inline constexpr UInt32 kHeFSBaseYear = 1970;
@@ -379,10 +379,10 @@ class HeFileSystemParser final { ~HeFileSystemParser() = default;
public:
- HeFileSystemParser(const HeFileSystemParser&) = delete;
+ HeFileSystemParser(const HeFileSystemParser&) = delete;
HeFileSystemParser& operator=(const HeFileSystemParser&) = delete;
- HeFileSystemParser(HeFileSystemParser&&) = delete;
+ HeFileSystemParser(HeFileSystemParser&&) = delete;
HeFileSystemParser& operator=(HeFileSystemParser&&) = delete;
public:
diff --git a/dev/kernel/FirmwareKit/EFI/EFI.h b/dev/kernel/FirmwareKit/EFI/EFI.h index 97e3ad01..9b22f5b6 100644 --- a/dev/kernel/FirmwareKit/EFI/EFI.h +++ b/dev/kernel/FirmwareKit/EFI/EFI.h @@ -57,7 +57,7 @@ typedef Char16 EfiChar16Type; /// @brief Core Handle Kind /// Self is like NT's Win32 HANDLE type. typedef struct EfiHandle { -} * EfiHandlePtr; +}* EfiHandlePtr; /* UEFI uses wide characters by default. */ typedef WideChar EfiCharType; @@ -239,63 +239,85 @@ typedef struct EfiTableHeader { UInt32 Reserved; } EfiTableHeader; -#define EFI_ACPI_TABLE_PROTOCOL_GUID \ - { \ - 0xffe06bdd, 0x6107, 0x46a6, { 0x7b, 0xb2, 0x5a, 0x9c, 0x7e, 0xc5, 0x27, 0x5c } \ +#define EFI_ACPI_TABLE_PROTOCOL_GUID \ + { \ + 0xffe06bdd, 0x6107, 0x46a6, { \ + 0x7b, 0xb2, 0x5a, 0x9c, 0x7e, 0xc5, 0x27, 0x5c \ + } \ } -#define EFI_LOAD_FILE_PROTOCOL_GUID \ - { \ - 0x56EC3091, 0x954C, 0x11d2, { 0x8e, 0x3f, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b } \ +#define EFI_LOAD_FILE_PROTOCOL_GUID \ + { \ + 0x56EC3091, 0x954C, 0x11d2, { \ + 0x8e, 0x3f, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b \ + } \ } -#define EFI_LOAD_FILE2_PROTOCOL_GUID \ - { \ - 0x4006c0c1, 0xfcb3, 0x403e, { 0x99, 0x6d, 0x4a, 0x6c, 0x87, 0x24, 0xe0, 0x6d } \ +#define EFI_LOAD_FILE2_PROTOCOL_GUID \ + { \ + 0x4006c0c1, 0xfcb3, 0x403e, { \ + 0x99, 0x6d, 0x4a, 0x6c, 0x87, 0x24, 0xe0, 0x6d \ + } \ } -#define EFI_LOADED_IMAGE_PROTOCOL_GUID \ - { \ - 0x5B1B31A1, 0x9562, 0x11d2, { 0x8E, 0x3F, 0x00, 0xA0, 0xC9, 0x69, 0x72, 0x3B } \ +#define EFI_LOADED_IMAGE_PROTOCOL_GUID \ + { \ + 0x5B1B31A1, 0x9562, 0x11d2, { \ + 0x8E, 0x3F, 0x00, 0xA0, 0xC9, 0x69, 0x72, 0x3B \ + } \ } -#define EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID \ - { \ - 0x9042a9de, 0x23dc, 0x4a38, { 0x96, 0xfb, 0x7a, 0xde, 0xd0, 0x80, 0x51, 0x6a } \ +#define EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID \ + { \ + 0x9042a9de, 0x23dc, 0x4a38, { \ + 0x96, 0xfb, 0x7a, 0xde, 0xd0, 0x80, 0x51, 0x6a \ + } \ } -#define EFI_SIMPLE_NETWORK_PROTOCOL_GUID \ - { \ - 0xA19832B9, 0xAC25, 0x11D3, { 0x9A, 0x2D, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d } \ +#define EFI_SIMPLE_NETWORK_PROTOCOL_GUID \ + { \ + 0xA19832B9, 0xAC25, 0x11D3, { \ + 0x9A, 0x2D, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d \ + } \ } #define EFI_SIMPLE_NETWORK_PROTOCOL_REVISION 0x00010000 -#define EFI_IP4_PROTOCOL_GUID \ - { \ - 0x41d94cd2, 0x35b6, 0x455a, { 0x82, 0x58, 0xd4, 0xe5, 0x13, 0x34, 0xaa, 0xdd } \ +#define EFI_IP4_PROTOCOL_GUID \ + { \ + 0x41d94cd2, 0x35b6, 0x455a, { \ + 0x82, 0x58, 0xd4, 0xe5, 0x13, 0x34, 0xaa, 0xdd \ + } \ } #define EFI_LOADED_IMAGE_PROTOCOL_REVISION 0x1000 -#define EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID \ - { \ - 0x0964e5b22, 0x6459, 0x11d2, { 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b } \ +#define EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID \ + { \ + 0x0964e5b22, 0x6459, 0x11d2, { \ + 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b \ + } \ } -#define EFI_LOADED_IMAGE_DEVICE_PATH_PROTOCOL_GUID \ - { \ - 0xbc62157e, 0x3e33, 0x4fec, { 0x99, 0x20, 0x2d, 0x3b, 0x36, 0xd7, 0x50, 0xdf } \ +#define EFI_LOADED_IMAGE_DEVICE_PATH_PROTOCOL_GUID \ + { \ + 0xbc62157e, 0x3e33, 0x4fec, { \ + 0x99, 0x20, 0x2d, 0x3b, 0x36, 0xd7, 0x50, 0xdf \ + } \ } -#define EFI_DEVICE_PATH_PROTOCOL_GUID \ - { \ - 0x9576e91, 0x6d3f, 0x11d2, { 0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b } \ +#define EFI_DEVICE_PATH_PROTOCOL_GUID \ + { \ + 0x9576e91, 0x6d3f, 0x11d2, { \ + 0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b \ + } \ } -#define EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID \ - { \ - 0x0964e5b22, 0x6459, 0x11d2, { 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b } \ +#define EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID \ + { \ + 0x0964e5b22, 0x6459, 0x11d2, { \ + 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b \ + } \ } typedef UInt64(EfiImageUnload)(EfiHandlePtr ImageHandle); @@ -351,17 +373,17 @@ typedef struct { typedef EFI_STATUS(EFIAPI* EFI_SIMPLE_NETWORK_TRANSMIT)(IN EFI_SIMPLE_NETWORK_PROTOCOL* This, IN UInt32 HeaderSize, IN UInt32 BufferSize, - IN Void* Buffer, - IN EfiMacAddress* SrcAddr OPTIONAL, + IN Void* Buffer, + IN EfiMacAddress* SrcAddr OPTIONAL, IN EfiMacAddress* DestAddr OPTIONAL, - IN UInt16* Protocol OPTIONAL); + IN UInt16* Protocol OPTIONAL); typedef EFI_STATUS(EFIAPI* EFI_SIMPLE_NETWORK_RECEIVE)(IN EFI_SIMPLE_NETWORK_PROTOCOL* This, - OUT UInt32* HeaderSize OPTIONAL, + OUT UInt32* HeaderSize OPTIONAL, IN OUT UInt32* BufferSize, OUT Void* Buffer, - OUT EfiMacAddress* SrcAddr OPTIONAL, + OUT EfiMacAddress* SrcAddr OPTIONAL, OUT EfiMacAddress* DestAddr OPTIONAL, - OUT UInt16* Protocol OPTIONAL); + OUT UInt16* Protocol OPTIONAL); typedef struct EFI_SIMPLE_NETWORK_PROTOCOL { UInt64 Revision; @@ -506,9 +528,11 @@ typedef struct EFI_GUID EFI_FINAL { * Protocol stuff... */ -#define EFI_SIMPLE_TEXT_INPUT_PROTOCOL_GUID \ - { \ - 0x387477c1, 0x69c7, 0x11d2, { 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b } \ +#define EFI_SIMPLE_TEXT_INPUT_PROTOCOL_GUID \ + { \ + 0x387477c1, 0x69c7, 0x11d2, { \ + 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b \ + } \ } /** some helpers */ @@ -607,7 +631,7 @@ typedef struct { } EfiInputKey; typedef EfiStatusType(EFI_API* EfiInputReadKey)(IN EfiSimpleTextInputProtocol* This, - OUT EfiInputKey* Key); + OUT EfiInputKey* Key); typedef EfiStatusType(EFI_API* EfiInputReset)(IN EfiSimpleTextInputProtocol* This, IN Boolean ExtendedChk); @@ -665,7 +689,7 @@ typedef struct EfiSystemTable { struct { EFI_GUID VendorGUID; VoidPtr VendorTable; - } * ConfigurationTable; + }* ConfigurationTable; } EfiSystemTable; #define kEfiOk 0 @@ -726,9 +750,11 @@ enum { #define EFI_EXTRA_DESCRIPTOR_SIZE 8 -#define EFI_MP_SERVICES_PROTOCOL_GUID \ - { \ - 0x3fdda605, 0xa76e, 0x4f46, { 0xad, 0x29, 0x12, 0xf4, 0x53, 0x1b, 0x3d, 0x08 } \ +#define EFI_MP_SERVICES_PROTOCOL_GUID \ + { \ + 0x3fdda605, 0xa76e, 0x4f46, { \ + 0xad, 0x29, 0x12, 0xf4, 0x53, 0x1b, 0x3d, 0x08 \ + } \ } #define PROCESSOR_AS_BSP_BIT 0x00000001 @@ -825,9 +851,11 @@ typedef struct EfiTime { UInt8 Pad2; } EfiTime; -#define EFI_FILE_INFO_GUID \ - { \ - 0x09576e92, 0x6d3f, 0x11d2, { 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b } \ +#define EFI_FILE_INFO_GUID \ + { \ + 0x09576e92, 0x6d3f, 0x11d2, { \ + 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b \ + } \ } struct EfiFileInfo EFI_FINAL { @@ -896,8 +924,8 @@ typedef EfiStatusType EFI_API (*EfiMpServicesStartupThisAP)( IN Void* ProcedureArgument OPTIONAL, OUT Boolean* Finished OPTIONAL); typedef EfiStatusType EFI_API (*EfiMpServicesDisableThisAP)(IN struct _EfiMpServicesProtocol* Self, - IN UInt32 ProcessorNumber, - IN Boolean EnableAP, + IN UInt32 ProcessorNumber, + IN Boolean EnableAP, IN UInt32* HealthFlag OPTIONAL); typedef EfiStatusType EFI_API (*EfiMpServicesWhoAmI)(IN struct _EfiMpServicesProtocol* Self, diff --git a/dev/kernel/FirmwareKit/EPM.h b/dev/kernel/FirmwareKit/EPM.h index 05291929..dcab3607 100644 --- a/dev/kernel/FirmwareKit/EPM.h +++ b/dev/kernel/FirmwareKit/EPM.h @@ -97,11 +97,13 @@ struct PACKED EPM_PART_BLOCK { ///! @brief Use in boot block version field. enum { - kEPMInvalid = 0x00, - kEPMGeneric = 0xcf, /// @brief Generic OS - kEPMLinux = 0x8f, /// @brief Linux on EPM - kEPMBSD = 0x9f, /// @brief Berkeley Soft. Distribution - kEPMNeKernel = 0x1f, /// @brief NeKernel. + kEPMInvalid = 0x00, + kEPMGeneric = 0xcf, /// @brief Generic OS + kEPMLinux = 0x8f, /// @brief Linux on EPM. + kEPMBSD = 0x9f, /// @brief BSD on EPM. + kEPMNeKernel = 0x1f, /// @brief NeKernel. + kEPMVMKernel = 0x2f, /// @brief VMKernel. + /// @note ... the rest is reserved for future OSes. kEPMInvalidOS = 0xff, }; diff --git a/dev/kernel/FirmwareKit/CoreBoot/BootNet.h b/dev/kernel/FirmwareKit/NeBoot/BootNet.h index 3ed11363..3ed11363 100644 --- a/dev/kernel/FirmwareKit/CoreBoot/BootNet.h +++ b/dev/kernel/FirmwareKit/NeBoot/BootNet.h diff --git a/dev/kernel/FirmwareKit/CoreBoot/NS.h b/dev/kernel/FirmwareKit/NeBoot/NS.h index 06197fcd..a4d6a251 100644 --- a/dev/kernel/FirmwareKit/CoreBoot/NS.h +++ b/dev/kernel/FirmwareKit/NeBoot/NS.h @@ -6,5 +6,5 @@ #pragma once -#include <FirmwareKit/CoreBoot/BootNet.h> -#include <FirmwareKit/CoreBoot/CoreBoot.h>
\ No newline at end of file +#include <FirmwareKit/NeBoot/BootNet.h> +#include <FirmwareKit/NeBoot/NeBoot.h>
\ No newline at end of file diff --git a/dev/kernel/FirmwareKit/CoreBoot/CoreBoot.h b/dev/kernel/FirmwareKit/NeBoot/NeBoot.h index 9e756a70..621b3b64 100644 --- a/dev/kernel/FirmwareKit/CoreBoot/CoreBoot.h +++ b/dev/kernel/FirmwareKit/NeBoot/NeBoot.h @@ -8,14 +8,14 @@ #include <NeKit/Defines.h> -namespace Firmware::Detail::CoreBoot { +namespace Firmware::Detail::NeBoot { using namespace Kernel; -struct COREBOOT_LINEAR_EXEC; +struct NEBOOT_LINEAR_EXEC; /// @brief Linear Executable Header /// @author Amlal El Mahrouss -struct ATTRIBUTE(aligned(4)) COREBOOT_LINEAR_EXEC { +struct ATTRIBUTE(aligned(4)) NEBOOT_LINEAR_EXEC { const Char fMagic[2]; // magic number const Char fName[10]; // operating system name const UInt32 fRevision; // firmware revision @@ -31,4 +31,4 @@ struct ATTRIBUTE(aligned(4)) COREBOOT_LINEAR_EXEC { UIntPtr fMBCIStructureVersion; // MBCI structure version. #endif }; -} // namespace Firmware::Detail::CoreBoot +} // namespace Firmware::Detail::NeBoot diff --git a/dev/kernel/GfxKit/FB.h b/dev/kernel/GfxKit/FB.h index 14f0393c..28f3a20c 100644 --- a/dev/kernel/GfxKit/FB.h +++ b/dev/kernel/GfxKit/FB.h @@ -6,8 +6,7 @@ #pragma once -#include <modules/CoreGfx/CoreGfx.h> -#include <modules/CoreGfx/TextGfx.h> +#include <KernelKit/DeviceMgr.h> namespace Kernel { class FBDeviceInterface; @@ -47,7 +46,7 @@ class FBDeviceInterface NE_DEVICE<FBDevicePacket*> { const Char* Name() const override; public: - FBDeviceInterface& operator<<(FBDevicePacket* Data) override; - FBDeviceInterface& operator>>(FBDevicePacket* Data) override; + FBDeviceInterface& operator<<(FBDevicePacket* dat) override; + FBDeviceInterface& operator>>(FBDevicePacket* dat) override; }; } // namespace Kernel diff --git a/dev/kernel/src/CxxAbi-AMD64.cc b/dev/kernel/HALKit/AMD64/CxxAbi.cc index 30c8306e..cd135abc 100644 --- a/dev/kernel/src/CxxAbi-AMD64.cc +++ b/dev/kernel/HALKit/AMD64/CxxAbi.cc @@ -4,8 +4,6 @@ ------------------------------------------- */ -#ifdef __NE_AMD64__ - #include <KernelKit/DebugOutput.h> #include <KernelKit/KPC.h> #include <KernelKit/UserProcessScheduler.h> @@ -78,5 +76,3 @@ EXTERN_C void __cxa_guard_abort(__guard* g) { (void) g; } } // namespace cxxabiv1 - -#endif // ifdef __NE_AMD64__ diff --git a/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc b/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc index aeaeff52..64f146f3 100644 --- a/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc +++ b/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc @@ -32,10 +32,9 @@ #include <modules/ACPI/ACPIFactoryInterface.h> #include <modules/CoreGfx/TextGfx.h> -/// @note: _hal_switch_context is internal - /////////////////////////////////////////////////////////////////////////////////////// +/// @note: _hal_switch_context is internal. /// @brief The **HAL** namespace. /////////////////////////////////////////////////////////////////////////////////////// @@ -45,15 +44,15 @@ struct HAL_APIC_MADT; struct HAL_HARDWARE_THREAD; struct HAL_HARDWARE_THREAD final { - HAL::StackFramePtr mFramePtr; - ProcessID mThreadID{0}; + StackFramePtr mFramePtr; + ProcessID mThreadID{0}; }; -EXTERN_C Void sched_jump_to_task(HAL::StackFramePtr stack_frame); +EXTERN_C Void sched_jump_to_task(StackFramePtr stack_frame); -STATIC HAL_APIC_MADT* kMADTBlock = nullptr; -STATIC Bool kSMPAware = false; -STATIC Int64 kSMPCount = 0; +STATIC HAL_APIC_MADT* kSMPBlock = nullptr; +STATIC Bool kSMPAware = false; +STATIC Int64 kSMPCount = 0; EXTERN_C UIntPtr kApicBaseAddress; @@ -70,6 +69,7 @@ struct HAL_APIC_MADT final SDT_OBJECT { UInt8 List[1]; // Records List }; +/// @brief Local APIC Descriptor Table. struct LAPIC final { UInt8 Type; UInt8 Length; @@ -113,17 +113,19 @@ EXTERN_C HAL::StackFramePtr mp_get_current_task(ThreadID thrdid) { /***********************************************************************************/ EXTERN_C BOOL mp_register_task(HAL::StackFramePtr stack_frame, ThreadID thrdid) { - if (thrdid > kSMPCount) return NO; if (!stack_frame) return NO; - kHWThread[thrdid].mFramePtr = stack_frame; - - HardwareThreadScheduler::The()[thrdid].Leak()->Busy(NO); + if (thrdid > kSMPCount) return NO; if (!kSMPAware) { sched_jump_to_task(kHWThread[thrdid].mFramePtr); + + return YES; } + HardwareThreadScheduler::The()[thrdid].Leak()->Busy(NO); + kHWThread[thrdid].mFramePtr = stack_frame; + return YES; } @@ -158,11 +160,11 @@ Void mp_init_cores(VoidPtr vendor_ptr) noexcept { return; } - kRawMADT = pwr.Leak().Leak(); - kMADTBlock = reinterpret_cast<HAL_APIC_MADT*>(kRawMADT); - kSMPAware = NO; + kRawMADT = pwr.Leak().Leak(); + kSMPBlock = reinterpret_cast<HAL_APIC_MADT*>(kRawMADT); + kSMPAware = NO; - if (kMADTBlock) { + if (kSMPBlock) { kSMPInterrupt = 0; kSMPCount = 0; @@ -189,8 +191,8 @@ Void mp_init_cores(VoidPtr vendor_ptr) noexcept { controller.Write(LAPIC_REG_TIMER_LVT, 0x20 | (1 << 17)); controller.Write(LAPIC_REG_TIMER_INITCNT, 1000000); - volatile UInt8* entry_ptr = reinterpret_cast<volatile UInt8*>(kMADTBlock->List); - volatile UInt8* end_ptr = ((UInt8*) kMADTBlock) + kMADTBlock->Length; + volatile UInt8* entry_ptr = reinterpret_cast<volatile UInt8*>(kSMPBlock->List); + volatile UInt8* end_ptr = ((UInt8*) kSMPBlock) + kSMPBlock->Length; while (entry_ptr < end_ptr) { UInt8 type = *entry_ptr; diff --git a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc index be6d0af5..0c2d0960 100644 --- a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc +++ b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc @@ -61,8 +61,7 @@ EXTERN_C void idt_handle_scheduler(Kernel::UIntPtr rsp) { hal_idt_send_eoi(32); - while (kIsRunning) - ; + while (kIsRunning); kIsRunning = YES; @@ -148,8 +147,8 @@ EXTERN_C Kernel::Void hal_system_call_enter(Kernel::UIntPtr rcx_hash, /// @brief Enter Kernel call from assembly (libDDK only). /// @param stack the stack pushed from assembly routine. /// @return nothing. -EXTERN_C Kernel::Void hal_kernel_call_enter(Kernel::UIntPtr rcx_hash, - Kernel::UIntPtr rdx_kerncall_arg) { +EXTERN_C Kernel::Void hal_kernel_call_enter(Kernel::UIntPtr rcx_hash, Kernel::SizeT cnt, + Kernel::UIntPtr arg, Kernel::SizeT sz) { hal_idt_send_eoi(51); if (!Kernel::kRootUser) return; @@ -159,7 +158,7 @@ EXTERN_C Kernel::Void hal_kernel_call_enter(Kernel::UIntPtr rcx_hash, for (SizeT i = 0UL; i < kMaxDispatchCallCount; ++i) { if (kKernCalls[i].fHooked && rcx_hash == kKernCalls[rcx_hash].fHash) { if (kKernCalls[i].fProc) { - (kKernCalls[i].fProc)((Kernel::VoidPtr) rdx_kerncall_arg); + (kKernCalls[i].fProc)(cnt, (Kernel::VoidPtr) arg, sz); } } } diff --git a/dev/kernel/HALKit/AMD64/HalDescriptorLoader.cc b/dev/kernel/HALKit/AMD64/HalDescriptorLoader.cc index f9749946..56d46a15 100644 --- a/dev/kernel/HALKit/AMD64/HalDescriptorLoader.cc +++ b/dev/kernel/HALKit/AMD64/HalDescriptorLoader.cc @@ -30,10 +30,11 @@ Void IDTLoader::Load(Register64& idt) { volatile UIntPtr** ptr_ivt = (volatile UIntPtr**) idt.Base; for (SizeT idt_indx = 0; idt_indx < kKernelIdtSize; ++idt_indx) { - Detail::kInterruptVectorTable[idt_indx].Selector = kIDTSelector; - Detail::kInterruptVectorTable[idt_indx].Ist = 0; - Detail::kInterruptVectorTable[idt_indx].TypeAttributes = kInterruptGate; - Detail::kInterruptVectorTable[idt_indx].OffsetLow = ((UIntPtr) ptr_ivt[idt_indx] & 0xFFFF); + Detail::kInterruptVectorTable[idt_indx].Selector = kIDTSelector; + Detail::kInterruptVectorTable[idt_indx].Ist = 0; + Detail::kInterruptVectorTable[idt_indx].TypeAttributes = + kKernelInterruptId ? kUserInterruptGate : kInterruptGate; + Detail::kInterruptVectorTable[idt_indx].OffsetLow = ((UIntPtr) ptr_ivt[idt_indx] & 0xFFFF); Detail::kInterruptVectorTable[idt_indx].OffsetMid = (((UIntPtr) ptr_ivt[idt_indx] >> 16) & 0xFFFF); Detail::kInterruptVectorTable[idt_indx].OffsetHigh = diff --git a/dev/kernel/HALKit/AMD64/HalKernelMain.cc b/dev/kernel/HALKit/AMD64/HalKernelMain.cc index 446a1e85..c7a87b13 100644 --- a/dev/kernel/HALKit/AMD64/HalKernelMain.cc +++ b/dev/kernel/HALKit/AMD64/HalKernelMain.cc @@ -14,7 +14,7 @@ #include <KernelKit/Timer.h> #include <NetworkKit/IPC.h> #include <StorageKit/AHCI.h> -#include <generic_kits/BenchKit/X64Chrono.h> +#include <misc/BenchKit/X64Chrono.h> #include <modules/ACPI/ACPIFactoryInterface.h> #include <modules/CoreGfx/TextGfx.h> @@ -43,6 +43,11 @@ EXTERN_C Int32 hal_init_platform(Kernel::HEL::BootInfoHeader* handover_hdr) { kKernelVM = kHandoverHeader->f_PageStart; + if (!kKernelVM) { + MUST_PASS(kKernelVM); + return kEfiFail; + } + hal_write_cr3(kKernelVM); /************************************** */ @@ -163,7 +168,6 @@ EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept { idt_loader.Load(idt_reg); - while (YES) - ; + while (YES); } #endif // ifndef __NE_MODULAR_KERNEL_COMPONENTS__ diff --git a/dev/kernel/HALKit/AMD64/HalPagingMgr.cc b/dev/kernel/HALKit/AMD64/HalPagingMgr.cc index 048cb7c2..ced4f268 100644 --- a/dev/kernel/HALKit/AMD64/HalPagingMgr.cc +++ b/dev/kernel/HALKit/AMD64/HalPagingMgr.cc @@ -117,9 +117,12 @@ EXTERN_C Int32 mm_memory_fence(VoidPtr virtual_address) { /// @param flags the flags to put on the page. /// @return Status code of page manipulation process. /***********************************************************************************/ -EXTERN_C Int32 mm_map_page(VoidPtr virtual_address, VoidPtr physical_address, UInt32 flags) { +EXTERN_C Int32 mm_map_page(VoidPtr virtual_address, VoidPtr physical_address, UInt32 flags, + UInt32 level) { if (physical_address == 0) return kErrorInvalidData; + NE_UNUSED(level); /// @todo support PML4, and PDPT levels. + const UInt64 kVMAddr = (UInt64) virtual_address; constexpr UInt64 kMask9 = 0x1FF; constexpr UInt64 kPageMask = 0xFFF; diff --git a/dev/kernel/HALKit/AMD64/HalTimer.cc b/dev/kernel/HALKit/AMD64/HalTimer.cc index 13573880..22876a96 100644 --- a/dev/kernel/HALKit/AMD64/HalTimer.cc +++ b/dev/kernel/HALKit/AMD64/HalTimer.cc @@ -61,11 +61,8 @@ HardwareTimer::HardwareTimer(UInt64 ms) : fWaitFor(ms) { // if not enabled yet.
if (!(*((volatile UInt64*) ((UInt8*) fDigitalTimer + kHPETConfigRegValue)) & (1 << 0))) {
*((volatile UInt64*) ((UInt8*) fDigitalTimer + kHPETConfigRegValue)) =
- *((volatile UInt64*) ((UInt8*) fDigitalTimer + kHPETConfigRegValue)) |
- (1 << 0); // enable timer
- *((volatile UInt64*) ((UInt8*) fDigitalTimer + kHPETConfigRegValue)) =
- *((volatile UInt64*) ((UInt8*) fDigitalTimer + kHPETConfigRegValue)) |
- (1 << 3); // one shot conf
+ *((volatile UInt64*) ((UInt8*) fDigitalTimer + kHPETConfigRegValue)) | (1 << 0) |
+ (1 << 3); // enable timer & one shot conf
}
}
@@ -80,18 +77,21 @@ HardwareTimer::~HardwareTimer() { BOOL HardwareTimer::Wait() noexcept {
if (fWaitFor < 1) return NO;
+ if (fWaitFor > 1'000'000) return NO; // max 1000s = 16 minutes
- UInt64 hpet_cap = *((volatile UInt64*) (fDigitalTimer + kHPETCounterRegValue));
+ UInt64 hpet_cap = *((volatile UInt64*) (fDigitalTimer));
UInt64 femtoseconds_per_tick = (hpet_cap >> 32);
if (femtoseconds_per_tick == 0) return NO;
volatile UInt64* timer = (volatile UInt64*) (fDigitalTimer + kHPETCounterRegValue);
- UInt64 now = *timer;
- UInt64 prev = now + (fWaitFor / femtoseconds_per_tick);
+ UInt64 now = *timer;
+
+ UInt64 fs_wait = fWaitFor * 1'000'000'000'000ULL;
+ UInt64 stop_at = now + (fs_wait / femtoseconds_per_tick);
- while (*timer < (prev)) asm volatile("pause");
+ while (*timer < (stop_at)) asm volatile("pause");
return YES;
}
diff --git a/dev/kernel/HALKit/AMD64/Network/Generic+Basic+RTL8139.cc b/dev/kernel/HALKit/AMD64/Network/Generic+Basic+RTL8139.cc index 3ccbfa24..be27915a 100644 --- a/dev/kernel/HALKit/AMD64/Network/Generic+Basic+RTL8139.cc +++ b/dev/kernel/HALKit/AMD64/Network/Generic+Basic+RTL8139.cc @@ -13,10 +13,9 @@ using namespace Kernel::HAL; STATIC UInt16 kRTLIOBase = 0xFFFF; -STATIC BOOL kTXEnabled = NO; - -STATIC UInt32 kRXOffset = 0UL; +STATIC BOOL kTXRXEnabled = NO; +STATIC UInt32 kRXOffset = 0UL; STATIC constexpr CONST UInt32 kRXBufferSize = 8192 + 16 + 1500; STATIC UInt8* kRXUpperLayer = nullptr; @@ -26,8 +25,8 @@ STATIC UInt8* kRXBuffer = nullptr; ///@brief RTL8139 Init routine. /***********************************************************************************/ -EXTERN_C Void rtl_init_nic_rtl8139(UInt16 io_base) noexcept { - if (kTXEnabled) return; +EXTERN_C BOOL rtl_init_nic_rtl8139(UInt16 io_base) noexcept { + if (kTXRXEnabled) return NO; kRTLIOBase = io_base; @@ -49,8 +48,7 @@ EXTERN_C Void rtl_init_nic_rtl8139(UInt16 io_base) noexcept { } if (timeout <= 0x1000) { - ke_panic(RUNTIME_CHECK_BAD_BEHAVIOR, "RTL8139: Reset failed"); - return; + return NO; } rt_out32(io_base + 0x30, (UInt32) (UIntPtr) kRXBuffer); @@ -61,16 +59,21 @@ EXTERN_C Void rtl_init_nic_rtl8139(UInt16 io_base) noexcept { rt_out16(io_base + 0x3C, 0x0005); - kTXEnabled = YES; + kTXRXEnabled = YES; + + return YES; } /***********************************************************************************/ /// @brief RTL8139 I/O interrupt handler. +/// @param rsp stack pointer. /// @note This function is called when the device interrupts to retrieve network data. /***********************************************************************************/ -EXTERN_C void rtl_rtl8139_interrupt_handler() { - if (kRTLIOBase == 0xFFFF) return; +EXTERN_C Void rtl_rtl8139_interrupt_handler(UIntPtr rsp) { + if (kRTLIOBase == 0xFFFF || kRTLIOBase == 0) return; + + NE_UNUSED(rsp); UInt16 status = rt_in16(kRTLIOBase + 0x3E); rt_out16(kRTLIOBase + 0x3E, status); @@ -111,4 +114,16 @@ EXTERN_C void rtl_rtl8139_interrupt_handler() { EXTERN_C UInt8* rtl_rtl8139_get_upper_layer() { return kRXUpperLayer; -}
\ No newline at end of file +} + +/***********************************************************************************/ +/// @brief RTL8139 set upper layer function +/// @param layer the upper layer. +/***********************************************************************************/ + +EXTERN_C BOOL rtl_rtl8139_set_upper_layer(UInt8* layer) { + if (!layer) return NO; + kRXUpperLayer = layer; + + return YES; +} diff --git a/dev/kernel/HALKit/AMD64/Paging.h b/dev/kernel/HALKit/AMD64/Paging.h index 079acde4..cf297632 100644 --- a/dev/kernel/HALKit/AMD64/Paging.h +++ b/dev/kernel/HALKit/AMD64/Paging.h @@ -57,7 +57,9 @@ namespace Detail { PageEnable = 31, }; - inline UInt8 control_register_cast(ControlRegisterBits reg) { return static_cast<UInt8>(reg); } + inline UInt8 control_register_cast(ControlRegisterBits reg) { + return static_cast<UInt8>(reg); + } } // namespace Detail auto mm_alloc_bitmap(Boolean wr, Boolean user, SizeT size, Bool is_page, SizeT pad = 0) -> VoidPtr; diff --git a/dev/kernel/HALKit/AMD64/Processor.h b/dev/kernel/HALKit/AMD64/Processor.h index 80dc7a1d..99f857b1 100644 --- a/dev/kernel/HALKit/AMD64/Processor.h +++ b/dev/kernel/HALKit/AMD64/Processor.h @@ -47,6 +47,7 @@ #define IsLevelTriggered(FLG) (FLG & 8) #define kInterruptGate (0x8E) +#define kUserInterruptGate (0xEE) #define kTrapGate (0xEF) #define kTaskGate (0b10001100) #define kIDTSelector (0x08) @@ -245,7 +246,8 @@ class LAPICDmaWrapper final { /// @param phys_addr point to physical address. /// @param flags the flags to put on the page. /// @return Status code of page manip. -EXTERN_C Int32 mm_map_page(VoidPtr virtual_address, VoidPtr physical_address, UInt32 flags); +EXTERN_C Int32 mm_map_page(VoidPtr virtual_address, VoidPtr physical_address, UInt32 flags, + UInt32 level = 2); EXTERN_C UInt8 rt_in8(UInt16 port); EXTERN_C UInt16 rt_in16(UInt16 port); diff --git a/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc b/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc index cd41480a..3363e809 100644 --- a/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc +++ b/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc @@ -136,7 +136,7 @@ template <BOOL Write, BOOL CommandOrCTRL, BOOL Identify> STATIC Void drv_std_input_output_ahci(UInt64 lba, UInt8* buffer, SizeT sector_sz, SizeT size_buffer) noexcept { if (sector_sz == 0) { - kout << "Invalid sector size.\r"; + kout << "ahci: Invalid sector size.\r"; err_global_get() = kErrorDisk; return; } @@ -144,7 +144,7 @@ STATIC Void drv_std_input_output_ahci(UInt64 lba, UInt8* buffer, SizeT sector_sz lba /= sector_sz; if (!buffer || size_buffer == 0) { - kout << "Invalid buffer for AHCI I/O.\r"; + kout << "ahci: Invalid buffer for AHCI I/O.\r"; err_global_get() = kErrorDisk; return; } @@ -157,7 +157,7 @@ STATIC Void drv_std_input_output_ahci(UInt64 lba, UInt8* buffer, SizeT sector_sz while (slot == ~0UL) { if (timeout > kTimeout) { - kout << "No free command slot found, AHCI disk is busy!\r"; + kout << "ahci: No free command slot found, AHCI disk is busy!\r"; err_global_get() = kErrorDisk; return; @@ -217,7 +217,7 @@ STATIC Void drv_std_input_output_ahci(UInt64 lba, UInt8* buffer, SizeT sector_sz command_table->Prdt[prdt_index - 1].Ie = YES; if (bytes_remaining > 0) { - kout << "Warning: AHCI PRDT overflow, cannot map full buffer.\r"; + kout << "ahci: AHCI PRDT overflow, cannot map full buffer.\r"; err_global_get() = kErrorDisk; rtl_dma_free(size_buffer); @@ -262,7 +262,7 @@ STATIC Void drv_std_input_output_ahci(UInt64 lba, UInt8* buffer, SizeT sector_sz while (YES) { if (timeout > kTimeout) { - kout << "Disk hangup!\r"; + kout << "ahci: disk-hangup, corrupted-disk.\r"; err_global_get() = kErrorDiskIsCorrupted; rtl_dma_free(size_buffer); @@ -277,7 +277,7 @@ STATIC Void drv_std_input_output_ahci(UInt64 lba, UInt8* buffer, SizeT sector_sz rtl_dma_flush(ptr, size_buffer); if (kSATAHba->Is & kSATAErrTaskFile) { - kout << "AHCI Task File Error during I/O.\r"; + kout << "ahci: Task File Error during I/O.\r"; rtl_dma_free(size_buffer); err_global_get() = kErrorDiskIsCorrupted; @@ -293,9 +293,8 @@ STATIC Void drv_std_input_output_ahci(UInt64 lba, UInt8* buffer, SizeT sector_sz if ((kSATAHba->Ports[kSATAIndex].Tfd & (kSATASRBsy | kSATASRDrq)) == 0) { goto ahci_io_end; } else { - kout << "Warning: Disk still busy after command completion!\r"; - while (kSATAHba->Ports[kSATAIndex].Tfd & (kSATASRBsy | kSATASRDrq)) - ; + kout << "ahci: Disk still busy after command completion!\r"; + while (kSATAHba->Ports[kSATAIndex].Tfd & (kSATASRBsy | kSATASRDrq)); } ahci_io_end: @@ -308,13 +307,15 @@ STATIC Void drv_std_input_output_ahci(UInt64 lba, UInt8* buffer, SizeT sector_sz @brief Gets the number of sectors inside the drive. @return Sector size in bytes. */ -STATIC ATTRIBUTE(unused) SizeT drv_get_sector_count_ahci() { +STATIC ATTRIBUTE(unused) +SizeT drv_get_sector_count_ahci() { return kSATASectorCount; } /// @brief Get the drive size. /// @return Disk size in bytes. -STATIC ATTRIBUTE(unused) SizeT drv_get_size_ahci() { +STATIC ATTRIBUTE(unused) +SizeT drv_get_size_ahci() { return drv_std_get_sector_count() * kAHCISectorSize; } diff --git a/dev/kernel/HALKit/AMD64/Storage/DMA+Generic.cc b/dev/kernel/HALKit/AMD64/Storage/DMA+Generic.cc index 39efb7d3..4688203f 100644 --- a/dev/kernel/HALKit/AMD64/Storage/DMA+Generic.cc +++ b/dev/kernel/HALKit/AMD64/Storage/DMA+Generic.cc @@ -105,7 +105,7 @@ Void drv_std_read(UInt64 Lba, UInt16 IO, UInt8 Master, Char* Buf, SizeT SectorSz rt_out8(IO + ATA_REG_SEC_COUNT0, ((Size + SectorSz - 1) / SectorSz)); - rt_out8(IO + ATA_REG_LBA0, (Lba) &0xFF); + rt_out8(IO + ATA_REG_LBA0, (Lba) & 0xFF); rt_out8(IO + ATA_REG_LBA1, (Lba) >> 8); rt_out8(IO + ATA_REG_LBA2, (Lba) >> 16); rt_out8(IO + ATA_REG_LBA3, (Lba) >> 24); @@ -123,8 +123,7 @@ Void drv_std_read(UInt64 Lba, UInt16 IO, UInt8 Master, Char* Buf, SizeT SectorSz rt_out8(kATADevice.Bar(0x20) + 0x00, 0x09); // Start DMA engine - while (rt_in8(kATADevice.Bar(0x20) + ATA_REG_STATUS) & 0x01) - ; + while (rt_in8(kATADevice.Bar(0x20) + ATA_REG_STATUS) & 0x01); rt_out8(kATADevice.Bar(0x20) + 0x00, 0x00); // Stop DMA engine @@ -147,7 +146,7 @@ Void drv_std_write(UInt64 Lba, UInt16 IO, UInt8 Master, Char* Buf, SizeT SectorS rt_out8(IO + ATA_REG_SEC_COUNT0, ((Size + (SectorSz - 1)) / SectorSz)); - rt_out8(IO + ATA_REG_LBA0, (Lba) &0xFF); + rt_out8(IO + ATA_REG_LBA0, (Lba) & 0xFF); rt_out8(IO + ATA_REG_LBA1, (Lba) >> 8); rt_out8(IO + ATA_REG_LBA2, (Lba) >> 16); rt_out8(IO + ATA_REG_LBA3, (Lba) >> 24); @@ -163,8 +162,7 @@ Void drv_std_write(UInt64 Lba, UInt16 IO, UInt8 Master, Char* Buf, SizeT SectorS rt_out8(IO + 0x00, 0x09); // Start DMA engine - while (rt_in8(kATADevice.Bar(0x20) + ATA_REG_STATUS) & 0x01) - ; + while (rt_in8(kATADevice.Bar(0x20) + ATA_REG_STATUS) & 0x01); rt_out8(kATADevice.Bar(0x20) + 0x00, 0x00); // Stop DMA engine diff --git a/dev/kernel/HALKit/AMD64/Storage/PIO+Generic.cc b/dev/kernel/HALKit/AMD64/Storage/PIO+Generic.cc index 6fccbdfa..9c5b3931 100644 --- a/dev/kernel/HALKit/AMD64/Storage/PIO+Generic.cc +++ b/dev/kernel/HALKit/AMD64/Storage/PIO+Generic.cc @@ -83,8 +83,7 @@ ATAInit_Retry: rt_out8(OutBus + ATA_REG_COMMAND, ATA_CMD_IDENTIFY); - while (!(rt_in8(IO + ATA_REG_STATUS) & ATA_SR_DRQ)) - ; + while (!(rt_in8(IO + ATA_REG_STATUS) & ATA_SR_DRQ)); /// fetch serial info /// model, speed, number of sectors... @@ -117,15 +116,14 @@ Void drv_pio_std_read(UInt64 Lba, UInt16 IO, UInt8 Master, Char* Buf, SizeT Sect rt_out8(IO + ATA_REG_SEC_COUNT0, ((Size + SectorSz) / SectorSz)); - rt_out8(IO + ATA_REG_LBA0, (Lba) &0xFF); + rt_out8(IO + ATA_REG_LBA0, (Lba) & 0xFF); rt_out8(IO + ATA_REG_LBA1, (Lba) >> 8); rt_out8(IO + ATA_REG_LBA2, (Lba) >> 16); rt_out8(IO + ATA_REG_LBA3, (Lba) >> 24); rt_out8(IO + ATA_REG_COMMAND, ATA_CMD_READ_PIO); - while (!(rt_in8(IO + ATA_REG_STATUS) & ATA_SR_DRQ)) - ; + while (!(rt_in8(IO + ATA_REG_STATUS) & ATA_SR_DRQ)); for (SizeT IndexOff = 0; IndexOff < Size; IndexOff += 2) { drv_pio_std_wait_io(IO); @@ -149,15 +147,14 @@ Void drv_pio_std_write(UInt64 Lba, UInt16 IO, UInt8 Master, Char* Buf, SizeT Sec rt_out8(IO + ATA_REG_SEC_COUNT0, ((Size + SectorSz) / SectorSz)); - rt_out8(IO + ATA_REG_LBA0, (Lba) &0xFF); + rt_out8(IO + ATA_REG_LBA0, (Lba) & 0xFF); rt_out8(IO + ATA_REG_LBA1, (Lba) >> 8); rt_out8(IO + ATA_REG_LBA2, (Lba) >> 16); rt_out8(IO + ATA_REG_LBA3, (Lba) >> 24); rt_out8(IO + ATA_REG_COMMAND, ATA_CMD_WRITE_PIO); - while (!(rt_in8(IO + ATA_REG_STATUS) & ATA_SR_DRQ)) - ; + while (!(rt_in8(IO + ATA_REG_STATUS) & ATA_SR_DRQ)); for (SizeT IndexOff = 0; IndexOff < Size; IndexOff += 2) { drv_pio_std_wait_io(IO); diff --git a/dev/kernel/HALKit/ARM64/APM/APM+IO.cc b/dev/kernel/HALKit/ARM64/APM/APM+IO.cc index e58fb782..17a60515 100644 --- a/dev/kernel/HALKit/ARM64/APM/APM+IO.cc +++ b/dev/kernel/HALKit/ARM64/APM/APM+IO.cc @@ -9,7 +9,7 @@ using namespace Kernel; -/// @brief Send APM command to it's IO space. +/// @brief Send APM command to its IO space. /// @param base_dma the IO base port. /// @param cmd the command. /// @return status code. diff --git a/dev/kernel/src/CxxAbi-ARM64.cc b/dev/kernel/HALKit/ARM64/CxxAbi.cc index e91eb958..964fc2f4 100644 --- a/dev/kernel/src/CxxAbi-ARM64.cc +++ b/dev/kernel/HALKit/ARM64/CxxAbi.cc @@ -4,8 +4,6 @@ ------------------------------------------- */ -#ifdef __NE_ARM64__ - #include <KernelKit/DebugOutput.h> #include <KernelKit/KPC.h> #include <NeKit/CxxAbi.h> @@ -87,5 +85,3 @@ EXTERN_C Kernel::Void _Init_thread_header(Kernel::Int* thread_obj) { } EXTERN_C Kernel::Int _tls_index = 0UL; - -#endif // ifdef __NE_ARM64__ diff --git a/dev/kernel/HALKit/ARM64/HalCoreInterruptHandler.cc b/dev/kernel/HALKit/ARM64/HalCoreInterruptHandler.cc index 61a82314..63a42de8 100644 --- a/dev/kernel/HALKit/ARM64/HalCoreInterruptHandler.cc +++ b/dev/kernel/HALKit/ARM64/HalCoreInterruptHandler.cc @@ -11,16 +11,16 @@ #include <SignalKit/Signals.h> EXTERN_C Kernel::Void int_handle_breakpoint(Kernel::UIntPtr rip); - EXTERN_C BOOL mp_handle_gic_interrupt_el0(Void); +EXTERN_C BOOL mp_handle_gic_interrupt_el0(Void); -EXTERN_C BOOL kEndOfInterrupt; +EXTERN_C BOOL kEndOfInterrupt; EXTERN_C UInt8 kEndOfInterruptVector; STATIC BOOL kIsRunning = NO; /// @note This is managed by the system software. STATIC void hal_int_send_eoi(UInt8 vector) { - kEndOfInterrupt = YES; + kEndOfInterrupt = YES; kEndOfInterruptVector = vector; } @@ -56,8 +56,7 @@ EXTERN_C void int_handle_scheduler(Kernel::UIntPtr rsp) { hal_int_send_eoi(32); - while (kIsRunning) - ; + while (kIsRunning); kIsRunning = YES; @@ -143,10 +142,8 @@ EXTERN_C Kernel::Void hal_system_call_enter(Kernel::UIntPtr rcx_hash, /// @brief Enter Kernel call from assembly (libDDK only). /// @param stack the stack pushed from assembly routine. /// @return nothing. -EXTERN_C Kernel::Void hal_kernel_call_enter(Kernel::UIntPtr rcx_hash, - Kernel::UIntPtr rdx_kerncall_arg) { - hal_int_send_eoi(51); - +EXTERN_C Kernel::Void hal_kernel_call_enter(Kernel::UIntPtr rcx_hash, Kernel::SizeT cnt, + Kernel::UIntPtr arg, Kernel::SizeT sz) { if (!Kernel::kRootUser) return; if (Kernel::kCurrentUser != Kernel::kRootUser) return; if (!Kernel::kCurrentUser->IsSuperUser()) return; @@ -154,7 +151,7 @@ EXTERN_C Kernel::Void hal_kernel_call_enter(Kernel::UIntPtr rcx_hash, for (SizeT i = 0UL; i < kMaxDispatchCallCount; ++i) { if (kKernCalls[i].fHooked && rcx_hash == kKernCalls[rcx_hash].fHash) { if (kKernCalls[i].fProc) { - (kKernCalls[i].fProc)((Kernel::VoidPtr) rdx_kerncall_arg); + (kKernCalls[i].fProc)(cnt, (Kernel::VoidPtr) arg, sz); } } } diff --git a/dev/kernel/HALKit/ARM64/HalKernelMain.cc b/dev/kernel/HALKit/ARM64/HalKernelMain.cc index 20bd3d8a..d8e6843b 100644 --- a/dev/kernel/HALKit/ARM64/HalKernelMain.cc +++ b/dev/kernel/HALKit/ARM64/HalKernelMain.cc @@ -71,7 +71,6 @@ EXTERN_C void hal_init_platform(Kernel::HEL::BootInfoHeader* handover_hdr) { Kernel::mp_init_cores(); - while (YES) - ; + while (YES); } #endif
\ No newline at end of file diff --git a/dev/kernel/HALKit/ARM64/HalPagingMgr.cc b/dev/kernel/HALKit/ARM64/HalPagingMgr.cc index faad6778..b7b0c10e 100644 --- a/dev/kernel/HALKit/ARM64/HalPagingMgr.cc +++ b/dev/kernel/HALKit/ARM64/HalPagingMgr.cc @@ -13,16 +13,74 @@ namespace Kernel::HAL { typedef UInt32 PageTableIndex; +EXTERN_C UIntPtr mm_get_page_addr(VoidPtr virtual_address) { + if (!virtual_address) return 0; + + UInt64 ttbr0_val = 0; + + asm volatile("mrs %0, ttbr0_el1" : "=r"(ttbr0_val)); + volatile UInt64* l1_table = reinterpret_cast<volatile UInt64*>(ttbr0_val); + + UInt64 l1_idx = (reinterpret_cast<UIntPtr>(virtual_address) >> 39) & 0x1FF; + UInt64 l2_idx = (reinterpret_cast<UIntPtr>(virtual_address) >> 30) & 0x1FF; + UInt64 l3_idx = (reinterpret_cast<UIntPtr>(virtual_address) >> 21) & 0x1FF; + + if (!l1_table[l1_idx]) return 0; + + volatile UInt64* l2_table = reinterpret_cast<volatile UInt64*>(l1_table[l1_idx] & ~0xFFFUL); + + if (!l2_table[l2_idx]) return 0; + + volatile UInt64* l3_table = reinterpret_cast<volatile UInt64*>(l2_table[l2_idx] & ~0xFFFUL); + + if (!l3_table[l3_idx]) return 0; + + return (l3_table[l3_idx] & ~0xFFFUL); +} + /// @brief Maps or allocates a page from virtual_address. /// @param virtual_address a valid virtual address. /// @param phys_addr point to physical address. /// @param flags the flags to put on the page. /// @return Status code of page manipulation process. -EXTERN_C Int32 mm_map_page(VoidPtr virtual_address, VoidPtr physical_address, UInt32 flags) { - if (!virtual_address || !flags) return kErrorInvalidData; +EXTERN_C Int32 mm_map_page(VoidPtr virtual_address, VoidPtr physical_address, UInt32 flags, + UInt32 level) { + if (!virtual_address || !flags || !physical_address) return kErrorInvalidData; + + UInt64 ttbr0_val = 0; + + asm volatile("mrs %0, ttbr0_el1" : "=r"(ttbr0_val)); + volatile UInt64* l1_table = reinterpret_cast<volatile UInt64*>(ttbr0_val); + + UInt64 l1_idx = (reinterpret_cast<UIntPtr>(virtual_address) >> 39) & 0x1FF; + UInt64 l2_idx = (reinterpret_cast<UIntPtr>(virtual_address) >> 30) & 0x1FF; + UInt64 l3_idx = (reinterpret_cast<UIntPtr>(virtual_address) >> 21) & 0x1FF; + + if (!l1_table[l1_idx]) return kErrorInvalidData; + + volatile UInt64* l2_table = reinterpret_cast<volatile UInt64*>(l1_table[l1_idx] & ~0xFFFUL); + + if (!l2_table[l2_idx]) return kErrorInvalidData; + + volatile UInt64* l3_table = reinterpret_cast<volatile UInt64*>(l2_table[l2_idx] & ~0xFFFUL); + + l3_table[l3_idx] = (reinterpret_cast<UInt64>(physical_address) & ~0xFFFUL) | flags; - NE_UNUSED(physical_address); + switch (level) { + case 2: { + l3_table[l3_idx] = (reinterpret_cast<UInt64>(physical_address) & ~0xFFFUL) | flags; + return kErrorSuccess; + } + case 1: { + l1_table[l1_idx] = (reinterpret_cast<UInt64>(physical_address) & ~0xFFFUL) | flags; + return kErrorSuccess; + } + case 0: { + l1_table[l1_idx] = (reinterpret_cast<UInt64>(physical_address) & ~0xFFFUL) | flags; + return kErrorSuccess; + } + } - return kErrorSuccess; + return kErrorInvalidData; } } // namespace Kernel::HAL diff --git a/dev/kernel/HALKit/ARM64/Paging.h b/dev/kernel/HALKit/ARM64/Paging.h index 5001871b..be9fb116 100644 --- a/dev/kernel/HALKit/ARM64/Paging.h +++ b/dev/kernel/HALKit/ARM64/Paging.h @@ -86,14 +86,16 @@ namespace Detail { PageEnable = 31, }; - inline UInt8 control_register_cast(ControlRegisterBits reg) { return static_cast<UInt8>(reg); } + inline UInt8 control_register_cast(ControlRegisterBits reg) { + return static_cast<UInt8>(reg); + } } // namespace Detail struct PDE_4KB final { PTE_4KB ALIGN(kPageAlign) fEntries[kPageMax]; }; -auto mm_alloc_bitmap(Boolean wr, Boolean user, SizeT size, Bool is_page) -> VoidPtr; +auto mm_alloc_bitmap(Boolean wr, Boolean user, SizeT size, Bool is_page, SizeT pad = 0) -> VoidPtr; auto mm_free_bitmap(VoidPtr page_ptr) -> Bool; } // namespace Kernel::HAL diff --git a/dev/kernel/HALKit/ARM64/Processor.h b/dev/kernel/HALKit/ARM64/Processor.h index 068b798d..68fe736c 100644 --- a/dev/kernel/HALKit/ARM64/Processor.h +++ b/dev/kernel/HALKit/ARM64/Processor.h @@ -36,7 +36,8 @@ enum { /// @param phys_addr point to physical address. /// @param flags the flags to put on the page. /// @return Status code of page manip. -EXTERN_C Int32 mm_map_page(VoidPtr virtual_address, VoidPtr physical_address, UInt32 flags); +EXTERN_C Int32 mm_map_page(VoidPtr virtual_address, VoidPtr physical_address, UInt32 flags, + UInt32 level = 2); EXTERN_C UIntPtr mm_get_page_addr(VoidPtr virtual_address); diff --git a/dev/kernel/HALKit/POWER/HalApplicationProcessor.cc b/dev/kernel/HALKit/POWER/HalApplicationProcessor.cc index daa26e53..6059e3be 100644 --- a/dev/kernel/HALKit/POWER/HalApplicationProcessor.cc +++ b/dev/kernel/HALKit/POWER/HalApplicationProcessor.cc @@ -10,8 +10,7 @@ namespace Kernel::Detail { STATIC void mp_hang_fn(void) { - while (YES) - ; + while (YES); } } // namespace Kernel::Detail diff --git a/dev/kernel/HALKit/RISCV/HalApplicationProcessor.cc b/dev/kernel/HALKit/RISCV/HalApplicationProcessor.cc index 31d4a62e..e6fdddfb 100644 --- a/dev/kernel/HALKit/RISCV/HalApplicationProcessor.cc +++ b/dev/kernel/HALKit/RISCV/HalApplicationProcessor.cc @@ -13,8 +13,7 @@ using namespace Kernel; namespace Kernel {
namespace Detail {
STATIC void mp_hang_fn(void) {
- while (YES)
- ;
+ while (YES);
}
} // namespace Detail
diff --git a/dev/kernel/KernelKit/BinaryMutex.h b/dev/kernel/KernelKit/BinaryMutex.h index 45d4bd8d..f2c15af0 100644 --- a/dev/kernel/KernelKit/BinaryMutex.h +++ b/dev/kernel/KernelKit/BinaryMutex.h @@ -24,16 +24,16 @@ class BinaryMutex final { bool Unlock() noexcept; public: - BOOL WaitForProcess(const Int16& sec) noexcept; + BOOL WaitForProcess(const UInt32& sec) noexcept; public: - bool Lock(USER_PROCESS& process); - bool LockOrWait(USER_PROCESS& process, TimerInterface* timer); + bool Lock(USER_PROCESS* process); + bool LockOrWait(USER_PROCESS* process, TimerInterface* timer); public: NE_COPY_DEFAULT(BinaryMutex) private: - USER_PROCESS& fLockingProcess; + USER_PROCESS* fLockingProcess{nullptr}; }; } // namespace Kernel diff --git a/dev/kernel/KernelKit/CodeMgr.h b/dev/kernel/KernelKit/CodeMgr.h index 072ba4d5..c733bc47 100644 --- a/dev/kernel/KernelKit/CodeMgr.h +++ b/dev/kernel/KernelKit/CodeMgr.h @@ -18,6 +18,10 @@ #include <KernelKit/PECodeMgr.h> #include <KernelKit/PEFCodeMgr.h> +/// @file CodeMgr.h +/// @brief Code Manager header file. +/// @author Amlal El Mahrouss (amlal@nekernel.org) + namespace Kernel { /// @brief Main process entrypoint. typedef void (*rtl_main_kind)(void); diff --git a/dev/kernel/KernelKit/CoreProcessScheduler.h b/dev/kernel/KernelKit/CoreProcessScheduler.h index c06ef92c..a7908b7d 100644 --- a/dev/kernel/KernelKit/CoreProcessScheduler.h +++ b/dev/kernel/KernelKit/CoreProcessScheduler.h @@ -9,13 +9,17 @@ #include <NeKit/Defines.h> #include <NeKit/ErrorOr.h> +/// @file CoreProcessScheduler.h +/// @brief Core Process Scheduler header file. +/// @author Amlal El Mahrouss (amlal@nekernel.org) + #define kSchedMinMicroTime (AffinityKind::kStandard) #define kSchedInvalidPID (-1) #define kSchedProcessLimitPerTeam (32U) #define kSchedTeamCount (256U) -#define kSchedMaxMemoryLimit gib_cast(128) /* max physical memory limit */ -#define kSchedMaxStackSz (kib_cast(8)) /* maximum stack size */ +#define kSchedMaxMemoryLimit (gib_cast(128)) /* max physical memory limit */ +#define kSchedMaxStackSz (kib_cast(8)) /* maximum stack size */ #define kSchedNameLen (128U) @@ -32,19 +36,23 @@ template <typename T> struct PROCESS_HEAP_TREE; template <typename T> +struct PROCESS_SPECIAL_TREE; + +template <typename T> struct PROCESS_FILE_TREE; enum { kInvalidTreeKind = 0U, kRedTreeKind = 100U, kBlackTreeKind = 101U, - kTreeKindCount = 2U, + kTreeKindCount = 3U, }; template <typename T> struct PROCESS_HEAP_TREE { - static constexpr auto kPtr = true; - static constexpr auto kFD = false; + static constexpr auto kHeap = true; + static constexpr auto kFile = false; + static constexpr auto kSpecial = false; T Entry{nullptr}; SizeT EntrySize{0UL}; @@ -69,8 +77,9 @@ struct PROCESS_HEAP_TREE { template <typename T> struct PROCESS_FILE_TREE { - static constexpr auto kPtr = false; - static constexpr auto kFD = true; + static constexpr auto kHeap = false; + static constexpr auto kFile = true; + static constexpr auto kSpecial = false; T Entry{nullptr}; SizeT EntrySize{0UL}; @@ -81,6 +90,7 @@ struct PROCESS_FILE_TREE { struct PROCESS_FILE_TREE<T>* Parent { nullptr }; + struct PROCESS_FILE_TREE<T>* Child { nullptr }; @@ -88,6 +98,7 @@ struct PROCESS_FILE_TREE { struct PROCESS_FILE_TREE<T>* Prev { nullptr }; + struct PROCESS_FILE_TREE<T>* Next { nullptr }; @@ -106,8 +117,6 @@ enum class ProcessSubsystem : Int32 { kProcessSubsystemCount = 4, }; -typedef UInt64 PTime; - /***********************************************************************************/ //! @brief Local Process identifier. /***********************************************************************************/ @@ -170,7 +179,8 @@ inline bool operator>=(AffinityKind lhs, AffinityKind rhs) { return lhs_int >= rhs_int; } -using ProcessTime = UInt64; +using PTime = UInt64; +using ProcessTime = PTime; using PID = Int64; /***********************************************************************************/ @@ -180,7 +190,7 @@ enum class ProcessLevelRing : Int32 { kRingStdUser = 1, kRingSuperUser = 2, kRingGuestUser = 5, - kRingCount = 5, + kRingCount = 3, }; /***********************************************************************************/ @@ -200,8 +210,8 @@ struct PROCESS_IMAGE final { friend class UserProcessScheduler; - ImagePtr fCode; - ImagePtr fBlob; + ImagePtr fCode{}; + ImagePtr fBlob{}; public: Bool HasCode() const { return this->fCode != nullptr; } diff --git a/dev/kernel/KernelKit/DebugOutput.h b/dev/kernel/KernelKit/DebugOutput.h index de3bc997..992d1ca7 100644 --- a/dev/kernel/KernelKit/DebugOutput.h +++ b/dev/kernel/KernelKit/DebugOutput.h @@ -12,7 +12,7 @@ #include <NeKit/Stream.h> #include <NeKit/Utils.h> -#define kDebugUnboundPort 0x0FEED +#define kDebugPort (51820U) #define kDebugMag0 'K' #define kDebugMag1 'D' @@ -27,7 +27,7 @@ namespace Kernel { class TerminalDevice; class DTraceDevice; -class DebugDevice; +class NeDebugDevice; class Utf8TerminalDevice; inline TerminalDevice end_line(); @@ -180,17 +180,9 @@ inline TerminalDevice get_console_in(Char* buf) { return self; } -inline constexpr SizeT kDebugTypeLen = 256U; +inline constexpr SizeT kDebugCmdLen = 256U; -typedef Char rt_debug_type[kDebugTypeLen]; - -/// @brief KDBG's packet header. -class KernelDebugHeader final { - public: - Int16 fPort; - Int16 fPortKind; - rt_debug_type fPortBlob; -}; +typedef Char rt_debug_cmd[kDebugCmdLen]; inline TerminalDevice& operator<<(TerminalDevice& src, const Long& num) { src = number(num); diff --git a/dev/kernel/KernelKit/DriveMgr.h b/dev/kernel/KernelKit/DriveMgr.h index 4a530deb..69df1cec 100644 --- a/dev/kernel/KernelKit/DriveMgr.h +++ b/dev/kernel/KernelKit/DriveMgr.h @@ -7,6 +7,10 @@ #ifndef INC_DRIVE_MANAGER_H #define INC_DRIVE_MANAGER_H +/// @file DriveMgr.h +/// @brief Drive Manager. +/// @author Amlal El Mahrouss (amlal@nekernel.org) + #include <CompilerKit/CompilerKit.h> #include <KernelKit/DebugOutput.h> #include <KernelKit/DeviceMgr.h> diff --git a/dev/kernel/KernelKit/FileMgr.h b/dev/kernel/KernelKit/FileMgr.h index 13eeabdf..f925a96c 100644 --- a/dev/kernel/KernelKit/FileMgr.h +++ b/dev/kernel/KernelKit/FileMgr.h @@ -4,6 +4,7 @@ File: FileMgr.h Purpose: Kernel file manager. + Author: Amlal El Mahrouss (amlal@nekernel.org) ------------------------------------------- */ @@ -21,7 +22,11 @@ #ifndef INC_FILEMGR_H #define INC_FILEMGR_H -//! Include filesystems that neoskrnl supports. +/// @file FileMgr.h +/// @brief File Manager. +/// @author Amlal El Mahrouss (amlal@nekernel.org) + +//! Include filesystems that NeKernel supports. #include <FSKit/Ext2.h> #include <FSKit/HeFS.h> #include <FSKit/NeFS.h> @@ -48,11 +53,6 @@ #define rtl_node_cast(PTR) reinterpret_cast<Kernel::NodePtr>(PTR) -/** - @note Refer to first enum. -*/ -#define kFileOpsCount (4U) - #define kFileMimeGeneric "ne-application-kind/all" /** @brief invalid position. (n-pos) */ @@ -65,10 +65,10 @@ enum { kFileReadAll = 101, kFileReadChunk = 102, kFileWriteChunk = 103, - kFileIOCnt = (kFileWriteChunk - kFileWriteAll) + 1, // File flags (HFS+, NeFS specific) kFileFlagRsrc = 104, kFileFlagData = 105, + kFileIOCnt = (kFileFlagData - kFileWriteAll) + 1, }; typedef VoidPtr NodePtr; @@ -284,12 +284,10 @@ class FileStream final { this->fFileRestrict != kFileMgrRestrictReadBinary) return nullptr; - NE_UNUSED(sz); - auto man = FSClass::GetMounted(); if (man) { - VoidPtr ret = man->Read(name, fFile, kFileReadAll, 0); + VoidPtr ret = man->Read(name, fFile, kFileReadAll, sz); return ret; } @@ -394,6 +392,7 @@ inline FileStream<Encoding, Class>::FileStream(const Encoding* path, const Encod template <typename Encoding, typename Class> inline FileStream<Encoding, Class>::~FileStream() { mm_free_ptr(fFile); + fFile = nullptr; } } // namespace Kernel diff --git a/dev/kernel/KernelKit/HardwareThreadScheduler.h b/dev/kernel/KernelKit/HardwareThreadScheduler.h index 76327a93..168a0cc1 100644 --- a/dev/kernel/KernelKit/HardwareThreadScheduler.h +++ b/dev/kernel/KernelKit/HardwareThreadScheduler.h @@ -100,7 +100,7 @@ class HardwareThreadScheduler final : public ISchedulable { public: Ref<HardwareThread*> operator[](SizeT idx); bool operator!() noexcept; - operator bool() noexcept; + operator bool() noexcept; Bool IsUser() override { return Yes; } diff --git a/dev/kernel/KernelKit/KPC.h b/dev/kernel/KernelKit/KPC.h index a3b13de6..794197e2 100644 --- a/dev/kernel/KernelKit/KPC.h +++ b/dev/kernel/KernelKit/KPC.h @@ -65,6 +65,9 @@ inline constexpr KPCError kErrorFileLocked = 64; inline constexpr KPCError kErrorDiskIsTooTiny = 65; inline constexpr KPCError kErrorDmaExhausted = 66; inline constexpr KPCError kErrorOutOfBitMapMemory = 67; +inline constexpr KPCError kErrorTimeout = 68; +inline constexpr KPCError kErrorAccessDenied = 69; +inline constexpr KPCError kErrorUnavailable = 70; /// Generic errors. inline constexpr KPCError kErrorUnimplemented = -1; diff --git a/dev/kernel/KernelKit/KernelTaskScheduler.h b/dev/kernel/KernelKit/KernelTaskScheduler.h index 57b83ccb..c0879769 100644 --- a/dev/kernel/KernelKit/KernelTaskScheduler.h +++ b/dev/kernel/KernelKit/KernelTaskScheduler.h @@ -15,6 +15,12 @@ #include <KernelKit/LockDelegate.h> namespace Kernel { +class KernelTaskHelper; + +typedef PID KID; + +/// @brief Equivalent of USER_PROCESS, but for kernel tasks. +/// @author Amlal class KERNEL_TASK final { public: Char Name[kSchedNameLen] = {"KERNEL_TASK"}; @@ -23,5 +29,18 @@ class KERNEL_TASK final { UInt8* StackReserve{nullptr}; SizeT StackSize{kSchedMaxStackSz}; PROCESS_IMAGE Image{}; + /// @brief a KID is a Kernel Identification Descriptor, it is used to find a task running within + /// the kernel. + KID Kid{0}; +}; + +/// @brief Equivalent of UserProcessHelper, but for kernel tasks. +/// @author Amlal +class KernelTaskHelper final { + public: + STATIC Bool Switch(HAL::StackFramePtr frame_ptr, PID new_kid); + STATIC Bool CanBeScheduled(const KERNEL_TASK& process); + STATIC ErrorOr<PID> TheCurrentKID(); + STATIC SizeT StartScheduling(); }; } // namespace Kernel
\ No newline at end of file diff --git a/dev/kernel/KernelKit/LoaderInterface.h b/dev/kernel/KernelKit/LoaderInterface.h index 1f9b1e56..ed7d8364 100644 --- a/dev/kernel/KernelKit/LoaderInterface.h +++ b/dev/kernel/KernelKit/LoaderInterface.h @@ -23,9 +23,9 @@ class LoaderInterface { public: virtual _Output ErrorOr<VoidPtr> GetBlob() = 0; - virtual _Output const Char* AsString() = 0; - virtual _Output const Char* MIME() = 0; - virtual _Output const Char* Path() = 0; + virtual _Output const Char* AsString() = 0; + virtual _Output const Char* MIME() = 0; + virtual _Output const Char* Path() = 0; virtual _Output ErrorOr<VoidPtr> FindStart() = 0; virtual _Output ErrorOr<VoidPtr> FindSymbol(_Input const Char* name, _Input Int32 kind) = 0; }; diff --git a/dev/kernel/KernelKit/LockDelegate.h b/dev/kernel/KernelKit/LockDelegate.h index b5977c92..a8c36de7 100644 --- a/dev/kernel/KernelKit/LockDelegate.h +++ b/dev/kernel/KernelKit/LockDelegate.h @@ -11,10 +11,10 @@ namespace Kernel { enum { - kLockInvalid = 0, - kLockDone = 200, - kLockTimedOut, - kLockCount = 3, + kLockInvalid = 0, + kLockDone = 200, + kLockTimedOut = 300, + kLockCount = 3, }; /// @brief Lock condition pointer. diff --git a/dev/kernel/KernelKit/PCI/DMA.h b/dev/kernel/KernelKit/PCI/DMA.h index 7e7d3f0c..c4e3b61a 100644 --- a/dev/kernel/KernelKit/PCI/DMA.h +++ b/dev/kernel/KernelKit/PCI/DMA.h @@ -47,7 +47,7 @@ class DMAWrapper final { T* Get(UIntPtr off = 0); public: - operator bool(); + operator bool(); bool operator!(); public: diff --git a/dev/kernel/KernelKit/PEF.h b/dev/kernel/KernelKit/PEF.h index c28c8f8c..fd39392e 100644 --- a/dev/kernel/KernelKit/PEF.h +++ b/dev/kernel/KernelKit/PEF.h @@ -11,19 +11,19 @@ ------------------------------------------- */ -#ifndef KERNELKIT_PEF_H -#define KERNELKIT_PEF_H +#ifndef __KERNELKIT_PEF_H__ +#define __KERNELKIT_PEF_H__ #include <CompilerKit/CompilerKit.h> #include <KernelKit/LoaderInterface.h> #include <NeKit/Defines.h> -#define kPefMagic "Joy!" -#define kPefMagicFat "yoJ!" +#define kPefMagic "Open" +#define kPefMagicFat "nepO" #define kPefMagicLen (5) -#define kPefVersion (4) +#define kPefVersion (0x0500) #define kPefNameLen (256U) /* not mandatory, only for non fork based filesystems. */ @@ -54,15 +54,15 @@ enum { kPefArch32x0, /* 32x0. ISA */ kPefArchPowerPC, kPefArchARM64, - kPefArchCount = (kPefArchPowerPC - kPefArchIntel86S) + 1, + kPefArchCount = (kPefArchARM64 - kPefArchIntel86S) + 1, kPefArchInvalid = 0xFF, }; enum { + kPefSubArchGeneric, kPefSubArchAMD = 200, kPefSubArchIntel, kPefSubArchARM, - kPefSubArchGeneric, kPefSubArchIBM, }; @@ -98,16 +98,19 @@ typedef struct PEFCommandHeader final { UInt32 Flags; /* container flags */ UInt16 Kind; /* container kind */ UIntPtr Offset; /* content offset */ - UIntPtr VMAddress; /* VM offset */ - SizeT Size; /* content Size */ + SizeT OffsetSize; /* offset size (physical size inside the file) */ + UIntPtr VMAddress; /* Virtual Address */ + SizeT VMSize; /* Virtual Size */ } PACKED PEFCommandHeader; enum { + kPefInvalid = 0x0, kPefCode = 0xC, kPefData = 0xD, kPefZero = 0xE, kPefLinkerID = 0x1, + kPefCount = 4, }; } // namespace Kernel -#endif /* ifndef KERNELKIT_PEF_H */ +#endif /* ifndef __KERNELKIT_PEF_H__ */ diff --git a/dev/kernel/KernelKit/PEFCodeMgr.h b/dev/kernel/KernelKit/PEFCodeMgr.h index 18041f8f..d61aa863 100644 --- a/dev/kernel/KernelKit/PEFCodeMgr.h +++ b/dev/kernel/KernelKit/PEFCodeMgr.h @@ -7,6 +7,10 @@ #ifndef _INC_CODE_MANAGER_PEF_H_ #define _INC_CODE_MANAGER_PEF_H_ +/// @file PEFCodeMgr.h +/// @brief PEF Code Manager header file. +/// @author Amlal El Mahrouss (amlal@nekernel.org) + #include <KernelKit/FileMgr.h> #include <KernelKit/PEF.h> #include <NeKit/ErrorOr.h> @@ -59,8 +63,8 @@ class PEFLoader : public LoaderInterface { Ref<KString> fPath; VoidPtr fCachedBlob; - bool fFatBinary; - bool fBad; + BOOL fFatBinary{}; + BOOL fBad{}; }; namespace Utils { diff --git a/dev/kernel/KernelKit/Semaphore.h b/dev/kernel/KernelKit/Semaphore.h index a1b5ecad..f73f36ed 100644 --- a/dev/kernel/KernelKit/Semaphore.h +++ b/dev/kernel/KernelKit/Semaphore.h @@ -6,10 +6,105 @@ #pragma once +/// @author Amlal El Mahrouss +/// @file Semaphore.h +/// @brief Semaphore structure and functions for synchronization in the kernel. + #include <CompilerKit/CompilerKit.h> #include <KernelKit/Timer.h> #include <NeKit/Defines.h> +#define kSemaphoreOwnerIndex (0U) +#define kSemaphoreCountIndex (1U) + +#define kSemaphoreCount (2U) + +#define kSemaphoreIncrementOwner(sem) (sem[kSemaphoreOwnerIndex]++) +#define kSemaphoreDecrementOwner(sem) (sem[kSemaphoreOwnerIndex]--) + namespace Kernel { -typedef Int64 Semaphore; +/// @brief Semaphore structure used for synchronization. +typedef UInt64 SemaphoreArr[kSemaphoreCount]; + +/// @brief Checks if the semaphore is valid. +inline BOOL rtl_sem_is_valid(const SemaphoreArr& sem, UInt64 owner = 0) { + return sem[kSemaphoreOwnerIndex] == owner && sem[kSemaphoreCountIndex] > 0; +} + +/// @brief Releases the semaphore, resetting its owner and count. +/// @param sem +/// @return +inline BOOL rtl_sem_release(SemaphoreArr& sem) { + sem[kSemaphoreOwnerIndex] = 0; + sem[kSemaphoreCountIndex] = 0; + + return TRUE; +} + +/// @brief Initializes the semaphore with an owner and a count of zero. +/// @param sem the semaphore array to use. +/// @param owner the owner to set, could be anything identifitable. +/// @return +inline BOOL rtl_sem_acquire(SemaphoreArr& sem, UInt64 owner) { + if (!owner) { + err_global_get() = kErrorInvalidData; + return FALSE; // Invalid owner + } + + sem[kSemaphoreOwnerIndex] = owner; + sem[kSemaphoreCountIndex] = 0; + + return TRUE; +} + +/// @brief Waits for the semaphore to be available, blocking until it is. +/// @param sem +/// @param timeout +/// @param condition condition pointer. +/// @return +inline BOOL rtl_sem_wait(SemaphoreArr& sem, UInt64 owner, UInt64 timeout, + BOOL* condition = nullptr) { + if (!rtl_sem_is_valid(sem, owner)) { + return FALSE; + } + + if (timeout <= 0) { + err_global_get() = kErrorTimeout; + + return FALSE; + } + + if (!condition || *condition) { + if (sem[kSemaphoreCountIndex] == 0) { + err_global_get() = kErrorUnavailable; + return FALSE; + } + + err_global_get() = kErrorSuccess; + sem[kSemaphoreCountIndex]--; + + return TRUE; + } + + HardwareTimer timer(timeout); + BOOL ret = timer.Wait(); + + if (ret) { + if (!condition || *condition) { + if (sem[kSemaphoreCountIndex] == 0) { + err_global_get() = kErrorUnavailable; + return FALSE; + } + + err_global_get() = kErrorSuccess; + sem[kSemaphoreCountIndex]--; + + return TRUE; + } + } + + err_global_get() = kErrorTimeout; + + return FALSE; // Failed to acquire semaphore +} } // namespace Kernel
\ No newline at end of file diff --git a/dev/kernel/KernelKit/ThreadLocalStorage.h b/dev/kernel/KernelKit/ThreadLocalStorage.h index 1b8e4821..47ff526c 100644 --- a/dev/kernel/KernelKit/ThreadLocalStorage.h +++ b/dev/kernel/KernelKit/ThreadLocalStorage.h @@ -10,24 +10,24 @@ #include <NeKit/Defines.h> #include <NeKit/ErrorOr.h> -///! @brief Thread Local Storage for neoskrnl. +///! @brief Thread Local Storage for NeKernel. -#define kCookieMag0Idx 0 -#define kCookieMag1Idx 1 -#define kCookieMag2Idx 2 +#define kCookieMag0Idx (0U) +#define kCookieMag1Idx (1U) +#define kCookieMag2Idx (2U) -#define kCookieMag0 'Z' +#define kCookieMag0 'N' #define kCookieMag1 'K' -#define kCookieMag2 'A' +#define kCookieMag2 'O' -#define kTLSCookieLen (3U) +#define kCookieMagLen (3U) struct THREAD_INFORMATION_BLOCK; /// @brief Thread Information Block. /// Located in GS on AMD64, other architectures have their own stuff. (64x0, 32x0, ARM64) struct PACKED THREAD_INFORMATION_BLOCK final { - Kernel::Char Cookie[kTLSCookieLen]{0}; //! Thread Magic Number. + Kernel::Char Cookie[kCookieMagLen]{0}; //! Thread Magic Number. Kernel::VoidPtr UserData{nullptr}; //! Thread Information Record (User defined canary structure) }; diff --git a/dev/kernel/KernelKit/UserProcessScheduler.h b/dev/kernel/KernelKit/UserProcessScheduler.h index 5bc5b8d2..3dae178a 100644 --- a/dev/kernel/KernelKit/UserProcessScheduler.h +++ b/dev/kernel/KernelKit/UserProcessScheduler.h @@ -62,7 +62,7 @@ class USER_PROCESS final { }; USER_PROCESS_SIGNAL Signal; - PROCESS_FILE_TREE<UInt32*>* FileTree{nullptr}; + PROCESS_FILE_TREE<VoidPtr>* FileTree{nullptr}; PROCESS_HEAP_TREE<VoidPtr>* HeapTree{nullptr}; UserProcessTeam* ParentTeam; @@ -93,7 +93,10 @@ class USER_PROCESS final { /***********************************************************************************/ Void Crash(); - Bool SpawnDylib(); + /***********************************************************************************/ + ///! @brief Spawns a dynamic library handle if dylib. + /***********************************************************************************/ + Bool InitDylib(); /***********************************************************************************/ ///! @brief Exits the app. @@ -189,7 +192,7 @@ class UserProcessScheduler final : public ISchedulable { NE_MOVE_DELETE(UserProcessScheduler) public: - operator bool(); + operator bool(); bool operator!(); public: diff --git a/dev/kernel/KernelKit/UserProcessScheduler.inl b/dev/kernel/KernelKit/UserProcessScheduler.inl index df35e037..0605a5e0 100644 --- a/dev/kernel/KernelKit/UserProcessScheduler.inl +++ b/dev/kernel/KernelKit/UserProcessScheduler.inl @@ -17,7 +17,7 @@ namespace Kernel { /***********************************************************************************/ -/** @brief Free pointer from usage. */ +/** @brief Free pointer/file from usage. */ /***********************************************************************************/ template <typename T> diff --git a/dev/kernel/NeKit/Crc32.h b/dev/kernel/NeKit/Crc32.h index 8988f828..0fc35134 100644 --- a/dev/kernel/NeKit/Crc32.h +++ b/dev/kernel/NeKit/Crc32.h @@ -16,7 +16,7 @@ #define kCrcCnt (256) namespace Kernel { -UInt32 ke_calculate_crc32(const Char* crc, Int32 len) noexcept; +UInt32 ke_calculate_crc32(const VoidPtr crc, Int32 len) noexcept; } // namespace Kernel #endif // !CRC32_H diff --git a/dev/kernel/NeKit/Macros.h b/dev/kernel/NeKit/Macros.h index b46ffaa8..e80e2e47 100644 --- a/dev/kernel/NeKit/Macros.h +++ b/dev/kernel/NeKit/Macros.h @@ -16,7 +16,7 @@ #endif #ifndef kib_cast -#define kib_cast(X) (Kernel::UInt64)((X) *1024) +#define kib_cast(X) (Kernel::UInt64)((X) * 1024) #endif #ifndef MIB diff --git a/dev/kernel/NeKit/OwnPtr.h b/dev/kernel/NeKit/OwnPtr.h index 674f9ff3..f5ff4b54 100644 --- a/dev/kernel/NeKit/OwnPtr.h +++ b/dev/kernel/NeKit/OwnPtr.h @@ -50,7 +50,7 @@ class OwnPtr final { Ref<T> AsRef() { return Ref<T>(fCls); } - operator bool() { return fCls; } + operator bool() { return fCls; } bool operator!() { return !fCls; } private: diff --git a/dev/kernel/NeKit/Ref.h b/dev/kernel/NeKit/Ref.h index 4d343bc5..46e94f88 100644 --- a/dev/kernel/NeKit/Ref.h +++ b/dev/kernel/NeKit/Ref.h @@ -29,7 +29,7 @@ class Ref final { return *this; } - NE_COPY_DEFAULT(Ref); + NE_COPY_DEFAULT(Ref) public: T operator->() const { return fClass; } diff --git a/dev/kernel/NeKit/Utils.h b/dev/kernel/NeKit/Utils.h index 43526fc8..11566008 100644 --- a/dev/kernel/NeKit/Utils.h +++ b/dev/kernel/NeKit/Utils.h @@ -1,4 +1,3 @@ - /* ------------------------------------------- Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. @@ -29,6 +28,10 @@ Int rt_to_lower(Int c); voidPtr rt_string_in_string(const Char* in, const Char* needle); char* rt_string_has_char(Char* str, Char chr); +// Safe memory functions +Int rt_copy_memory_safe(const voidPtr src, voidPtr dst, Size len, Size dst_size); +voidPtr rt_set_memory_safe(voidPtr dst, UInt32 value, Size len, Size dst_size); + /// UNICODE API Int urt_string_cmp(const Char* src, const Char* cmp, Size len); diff --git a/dev/kernel/NetworkKit/IPC.h b/dev/kernel/NetworkKit/IPC.h index 0dd8a1f1..d14356c0 100644 --- a/dev/kernel/NetworkKit/IPC.h +++ b/dev/kernel/NetworkKit/IPC.h @@ -57,6 +57,12 @@ enum { constexpr inline auto kIPCMsgSize = 6094U; +enum { + kIPCLockInvalid, + kIPCLockFree = 1, + kIPCLockUsed = 2, +}; + /// @brief IPC connection header, message cannot be greater than 6K. typedef struct IPC_MSG final { UInt32 IpcHeaderMagic; // cRemoteHeaderMagic @@ -68,7 +74,7 @@ typedef struct IPC_MSG final { UInt32 IpcMsg; UInt32 IpcMsgSz; UInt8 IpcData[kIPCMsgSize]; - + UInt32 IpcLock; /// @brief Passes the message to target, could be anything, HTTP packet, JSON or whatever. static Bool Pass(IPC_MSG* self, IPC_MSG* target) noexcept; } PACKED IPC_MSG; diff --git a/dev/kernel/amd64-ci.make b/dev/kernel/amd64-ci.make index c728b29c..f21efca4 100644 --- a/dev/kernel/amd64-ci.make +++ b/dev/kernel/amd64-ci.make @@ -1,6 +1,6 @@ ################################################## # (c) Amlal El Mahrouss, all rights reserved. -# This is the neoskrnl's makefile. +# This is the NeKernel's makefile. ################################################## CXX = x86_64-w64-mingw32-g++ @@ -42,7 +42,7 @@ error: @echo "=== ERROR ===" @echo "=> Use a specific target." -MOVEALL=./MoveAll.X64.sh +MOVEALL=./move-all-x64.sh WINDRES=x86_64-w64-mingw32-windres .PHONY: nekernel-amd64-epm diff --git a/dev/kernel/amd64-desktop.make b/dev/kernel/amd64-desktop.make index 21488782..36b0f18e 100644 --- a/dev/kernel/amd64-desktop.make +++ b/dev/kernel/amd64-desktop.make @@ -1,6 +1,6 @@ ################################################## # (c) Amlal El Mahrouss, all rights reserved. -# This is the neoskrnl's makefile. +# This is the NeKernel's makefile. ################################################## CXX = x86_64-w64-mingw32-g++ @@ -44,7 +44,7 @@ error: @echo "=== ERROR ===" @echo "=> Use a specific target." -MOVEALL=./MoveAll.X64.sh +MOVEALL=./move-all-x64.sh WINDRES=x86_64-w64-mingw32-windres .PHONY: nekernel-amd64-epm diff --git a/dev/kernel/arm64-desktop.make b/dev/kernel/arm64-desktop.make index 423391af..e83e1db8 100644 --- a/dev/kernel/arm64-desktop.make +++ b/dev/kernel/arm64-desktop.make @@ -30,7 +30,7 @@ error: @echo "=== ERROR ===" @echo "=> Use a specific target." -MOVEALL=./MoveAll.ARM64.sh +MOVEALL=./move-all-aarch64.sh .PHONY: nekernel-arm64-epm nekernel-arm64-epm: clean diff --git a/dev/kernel/MoveAll.ARM64.sh b/dev/kernel/move-all-aarch64.sh index 35e0909e..35e0909e 100755 --- a/dev/kernel/MoveAll.ARM64.sh +++ b/dev/kernel/move-all-aarch64.sh diff --git a/dev/kernel/MoveAll.X64.sh b/dev/kernel/move-all-x64.sh index 1c135d06..1c135d06 100755 --- a/dev/kernel/MoveAll.X64.sh +++ b/dev/kernel/move-all-x64.sh diff --git a/dev/kernel/src/ACPIFactoryInterface.cc b/dev/kernel/src/ACPIFactoryInterface.cc index 8cc11cad..01f30500 100644 --- a/dev/kernel/src/ACPIFactoryInterface.cc +++ b/dev/kernel/src/ACPIFactoryInterface.cc @@ -10,12 +10,11 @@ #include <modules/ACPI/ACPIFactoryInterface.h> namespace Kernel { -constexpr STATIC const auto kMinACPIVer = 1; +constexpr STATIC const auto kMinACPIVer = 1U; /// @brief Finds a descriptor table inside ACPI XSDT. ErrorOr<voidPtr> ACPIFactoryInterface::Find(const Char* signature) { - MUST_PASS(this->fRsdp); - + if (this->fRsdp) return ErrorOr<voidPtr>{kErrorInvalidData}; if (!signature) return ErrorOr<voidPtr>{-kErrorInvalidData}; if (*signature == 0) return ErrorOr<voidPtr>{-kErrorInvalidData}; @@ -33,7 +32,7 @@ ErrorOr<voidPtr> ACPIFactoryInterface::Find(const Char* signature) { if (num < 1) { /// stop here, we should have entries... ke_panic(RUNTIME_CHECK_ACPI); - return ErrorOr<voidPtr>{-1}; + return ErrorOr<voidPtr>{-kErrorInvalidData}; } this->fEntries = num; @@ -62,7 +61,7 @@ ErrorOr<voidPtr> ACPIFactoryInterface::Find(const Char* signature) { } } - return ErrorOr<voidPtr>{-1}; + return ErrorOr<voidPtr>{-kErrorInvalidData}; } /*** diff --git a/dev/kernel/src/AsciiUtils.cc b/dev/kernel/src/AsciiUtils.cc index bfc56aec..66a4aaef 100644 --- a/dev/kernel/src/AsciiUtils.cc +++ b/dev/kernel/src/AsciiUtils.cc @@ -8,8 +8,8 @@ namespace Kernel { -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); +Int rt_copy_memory_safe(const voidPtr src, voidPtr dst, Size len, Size dst_size); +voidPtr rt_set_memory_safe(voidPtr dst, UInt32 value, Size len, Size dst_size); Int32 rt_string_cmp(const Char* src, const Char* cmp, Size size) { for (Size i = 0; i < size; ++i) { @@ -45,7 +45,7 @@ const Char* rt_alloc_string(const Char* src) { return buffer; } -STATIC Int rt_copy_memory_safe(const voidPtr src, voidPtr dst, Size len, Size dst_size) { +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); @@ -58,7 +58,7 @@ STATIC Int rt_copy_memory_safe(const voidPtr src, voidPtr dst, Size len, Size ds return static_cast<Int>(len); } -STATIC voidPtr rt_set_memory_safe(voidPtr dst, UInt32 value, Size len, Size dst_size) { +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); @@ -73,8 +73,7 @@ Void rt_zero_memory(voidPtr pointer, Size len) { #ifdef __NE_ENFORCE_DEPRECATED_WARNINGS [[deprecated("Use rt_set_memory_safe instead")]] #endif -voidPtr -rt_set_memory(voidPtr src, UInt32 value, Size len) { +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); @@ -156,26 +155,18 @@ Char* rt_string_has_char(Char* str, Char ch) { return (*str == ch) ? str : nullptr; } -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])); -} - -// @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* memset(void* dst, int c, long long unsigned int len) { + return Kernel::rt_set_memory_safe(dst, c, static_cast<Size>(len), 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, static_cast<Size>(len)); +EXTERN_C void* memcpy(void* dst, const void* src, long long unsigned int len) { + Kernel::rt_copy_memory_safe(const_cast<void*>(src), dst, static_cast<Size>(len), + static_cast<Size>(len)); return dst; } -extern "C" Kernel::Int32 strcmp(const char* a, const char* b) { - return Kernel::rt_strcmp(a, b); +EXTERN_C Kernel::Int32 strcmp(const char* a, const char* b) { + return Kernel::rt_string_cmp(a, b, rt_string_len(a)); } } // namespace Kernel diff --git a/dev/kernel/src/BinaryMutex.cc b/dev/kernel/src/BinaryMutex.cc index bbf7a477..9bfb89d9 100644 --- a/dev/kernel/src/BinaryMutex.cc +++ b/dev/kernel/src/BinaryMutex.cc @@ -11,10 +11,10 @@ namespace Kernel { /***********************************************************************************/ /// @brief Unlocks the binary mutex. /***********************************************************************************/ + Bool BinaryMutex::Unlock() noexcept { - if (fLockingProcess.Status == ProcessStatusKind::kRunning) { - fLockingProcess = USER_PROCESS(); - fLockingProcess.Status = ProcessStatusKind::kFrozen; + if (fLockingProcess->Status == ProcessStatusKind::kRunning) { + fLockingProcess = nullptr; return Yes; } @@ -25,7 +25,8 @@ Bool BinaryMutex::Unlock() noexcept { /***********************************************************************************/ /// @brief Locks process in the binary mutex. /***********************************************************************************/ -Bool BinaryMutex::Lock(USER_PROCESS& process) { + +Bool BinaryMutex::Lock(USER_PROCESS* process) { if (!process || this->IsLocked()) return No; this->fLockingProcess = process; @@ -36,14 +37,16 @@ Bool BinaryMutex::Lock(USER_PROCESS& process) { /***********************************************************************************/ /// @brief Checks if process is locked. /***********************************************************************************/ + Bool BinaryMutex::IsLocked() const { - return this->fLockingProcess.Status == ProcessStatusKind::kRunning; + return this->fLockingProcess->Status == ProcessStatusKind::kRunning; } /***********************************************************************************/ /// @brief Try lock or wait. /***********************************************************************************/ -Bool BinaryMutex::LockOrWait(USER_PROCESS& process, TimerInterface* timer) { + +Bool BinaryMutex::LockOrWait(USER_PROCESS* process, TimerInterface* timer) { if (timer == nullptr) return No; this->Lock(process); @@ -57,7 +60,8 @@ Bool BinaryMutex::LockOrWait(USER_PROCESS& process, TimerInterface* timer) { /// @brief Wait for process **sec** until we check if it's free. /// @param sec seconds. /***********************************************************************************/ -BOOL BinaryMutex::WaitForProcess(const Int16& sec) noexcept { + +BOOL BinaryMutex::WaitForProcess(const UInt32& sec) noexcept { HardwareTimer hw_timer(rtl_milliseconds(sec)); hw_timer.Wait(); diff --git a/dev/kernel/src/BitMapMgr.cc b/dev/kernel/src/BitMapMgr.cc index df678d41..22737dbe 100644 --- a/dev/kernel/src/BitMapMgr.cc +++ b/dev/kernel/src/BitMapMgr.cc @@ -19,6 +19,8 @@ #define kBitMapSizeIdx (1U) #define kBitMapUsedIdx (2U) +///! @author Amlal El Mahrouss (amlal@nekernel.org) + namespace Kernel { namespace HAL { namespace Detail { diff --git a/dev/kernel/src/Crc32.cc b/dev/kernel/src/Crc32.cc index fddcb095..46a1d940 100644 --- a/dev/kernel/src/Crc32.cc +++ b/dev/kernel/src/Crc32.cc @@ -49,11 +49,13 @@ UInt32 kChecksumPolys[kCrcCnt] = { /// @param in the data to compute. /// @param len the length of the data. /// @return CRC32 of **in**. -UInt32 ke_calculate_crc32(const Char* in, Int32 len) noexcept { - if (!in || *in == 0) return ~0; +UInt32 ke_calculate_crc32(const VoidPtr inp, Int32 len) noexcept { + if (!inp) return ~0; UInt32 crc = 0xffffffff; + Char* in = static_cast<Char*>(inp); + while ((len--) > 0) crc = (crc >> 8) ^ kChecksumPolys[(crc ^ *(in++)) & 0xFF]; return ~crc; diff --git a/dev/kernel/src/DriveMgr.cc b/dev/kernel/src/DriveMgr.cc index b7c181c8..9f107e97 100644 --- a/dev/kernel/src/DriveMgr.cc +++ b/dev/kernel/src/DriveMgr.cc @@ -15,7 +15,8 @@ /***********************************************************************************/ /// @file DriveMgr.cc -/// @brief Drive Manager of kernel. +/// @brief Drive Manager of NeKernel. +///! @author Amlal El Mahrouss (amlal@nekernel.org) /***********************************************************************************/ namespace Kernel { diff --git a/dev/kernel/src/FS/HeFS+FileSystemParser.cc b/dev/kernel/src/FS/HeFS+FileSystemParser.cc index 39f8c0a1..344369d5 100644 --- a/dev/kernel/src/FS/HeFS+FileSystemParser.cc +++ b/dev/kernel/src/FS/HeFS+FileSystemParser.cc @@ -89,6 +89,8 @@ namespace Detail { /// @param path the directory path. /// @return The hashed path. STATIC UInt64 hefsi_hash_64(const Utf8Char* path) { + if (!path || *path == 0) return 0; + const UInt64 FNV_OFFSET_BASIS = 0xcbf29ce484222325ULL; const UInt64 FNV_PRIME = 0x100000001b3ULL; @@ -798,11 +800,11 @@ _Output Bool HeFileSystemParser::Format(_Input _Output DriveTrait* mnt, _Input c return NO; } - rt_copy_memory((VoidPtr) "fs/hefs-packet", mnt->fPacket.fPacketMime, - rt_string_len("fs/hefs-packet")); + rt_copy_memory_safe((VoidPtr) "fs/hefs-packet", mnt->fPacket.fPacketMime, + rt_string_len("fs/hefs-packet"), sizeof(mnt->fPacket.fPacketMime)); urt_copy_memory((VoidPtr) vol_name, boot->fVolName, urt_string_len(vol_name) + 1); - rt_copy_memory((VoidPtr) kHeFSMagic, boot->fMagic, kHeFSMagicLen - 1); + rt_copy_memory_safe((VoidPtr) kHeFSMagic, boot->fMagic, kHeFSMagicLen - 1, sizeof(boot->fMagic)); if (mnt->fLbaStart > mnt->fLbaEnd) { err_global_get() = kErrorDiskIsCorrupted; @@ -906,8 +908,8 @@ _Output Bool HeFileSystemParser::INodeDirectoryCtlManip(_Input DriveTrait* mnt, HEFS_BOOT_NODE* boot = (HEFS_BOOT_NODE*) mm_alloc_ptr(sizeof(HEFS_BOOT_NODE), Yes, No); - rt_copy_memory((VoidPtr) "fs/hefs-packet", mnt->fPacket.fPacketMime, - rt_string_len("fs/hefs-packet")); + rt_copy_memory_safe((VoidPtr) "fs/hefs-packet", mnt->fPacket.fPacketMime, + rt_string_len("fs/hefs-packet"), sizeof(mnt->fPacket.fPacketMime)); mnt->fPacket.fPacketLba = mnt->fLbaStart; mnt->fPacket.fPacketSize = sizeof(HEFS_BOOT_NODE); @@ -992,8 +994,8 @@ _Output Bool HeFileSystemParser::INodeManip(_Input DriveTrait* mnt, VoidPtr bloc return NO; } - rt_copy_memory((VoidPtr) "fs/hefs-packet", mnt->fPacket.fPacketMime, - rt_string_len("fs/hefs-packet")); + rt_copy_memory_safe((VoidPtr) "fs/hefs-packet", mnt->fPacket.fPacketMime, + rt_string_len("fs/hefs-packet"), sizeof(mnt->fPacket.fPacketMime)); mnt->fPacket.fPacketLba = mnt->fLbaStart; mnt->fPacket.fPacketSize = sizeof(HEFS_BOOT_NODE); @@ -1078,8 +1080,8 @@ _Output Bool HeFileSystemParser::INodeCtlManip(_Input DriveTrait* mnt, _Input co return NO; } - rt_copy_memory((VoidPtr) "fs/hefs-packet", mnt->fPacket.fPacketMime, - rt_string_len("fs/hefs-packet")); + rt_copy_memory_safe((VoidPtr) "fs/hefs-packet", mnt->fPacket.fPacketMime, + rt_string_len("fs/hefs-packet"), sizeof(mnt->fPacket.fPacketMime)); mnt->fPacket.fPacketLba = mnt->fLbaStart; mnt->fPacket.fPacketSize = sizeof(HEFS_BOOT_NODE); diff --git a/dev/kernel/src/FS/NeFS+FileSystemParser.cc b/dev/kernel/src/FS/NeFS+FileSystemParser.cc index 18595e9f..7b9ebcd6 100644 --- a/dev/kernel/src/FS/NeFS+FileSystemParser.cc +++ b/dev/kernel/src/FS/NeFS+FileSystemParser.cc @@ -154,8 +154,8 @@ _Output BOOL NeFileSystemParser::CreateFork(_Input NEFS_FORK_STRUCT& the_fork) { /// @return the newly found fork. /***********************************************************************************/ _Output NEFS_FORK_STRUCT* NeFileSystemParser::FindFork(_Input NEFS_CATALOG_STRUCT* catalog, - _Input const Char* name, - _Input Boolean is_data) { + _Input const Char* name, + _Input Boolean is_data) { if (!catalog || !name) return nullptr; auto& drive = kMountpoint.A(); @@ -167,8 +167,8 @@ _Output NEFS_FORK_STRUCT* NeFileSystemParser::FindFork(_Input NEFS_CATALOG_STRUC drive.fPacket.fPacketSize = sizeof(NEFS_FORK_STRUCT); drive.fPacket.fPacketContent = reinterpret_cast<VoidPtr>(&local_buf); - rt_copy_memory((VoidPtr) "fs/nefs-packet", drive.fPacket.fPacketMime, - rt_string_len("fs/nefs-packet")); + rt_copy_memory_safe((VoidPtr) "fs/nefs-packet", drive.fPacket.fPacketMime, + rt_string_len("fs/nefs-packet"), sizeof(drive.fPacket.fPacketMime)); if (auto res = fs_ifs_read(&kMountpoint, drive, this->mDriveIndex); res) { switch (res) { @@ -190,7 +190,7 @@ _Output NEFS_FORK_STRUCT* NeFileSystemParser::FindFork(_Input NEFS_CATALOG_STRUC if (KStringBuilder::Equals(local_buf.ForkName, name) && KStringBuilder::Equals(local_buf.CatalogName, catalog->Name)) { auto result = new NEFS_FORK_STRUCT(); - rt_copy_memory(&local_buf, result, sizeof(NEFS_FORK_STRUCT)); + rt_copy_memory_safe(&local_buf, result, sizeof(NEFS_FORK_STRUCT), sizeof(NEFS_FORK_STRUCT)); return result; } @@ -217,7 +217,7 @@ _Output NEFS_CATALOG_STRUCT* NeFileSystemParser::CreateCatalog(_Input const Char /// @param kind the catalog kind. /// @return catalog pointer. /***********************************************************************************/ -_Output NEFS_CATALOG_STRUCT* NeFileSystemParser::CreateCatalog(_Input const Char* name, +_Output NEFS_CATALOG_STRUCT* NeFileSystemParser::CreateCatalog(_Input const Char* name, _Input const Int32& flags, _Input const Int32& kind) { kout << "CreateCatalog(*...*)\r"; @@ -249,7 +249,7 @@ _Output NEFS_CATALOG_STRUCT* NeFileSystemParser::CreateCatalog(_Input const Char } Char* parent_name = (Char*) mm_alloc_ptr(nameLen + 1, Yes, No); - rt_copy_memory(const_cast<Char*>(name), parent_name, nameLen + 1); + rt_copy_memory_safe(const_cast<Char*>(name), parent_name, nameLen + 1, nameLen + 1); if (nameLen < 2) { mm_free_ptr(parent_name); @@ -312,13 +312,14 @@ _Output NEFS_CATALOG_STRUCT* NeFileSystemParser::CreateCatalog(_Input const Char --i; if (kind == kNeFSCatalogKindDir) --i; while (name[i] != '/') --i; - rt_copy_memory((VoidPtr) (name + i), (VoidPtr) child_catalog->Name, rt_string_len(name) - i); + rt_copy_memory_safe((VoidPtr) (name + i), (VoidPtr) child_catalog->Name, rt_string_len(name) - i, + kNeFSCatalogNameLen); NEFS_CATALOG_STRUCT temporary_catalog{}; Lba start_free = out_lba; - rt_copy_memory((VoidPtr) "fs/nefs-packet", drive.fPacket.fPacketMime, - rt_string_len("fs/nefs-packet")); + rt_copy_memory_safe((VoidPtr) "fs/nefs-packet", drive.fPacket.fPacketMime, + rt_string_len("fs/nefs-packet"), sizeof(drive.fPacket.fPacketMime)); Char buf_part_block[sizeof(NEFS_ROOT_PARTITION_BLOCK)] = {0}; drive.fPacket.fPacketContent = reinterpret_cast<VoidPtr>(buf_part_block); @@ -380,13 +381,15 @@ _Output NEFS_CATALOG_STRUCT* NeFileSystemParser::CreateCatalog(_Input const Char delete catalog; NEFS_CATALOG_STRUCT* found_catalog = new NEFS_CATALOG_STRUCT(); - rt_copy_memory(&temporary_catalog, found_catalog, sizeof(NEFS_CATALOG_STRUCT)); + rt_copy_memory_safe(&temporary_catalog, found_catalog, sizeof(NEFS_CATALOG_STRUCT), + sizeof(NEFS_CATALOG_STRUCT)); delete child_catalog; return found_catalog; } else if ((temporary_catalog.Flags & kNeFSFlagCreated) && KStringBuilder::Equals(temporary_catalog.Name, name)) { - rt_copy_memory(&temporary_catalog, child_catalog, sizeof(NEFS_CATALOG_STRUCT)); + rt_copy_memory_safe(&temporary_catalog, child_catalog, sizeof(NEFS_CATALOG_STRUCT), + sizeof(NEFS_CATALOG_STRUCT)); delete catalog; return child_catalog; } @@ -411,8 +414,8 @@ bool NeFileSystemParser::Format(_Input _Output DriveTrait* drive, _Input const I // verify disk. drive->fVerify(drive->fPacket); - rt_copy_memory((VoidPtr) "fs/nefs-packet", drive->fPacket.fPacketMime, - rt_string_len("fs/nefs-packet")); + rt_copy_memory_safe((VoidPtr) "fs/nefs-packet", drive->fPacket.fPacketMime, + rt_string_len("fs/nefs-packet"), sizeof(drive->fPacket.fPacketMime)); if (!drive->fPacket.fPacketGood) { err_global_get() = kErrorDiskIsCorrupted; return false; @@ -430,9 +433,10 @@ bool NeFileSystemParser::Format(_Input _Output DriveTrait* drive, _Input const I if (rt_string_cmp(kNeFSIdent, part_block->Ident, kNeFSIdentLen) == 0) return true; const auto kNeFSUntitledHD = part_name; - rt_copy_memory((VoidPtr) kNeFSIdent, (VoidPtr) part_block->Ident, kNeFSIdentLen); - rt_copy_memory((VoidPtr) kNeFSUntitledHD, (VoidPtr) part_block->PartitionName, - rt_string_len(kNeFSUntitledHD)); + rt_copy_memory_safe((VoidPtr) kNeFSIdent, (VoidPtr) part_block->Ident, kNeFSIdentLen, + sizeof(part_block->Ident)); + rt_copy_memory_safe((VoidPtr) kNeFSUntitledHD, (VoidPtr) part_block->PartitionName, + rt_string_len(kNeFSUntitledHD), sizeof(part_block->PartitionName)); SizeT sectorCount = drv_std_get_sector_count(); SizeT sectorSize = drive->fSectorSz; @@ -513,9 +517,9 @@ bool NeFileSystemParser::WriteCatalog(_Input const Char* catalog_name, Bool is_r auto buf = new UInt8[size_of_data]; rt_set_memory(buf, 0, size_of_data); - rt_copy_memory(data, buf, size_of_data); - rt_copy_memory((VoidPtr) "fs/nefs-packet", drive.fPacket.fPacketMime, - rt_string_len("fs/nefs-packet")); + rt_copy_memory_safe(data, buf, size_of_data, size_of_data); + rt_copy_memory_safe((VoidPtr) "fs/nefs-packet", drive.fPacket.fPacketMime, + rt_string_len("fs/nefs-packet"), sizeof(drive.fPacket.fPacketMime)); NEFS_FORK_STRUCT* fork_data_input = new NEFS_FORK_STRUCT(); NEFS_FORK_STRUCT prev_fork{}; @@ -577,8 +581,8 @@ _Output NEFS_CATALOG_STRUCT* NeFileSystemParser::FindCatalog(_Input const Char* NEFS_ROOT_PARTITION_BLOCK part{}; auto& drive = kMountpoint.A(); - rt_copy_memory((VoidPtr) "fs/nefs-packet", drive.fPacket.fPacketMime, - rt_string_len("fs/nefs-packet")); + rt_copy_memory_safe((VoidPtr) "fs/nefs-packet", drive.fPacket.fPacketMime, + rt_string_len("fs/nefs-packet"), sizeof(drive.fPacket.fPacketMime)); drive.fPacket.fPacketContent = reinterpret_cast<VoidPtr>(&part); drive.fPacket.fPacketSize = sizeof(NEFS_ROOT_PARTITION_BLOCK); drive.fPacket.fPacketLba = kNeFSRootCatalogStartAddress; @@ -607,7 +611,8 @@ _Output NEFS_CATALOG_STRUCT* NeFileSystemParser::FindCatalog(_Input const Char* return nullptr; } NEFS_CATALOG_STRUCT* catalog_ptr = new NEFS_CATALOG_STRUCT(); - rt_copy_memory(&tmp, catalog_ptr, sizeof(NEFS_CATALOG_STRUCT)); + rt_copy_memory_safe(&tmp, catalog_ptr, sizeof(NEFS_CATALOG_STRUCT), + sizeof(NEFS_CATALOG_STRUCT)); out_lba = cursor; return catalog_ptr; } @@ -619,7 +624,8 @@ _Output NEFS_CATALOG_STRUCT* NeFileSystemParser::FindCatalog(_Input const Char* if (!KStringBuilder::Equals(catalog_name, NeFileSystemHelper::Root()) && local_search) { Char parent_name[kNeFSCatalogNameLen] = {0}; SizeT nameLen = rt_string_len(catalog_name); - rt_copy_memory(const_cast<Char*>(catalog_name), parent_name, nameLen + 1); + rt_copy_memory_safe(const_cast<Char*>(catalog_name), parent_name, nameLen + 1, + kNeFSCatalogNameLen); SizeT indexReverseCopy = nameLen - 1; if (parent_name[indexReverseCopy] == NeFileSystemHelper::Separator()) { @@ -727,8 +733,8 @@ _Output Boolean NeFileSystemParser::RemoveCatalog(_Input const Char* catalog_nam catalog->Flags &= (~kNeFSFlagCreated); catalog->Flags |= kNeFSFlagDeleted; - rt_copy_memory((VoidPtr) "fs/nefs-packet", drive.fPacket.fPacketMime, - rt_string_len("fs/nefs-packet")); + rt_copy_memory_safe((VoidPtr) "fs/nefs-packet", drive.fPacket.fPacketMime, + rt_string_len("fs/nefs-packet"), sizeof(drive.fPacket.fPacketMime)); drive.fPacket.fPacketLba = out_lba; drive.fPacket.fPacketSize = sizeof(NEFS_CATALOG_STRUCT); drive.fPacket.fPacketContent = reinterpret_cast<VoidPtr>(catalog); @@ -795,8 +801,8 @@ VoidPtr NeFileSystemParser::ReadCatalog(_Input _Output NEFS_CATALOG_STRUCT* cata } auto* fs_buf = new NEFS_FORK_STRUCT(); - rt_copy_memory((VoidPtr) "fs/nefs-packet", drive.fPacket.fPacketMime, - rt_string_len("fs/nefs-packet")); + rt_copy_memory_safe((VoidPtr) "fs/nefs-packet", drive.fPacket.fPacketMime, + rt_string_len("fs/nefs-packet"), sizeof(drive.fPacket.fPacketMime)); NEFS_FORK_STRUCT* fs_fork_data = nullptr; while (dataForkLba >= kNeFSCatalogStartAddress) { diff --git a/dev/kernel/src/FileMgr.cc b/dev/kernel/src/FileMgr.cc index e000965f..faed9ae1 100644 --- a/dev/kernel/src/FileMgr.cc +++ b/dev/kernel/src/FileMgr.cc @@ -10,6 +10,7 @@ /***********************************************************************************/ /// @file FileMgr.cc //! @brief File System Manager API. +///! @author Amlal El Mahrouss (amlal@nekernel.org) /***********************************************************************************/ namespace Kernel { diff --git a/dev/kernel/src/IPEFDylibObject.cc b/dev/kernel/src/IPEFDylibObject.cc index d1d4eeca..a24fba72 100644 --- a/dev/kernel/src/IPEFDylibObject.cc +++ b/dev/kernel/src/IPEFDylibObject.cc @@ -35,6 +35,7 @@ using namespace Kernel; /***********************************************************************************/ /// @file IPEFDylibObject.cc /// @brief PEF's Dylib runtime. +///! @author Amlal El Mahrouss (amlal@nekernel.org) /***********************************************************************************/ /***********************************************************************************/ diff --git a/dev/kernel/src/IndexableProperty.cc b/dev/kernel/src/IndexableProperty.cc index 1d2a1ce8..251d6645 100644 --- a/dev/kernel/src/IndexableProperty.cc +++ b/dev/kernel/src/IndexableProperty.cc @@ -6,6 +6,8 @@ #include <CompilerKit/CompilerKit.h> #include <FSKit/IndexableProperty.h> +#include <NeKit/KString.h> +#include <NeKit/KernelPanic.h> #include <NeKit/MutableArray.h> #include <NeKit/Utils.h> @@ -16,13 +18,21 @@ namespace Kernel { namespace Indexer { - Index& IndexableProperty::Leak() noexcept { return fIndex; } + Index& IndexableProperty::Leak() noexcept { + return fIndex; + } - Void IndexableProperty::AddFlag(Int16 flag) { fFlags |= flag; } + Void IndexableProperty::AddFlag(Int16 flag) { + fFlags |= flag; + } - Void IndexableProperty::RemoveFlag(Int16 flag) { fFlags &= flag; } + Void IndexableProperty::RemoveFlag(Int16 flag) { + fFlags &= flag; + } - Int16 IndexableProperty::HasFlag(Int16 flag) { return fFlags & flag; } + Int16 IndexableProperty::HasFlag(Int16 flag) { + return fFlags & flag; + } /// @brief Index a file into the indexer instance. /// @param filename filesystem path to access. @@ -32,7 +42,8 @@ namespace Indexer { Void fs_index_file(const Char* filename, SizeT filenameLen, IndexableProperty& indexer) { if (!indexer.HasFlag(kIndexerClaimed)) { indexer.AddFlag(kIndexerClaimed); - rt_copy_memory((VoidPtr) indexer.Leak().Path, (VoidPtr) filename, filenameLen); + rt_copy_memory_safe(reinterpret_cast<VoidPtr>(const_cast<Char*>(filename)), + (VoidPtr) indexer.Leak().Path, filenameLen, kIndexerCatalogNameLength); (Void)(kout << "FSKit: Indexed new file: " << filename << kendl); } diff --git a/dev/kernel/src/Network/IPAddr.cc b/dev/kernel/src/Network/IPAddr.cc index b341af8f..ec7d8a35 100644 --- a/dev/kernel/src/Network/IPAddr.cc +++ b/dev/kernel/src/Network/IPAddr.cc @@ -88,19 +88,23 @@ ErrorOr<KString> IPFactory::ToKString(Ref<RawIPAddress>& ipv4) { bool IPFactory::IpCheckVersion4(const Char* ip) { if (!ip) return NO; - Int32 cnter = 0; + Int32 cnter = 0; + Int32 dot_cnter = 0; for (SizeT base = 0; base < rt_string_len(ip); ++base) { if (ip[base] == '.') { cnter = 0; + ++dot_cnter; } else { - if (!rt_is_alnum(ip[base])) return false; - if (cnter == 3) return false; + if (!rt_is_alnum(ip[base])) return NO; + if (cnter == 3) return NO; ++cnter; } } - return true; + if (dot_cnter != 3) return NO; + + return YES; } } // namespace Kernel diff --git a/dev/kernel/src/Network/IPCMsg.cc b/dev/kernel/src/Network/IPCMsg.cc index cff19cfa..9abefcef 100644 --- a/dev/kernel/src/Network/IPCMsg.cc +++ b/dev/kernel/src/Network/IPCMsg.cc @@ -87,6 +87,8 @@ Bool ipc_construct_packet(_Output IPC_MSG** pckt_in) { (*pckt_in)->IpcFrom.UserProcessID = 0; (*pckt_in)->IpcFrom.UserProcessTeam = 0; + (*pckt_in)->IpcLock = kIPCLockFree; + return Yes; } @@ -103,7 +105,19 @@ Bool IPC_MSG::Pass(IPC_MSG* src, IPC_MSG* target) noexcept { if (src->IpcMsgSz > target->IpcMsgSz) return No; if (target->IpcMsgSz > src->IpcMsgSz) return No; - rt_copy_memory(src->IpcData, target->IpcData, src->IpcMsgSz); + UInt32 timeout = 0U; + + while ((target->IpcLock % kIPCLockUsed) != 0) { + if (timeout > 100000U) { + return No; + } + } + + ++target->IpcLock; + + rt_copy_memory_safe(src->IpcData, target->IpcData, src->IpcMsgSz, kIPCMsgSize); + + --target->IpcLock; return Yes; } diff --git a/dev/kernel/src/PEFCodeMgr.cc b/dev/kernel/src/PEFCodeMgr.cc index ed72473f..c0caeb5b 100644 --- a/dev/kernel/src/PEFCodeMgr.cc +++ b/dev/kernel/src/PEFCodeMgr.cc @@ -1,9 +1,11 @@ /* ------------------------------------------- Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. + Copyright (C) 2025, Amlal El Mahrouss & NeKernel contributors, all rights reserved. ------------------------------------------- */ +#include <ArchKit/ArchKit.h> #include <KernelKit/DebugOutput.h> #include <KernelKit/HeapMgr.h> #include <KernelKit/PEFCodeMgr.h> @@ -12,6 +14,11 @@ #include <NeKit/KString.h> #include <NeKit/KernelPanic.h> #include <NeKit/OwnPtr.h> +#include <NeKit/Utils.h> + +/// @author Amlal El Mahrouss (amlal@nekernel.org) +/// @brief PEF backend for the Code Manager. +/// @file PEFCodeMgr.cc /// @brief PEF stack size symbol. #define kPefStackSizeSymbol "__PEFSizeOfReserveStack" @@ -23,7 +30,7 @@ namespace Detail { /***********************************************************************************/ /// @brief Get the PEF platform signature according to the compiled architecture. /***********************************************************************************/ - UInt32 ldr_get_platform(void) noexcept { + static UInt32 ldr_get_platform(void) noexcept { #if defined(__NE_32X0__) return kPefArch32x0; #elif defined(__NE_64X0__) @@ -57,30 +64,34 @@ PEFLoader::PEFLoader(const Char* path) : fCachedBlob(nullptr), fFatBinary(false) fFile.New(const_cast<Char*>(path), kRestrictRB); fPath = KStringBuilder::Construct(path).Leak(); - auto kPefHeader = "PEF_CONTAINER"; + constexpr auto kPefHeader = "PEF_CONTAINER"; - fCachedBlob = fFile->Read(kPefHeader, mib_cast(16)); + /// @note zero here means that the FileMgr will read every container header inside the file. + fCachedBlob = fFile->Read(kPefHeader, 0UL); PEFContainer* container = reinterpret_cast<PEFContainer*>(fCachedBlob); - if (container->Cpu == Detail::ldr_get_platform() && container->Magic[0] == kPefMagic[0] && - container->Magic[1] == kPefMagic[1] && container->Magic[2] == kPefMagic[2] && - container->Magic[3] == kPefMagic[3] && container->Magic[4] == kPefMagic[4] && - container->Abi == kPefAbi) { - return; - } else if (container->Magic[4] == kPefMagic[0] && container->Magic[3] == kPefMagic[1] && - container->Magic[2] == kPefMagic[2] && container->Magic[1] == kPefMagic[3] && - container->Magic[0] == kPefMagic[4] && container->Abi == kPefAbi) { - /// This is a fat binary. - this->fFatBinary = true; - return; + if (container->Abi == kPefAbi && + container->Count >= + 3) { /* if same ABI, AND: .text, .bss, .data (or at least similar) exists */ + if (container->Cpu == Detail::ldr_get_platform() && container->Magic[0] == kPefMagic[0] && + container->Magic[1] == kPefMagic[1] && container->Magic[2] == kPefMagic[2] && + container->Magic[3] == kPefMagic[3] && container->Magic[4] == kPefMagic[4]) { + return; + } else if (container->Magic[0] == kPefMagicFat[0] && container->Magic[1] == kPefMagicFat[1] && + container->Magic[2] == kPefMagicFat[2] && container->Magic[3] == kPefMagicFat[3] && + container->Magic[4] == kPefMagicFat[4]) { + /// This is a fat binary, treat it as such. + this->fFatBinary = true; + return; + } } fBad = true; if (fCachedBlob) mm_free_ptr(fCachedBlob); - kout << "PEFLoader: Warning: Executable format error!\r"; + kout << "PEFLoader: warning: exec format error!\r"; fCachedBlob = nullptr; } @@ -102,14 +113,26 @@ PEFLoader::~PEFLoader() { ErrorOr<VoidPtr> PEFLoader::FindSymbol(const Char* name, Int32 kind) { if (!fCachedBlob || fBad || !name) return ErrorOr<VoidPtr>{kErrorInvalidData}; + auto blob = fFile->Read(name, sizeof(PEFCommandHeader)); + + if (!blob) return ErrorOr<VoidPtr>{kErrorInvalidData}; + PEFContainer* container = reinterpret_cast<PEFContainer*>(fCachedBlob); - auto blob = fFile->Read(name, sizeof(PEFCommandHeader)); + if (!container) return ErrorOr<VoidPtr>{kErrorInvalidData}; + + PEFCommandHeader* command_header = reinterpret_cast<PEFCommandHeader*>(blob); - PEFCommandHeader* container_header = reinterpret_cast<PEFCommandHeader*>(blob); + if (command_header->VMSize < 1 || command_header->VMAddress == 0) + return ErrorOr<VoidPtr>{kErrorInvalidData}; - constexpr auto kMangleCharacter = '$'; - const Char* kContainerKinds[] = {".code64", ".data64", ".zero64", nullptr}; + /// fat binary check. + if (command_header->Cpu != container->Cpu && !this->fFatBinary) { + return ErrorOr<VoidPtr>{kErrorInvalidData}; + } + + const auto kMangleCharacter = '$'; + const Char* kContainerKinds[] = {".code64", ".data64", ".zero64", nullptr}; ErrorOr<KString> error_or_symbol; @@ -128,8 +151,8 @@ ErrorOr<VoidPtr> PEFLoader::FindSymbol(const Char* name, Int32 kind) { } default: return ErrorOr<VoidPtr>{kErrorInvalidData}; - ; // prevent that from the kernel's mode perspective, let that happen if it - // were a user process. + // prevent that from the kernel's mode perspective, let that happen if it + // were a user process. } Char* unconst_symbol = const_cast<Char*>(name); @@ -142,35 +165,50 @@ ErrorOr<VoidPtr> PEFLoader::FindSymbol(const Char* name, Int32 kind) { error_or_symbol.Leak().Leak() += name; - for (SizeT index = 0; index < container->Count; ++index) { - if (KStringBuilder::Equals(container_header->Name, error_or_symbol.Leak().Leak().CData())) { - if (container_header->Kind == kind) { - if (container_header->Cpu != Detail::ldr_get_platform()) { - if (!this->fFatBinary) { - mm_free_ptr(blob); - return ErrorOr<VoidPtr>{kErrorInvalidData}; - } + if (KStringBuilder::Equals(command_header->Name, error_or_symbol.Leak().Leak().CData())) { + if (command_header->Kind == kind) { + if (command_header->Cpu != Detail::ldr_get_platform()) { + if (!this->fFatBinary) { + mm_free_ptr(blob); + blob = nullptr; + + return ErrorOr<VoidPtr>{kErrorInvalidData}; } + } + + Char* container_blob_value = new Char[command_header->VMSize]; + + rt_copy_memory_safe((VoidPtr) ((Char*) blob + sizeof(PEFCommandHeader)), container_blob_value, + command_header->VMSize, command_header->VMSize); - Char* container_blob_value = new Char[container_header->Size]; + mm_free_ptr(blob); - rt_copy_memory((VoidPtr) ((Char*) blob + sizeof(PEFCommandHeader)), container_blob_value, - container_header->Size); - mm_free_ptr(blob); + kout << "PEFLoader: info: Loaded stub: " << command_header->Name << "!\r"; - kout << "PEFLoader: Information: Loaded stub: " << container_header->Name << "!\r"; + Int32 ret = 0; + SizeT pages_count = (command_header->VMSize + kPageSize - 1) / kPageSize; - auto ret = HAL::mm_map_page((VoidPtr) container_header->VMAddress, - (VoidPtr) HAL::mm_get_page_addr(container_blob_value), - HAL::kMMFlagsPresent | HAL::kMMFlagsUser); + for (SizeT i_vm{}; i_vm < pages_count; ++i_vm) { + ret = HAL::mm_map_page( + (VoidPtr) (command_header->VMAddress + (i_vm * kPageSize)), + (VoidPtr) (HAL::mm_get_page_addr(container_blob_value) + (i_vm * kPageSize)), + HAL::kMMFlagsPresent | HAL::kMMFlagsUser); if (ret != kErrorSuccess) { - mm_free_ptr(container_blob_value); + /// We set the VMAddress to nullptr, if the mapping fail here. + for (SizeT i_vm_unmap{}; i_vm_unmap < i_vm; ++i_vm_unmap) { + ret = HAL::mm_map_page((VoidPtr) (command_header->VMAddress + (i_vm * kPageSize)), + nullptr, HAL::kMMFlagsPresent | HAL::kMMFlagsUser); + } + + delete[] container_blob_value; + container_blob_value = nullptr; + return ErrorOr<VoidPtr>{kErrorInvalidData}; } - - return ErrorOr<VoidPtr>{container_blob_value}; } + + return ErrorOr<VoidPtr>{container_blob_value}; } } @@ -198,17 +236,17 @@ const Char* PEFLoader::Path() { const Char* PEFLoader::AsString() { #ifdef __32x0__ - return "32x0 PEF."; + return "32x0 PEF"; #elif defined(__64x0__) - return "64x0 PEF."; + return "64x0 PEF"; #elif defined(__x86_64__) - return "x86_64 PEF."; + return "x86_64 PEF"; #elif defined(__aarch64__) - return "AARCH64 PEF."; + return "AARCH64 PEF"; #elif defined(__powerpc64__) - return "POWER64 PEF."; + return "POWER64 PEF"; #else - return "???? PEF."; + return "???? PEF"; #endif // __32x0__ || __64x0__ || __x86_64__ || __powerpc64__ } @@ -232,7 +270,7 @@ namespace Utils { symname = ErrorOr<VoidPtr>{(VoidPtr) rt_alloc_string("USER_PROCESS")}; } - auto id = + ProcessID id = UserProcessScheduler::The().Spawn(reinterpret_cast<const Char*>(symname.Leak().Leak()), errOrStart.Leak().Leak(), exec.GetBlob().Leak().Leak()); @@ -241,7 +279,7 @@ namespace Utils { if (id != kSchedInvalidPID) { auto stacksym = exec.FindSymbol(kPefStackSizeSymbol, kPefData); - if (!symname) { + if (!stacksym) { stacksym = ErrorOr<VoidPtr>{(VoidPtr) new UIntPtr(kSchedMaxStackSz)}; } diff --git a/dev/kernel/src/PageMgr.cc b/dev/kernel/src/PageMgr.cc index e78f4908..2aa2a79c 100644 --- a/dev/kernel/src/PageMgr.cc +++ b/dev/kernel/src/PageMgr.cc @@ -47,7 +47,7 @@ Bool PTEWrapper::Reclaim() { } /// @brief Request a PTE. -/// @param Rw r/w? +/// @param Rw Is it read write? or is it read only? /// @param User user mode? /// @param ExecDisable disable execution on page? /// @return diff --git a/dev/kernel/src/Semaphore.cc b/dev/kernel/src/Semaphore.cc new file mode 100644 index 00000000..acbbb57f --- /dev/null +++ b/dev/kernel/src/Semaphore.cc @@ -0,0 +1,7 @@ +/* ------------------------------------------- + + Copyright (C) 2025, Amlal El Mahrouss, all rights reserved. + +------------------------------------------- */ + +#include <KernelKit/Semaphore.h>
\ No newline at end of file diff --git a/dev/kernel/src/SoftwareTimer.cc b/dev/kernel/src/SoftwareTimer.cc index 535bec9e..52087931 100644 --- a/dev/kernel/src/SoftwareTimer.cc +++ b/dev/kernel/src/SoftwareTimer.cc @@ -7,6 +7,7 @@ #include <KernelKit/Timer.h> /// @brief SoftwareTimer class, meant to be generic. +///! @author Amlal El Mahrouss (amlal@nekernel.org) using namespace Kernel; diff --git a/dev/kernel/src/ThreadLocalStorage.cc b/dev/kernel/src/ThreadLocalStorage.cc index 03a71f1a..f54eeaab 100644 --- a/dev/kernel/src/ThreadLocalStorage.cc +++ b/dev/kernel/src/ThreadLocalStorage.cc @@ -16,6 +16,7 @@ /// @bugs: 0 /// @file ThreadLocalStorage.cc /// @brief NeKernel Thread Local Storage. +///! @author Amlal El Mahrouss (amlal@nekernel.org) /***********************************************************************************/ using namespace Kernel; diff --git a/dev/kernel/src/Timer.cc b/dev/kernel/src/Timer.cc index 826be99a..6539f1a9 100644 --- a/dev/kernel/src/Timer.cc +++ b/dev/kernel/src/Timer.cc @@ -9,6 +9,7 @@ ///! BUGS: 0 ///! @file Timer.cc ///! @brief Software Timer implementation +///! @author Amlal El Mahrouss (amlal@nekernel.org) using namespace Kernel; diff --git a/dev/kernel/src/UserMgr.cc b/dev/kernel/src/UserMgr.cc index 8eade85e..8e4ba540 100644 --- a/dev/kernel/src/UserMgr.cc +++ b/dev/kernel/src/UserMgr.cc @@ -13,8 +13,11 @@ #include <KernelKit/FileMgr.h> #include <KernelKit/HeapMgr.h> #include <KernelKit/KPC.h> +#include <KernelKit/ThreadLocalStorage.h> #include <KernelKit/UserMgr.h> +#include <NeKit/KString.h> #include <NeKit/KernelPanic.h> +#include <NeKit/Utils.h> #define kStdUserType (0xEE) #define kSuperUserType (0xEF) @@ -30,8 +33,8 @@ namespace Detail { /// \return the hashed password //////////////////////////////////////////////////////////// STATIC UInt64 user_fnv_generator(const Char* password, User* user) { - if (!password || !user) return 1; - if (*password == 0) return 1; + if (!password || !user) return 0; + if (*password == 0) return 0; kout << "user_fnv_generator: Hashing user password...\r"; @@ -47,7 +50,7 @@ namespace Detail { kout << "user_fnv_generator: Hashed user password.\r"; - return 0; + return hash; } } // namespace Detail @@ -56,14 +59,16 @@ namespace Detail { //////////////////////////////////////////////////////////// User::User(const Int32& sel, const Char* user_name) : mUserRing((UserRingKind) sel) { MUST_PASS(sel >= 0); - rt_copy_memory((VoidPtr) user_name, this->mUserName, rt_string_len(user_name)); + rt_copy_memory_safe((VoidPtr) user_name, this->mUserName, rt_string_len(user_name), + kMaxUserNameLen); } //////////////////////////////////////////////////////////// /// @brief User ring constructor. //////////////////////////////////////////////////////////// User::User(const UserRingKind& ring_kind, const Char* user_name) : mUserRing(ring_kind) { - rt_copy_memory((VoidPtr) user_name, this->mUserName, rt_string_len(user_name)); + rt_copy_memory_safe((VoidPtr) user_name, this->mUserName, rt_string_len(user_name), + kMaxUserNameLen); } //////////////////////////////////////////////////////////// diff --git a/dev/kernel/src/UserProcessScheduler.cc b/dev/kernel/src/UserProcessScheduler.cc index eff53745..45957c7b 100644 --- a/dev/kernel/src/UserProcessScheduler.cc +++ b/dev/kernel/src/UserProcessScheduler.cc @@ -20,6 +20,7 @@ #include <KernelKit/KPC.h> #include <KernelKit/ProcessScheduler.h> #include <NeKit/KString.h> +#include <NeKit/Utils.h> #include <SignalKit/Signals.h> ///! BUGS: 0 @@ -39,8 +40,9 @@ USER_PROCESS::~USER_PROCESS() = default; Void USER_PROCESS::Crash() { if (this->Status != ProcessStatusKind::kRunning) return; + this->Status = ProcessStatusKind::kKilled; + (Void)(kout << this->Name << ": crashed, error id: " << number(-kErrorProcessFault) << kendl); - this->Exit(-kErrorProcessFault); } /***********************************************************************************/ @@ -83,7 +85,8 @@ Void USER_PROCESS::Wake(Bool should_wakeup) { /** @param tree The tree to calibrate */ /***********************************************************************************/ -STATIC PROCESS_HEAP_TREE<VoidPtr>* sched_try_go_upper_ptr_tree(PROCESS_HEAP_TREE<VoidPtr>* tree) { +template <typename T> +STATIC T* sched_try_go_upper_ptr_tree(T* tree) { if (!tree) { return nullptr; } @@ -104,7 +107,7 @@ STATIC PROCESS_HEAP_TREE<VoidPtr>* sched_try_go_upper_ptr_tree(PROCESS_HEAP_TREE } /***********************************************************************************/ -/** @brief Allocate pointer to heap tree. */ +/** @brief Allocate pointer to heap/file tree. */ /***********************************************************************************/ ErrorOr<VoidPtr> USER_PROCESS::New(SizeT sz, SizeT pad_amount) { @@ -119,7 +122,7 @@ ErrorOr<VoidPtr> USER_PROCESS::New(SizeT sz, SizeT pad_amount) { hal_write_cr3(vm_register); #else - auto ptr = mm_alloc_ptr(sz, Yes, Yes, pad_amount); + auto ptr = mm_alloc_ptr(sz, Yes, Yes, pad_amount); #endif if (!this->HeapTree) { @@ -231,23 +234,24 @@ const AffinityKind& USER_PROCESS::GetAffinity() noexcept { /** @brief Free heap tree. */ /***********************************************************************************/ -STATIC Void sched_free_ptr_tree(PROCESS_HEAP_TREE<VoidPtr>* memory_ptr_list) { +template <typename T> +STATIC Void sched_free_ptr_tree(T* tree) { // Deleting memory lists. Make sure to free all of them. - while (memory_ptr_list) { - if (memory_ptr_list->Entry) { - MUST_PASS(mm_free_ptr(memory_ptr_list->Entry)); + while (tree) { + if (tree->Entry) { + MUST_PASS(mm_free_ptr(tree->Entry)); } - auto next = memory_ptr_list->Next; + auto next = tree->Next; if (next->Child) sched_free_ptr_tree(next->Child); - memory_ptr_list->Child = nullptr; + tree->Child = nullptr; - mm_free_ptr(memory_ptr_list); + mm_free_ptr(tree); - memory_ptr_list = nullptr; - memory_ptr_list = next; + tree = nullptr; + tree = next; } } @@ -271,6 +275,9 @@ Void USER_PROCESS::Exit(const Int32& exit_code) { sched_free_ptr_tree(this->HeapTree); this->HeapTree = nullptr; + sched_free_ptr_tree(this->FileTree); + this->FileTree = nullptr; + #ifdef __NE_VIRTUAL_MEMORY_SUPPORT__ hal_write_cr3(pd); #endif @@ -314,10 +321,10 @@ Void USER_PROCESS::Exit(const Int32& exit_code) { } /***********************************************************************************/ -/// @brief Add dylib to process. +/// @brief Add dylib to the process object. /***********************************************************************************/ -Bool USER_PROCESS::SpawnDylib() { +Bool USER_PROCESS::InitDylib() { // React according to the process's kind. switch (this->Kind) { case USER_PROCESS::kExecutableDylibKind: { @@ -340,7 +347,6 @@ Bool USER_PROCESS::SpawnDylib() { (Void)(kout << "Unknown process kind: " << hex_number(this->Kind) << kendl); this->Crash(); - return NO; return NO; } @@ -379,7 +385,8 @@ ProcessID UserProcessScheduler::Spawn(const Char* name, VoidPtr code, VoidPtr im return -kErrorProcessFault; } - rt_copy_memory(reinterpret_cast<VoidPtr>(const_cast<Char*>(name)), process.Name, len); + rt_copy_memory_safe(reinterpret_cast<VoidPtr>(const_cast<Char*>(name)), process.Name, len, + kSchedNameLen); #ifdef __NE_VIRTUAL_MEMORY_SUPPORT__ process.VMRegister = kKernelVM; @@ -419,6 +426,17 @@ ProcessID UserProcessScheduler::Spawn(const Char* name, VoidPtr code, VoidPtr im process.PTime = 0; process.RTime = 0; + if (!process.FileTree) { + process.FileTree = new PROCESS_FILE_TREE<VoidPtr>(); + + if (!process.FileTree) { + process.Crash(); + return ErrorOr<VoidPtr>(-kErrorHeapOutOfMemory); + } + + /// @todo File Tree allocation and dispose methods (amlal) + } + (Void)(kout << "PID: " << number(process.ProcessId) << kendl); (Void)(kout << "Name: " << process.Name << kendl); diff --git a/dev/kernel/src/UserProcessTeam.cc b/dev/kernel/src/UserProcessTeam.cc index dd21ac49..73ba7285 100644 --- a/dev/kernel/src/UserProcessTeam.cc +++ b/dev/kernel/src/UserProcessTeam.cc @@ -7,6 +7,7 @@ /***********************************************************************************/ /// @file UserProcessTeam.cc /// @brief Process teams implementation. +/// @author Amlal El Mahrouss (amlal@nekernel.org) /***********************************************************************************/ #include <KernelKit/UserProcessScheduler.h> diff --git a/dev/kernel/src/UtfUtils.cc b/dev/kernel/src/UtfUtils.cc index ae17aed7..a5c03b85 100644 --- a/dev/kernel/src/UtfUtils.cc +++ b/dev/kernel/src/UtfUtils.cc @@ -6,6 +6,8 @@ #include <NeKit/Utils.h> +/// @author Amlal El Mahrouss (amlal@nekernel.org) + namespace Kernel { Size urt_string_len(const Utf8Char* str) { SizeT len{0}; |
