diff options
Diffstat (limited to 'dev/kernel')
| -rw-r--r-- | dev/kernel/ArchKit/ArchKit.h | 6 | ||||
| -rw-r--r-- | dev/kernel/FirmwareKit/NeBoot/BootNet.h | 22 | ||||
| -rw-r--r-- | dev/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc | 16 | ||||
| -rw-r--r-- | dev/kernel/HALKit/AMD64/HalKernelMain.cc | 5 | ||||
| -rw-r--r-- | dev/kernel/HALKit/ARM64/HalCoreInterruptHandler.cc | 2 | ||||
| -rw-r--r-- | dev/kernel/HALKit/ARM64/HalKernelMain.cc | 4 | ||||
| -rw-r--r-- | dev/kernel/KernelKit/DebugOutput.h | 16 | ||||
| -rw-r--r-- | dev/kernel/SignalKit/SignalGen.h | 51 | ||||
| -rw-r--r-- | dev/kernel/SignalKit/Signals.h | 24 | ||||
| -rw-r--r-- | dev/kernel/src/ACPIFactoryInterface.cc | 6 | ||||
| -rw-r--r-- | dev/kernel/src/BitMapMgr.cc | 2 | ||||
| -rw-r--r-- | dev/kernel/src/UserProcessScheduler.cc | 4 |
12 files changed, 92 insertions, 66 deletions
diff --git a/dev/kernel/ArchKit/ArchKit.h b/dev/kernel/ArchKit/ArchKit.h index 37793370..2042bded 100644 --- a/dev/kernel/ArchKit/ArchKit.h +++ b/dev/kernel/ArchKit/ArchKit.h @@ -69,6 +69,7 @@ namespace HAL { typedef Kernel::Void (*rt_syscall_proc)(Kernel::VoidPtr); +/// @brief System Call Dispatch. struct HAL_DISPATCH_ENTRY final { Kernel::UInt64 fHash; Kernel::Bool fHooked; @@ -79,6 +80,7 @@ struct HAL_DISPATCH_ENTRY final { typedef Kernel::Void (*rt_kerncall_proc)(Kernel::SizeT, Kernel::VoidPtr, Kernel::SizeT); +/// @brief Kernel Call Dispatch. struct HAL_KERNEL_DISPATCH_ENTRY final { Kernel::UInt64 fHash; Kernel::Bool fHooked; @@ -95,4 +97,6 @@ inline Kernel::Array<HAL_KERNEL_DISPATCH_ENTRY, kMaxDispatchCallCount> kKernCall inline Kernel::VoidPtr kKernelVM = nullptr; -#endif // __NE_VIRTUAL_MEMORY_SUPPORT__
\ No newline at end of file +#endif // __NE_VIRTUAL_MEMORY_SUPPORT__ + +inline Kernel::SizeT kBitMapCursor = 0UL; diff --git a/dev/kernel/FirmwareKit/NeBoot/BootNet.h b/dev/kernel/FirmwareKit/NeBoot/BootNet.h index ad8f07c5..0f406b57 100644 --- a/dev/kernel/FirmwareKit/NeBoot/BootNet.h +++ b/dev/kernel/FirmwareKit/NeBoot/BootNet.h @@ -20,22 +20,22 @@ struct _BOOTNET_INTERNET_HEADER; /// sent (if m_preflight = 0) /// @note Can be used to patch ROMs too (if ImpliesProgram = 1) typedef struct _BOOTNET_INTERNET_HEADER { - Kernel::Char NB1; /// magic char 1 'O' - Kernel::Char NB2; /// magic char 2 'N' - Kernel::Char NB3; /// magic char 3 'E' - Kernel::Char NB4; /// magic char 4 'T' + Kernel::Char NB1; /// magic char 1 'O' + Kernel::Char NB2; /// magic char 2 'N' + Kernel::Char NB3; /// magic char 3 'E' + Kernel::Char NB4; /// magic char 4 'T' - Kernel::UInt16 Version; + Kernel::UInt16 Version; - Kernel::Char Name[kBootNetNameLen]; /// example: Modjo + Kernel::Char Name[kBootNetNameLen]; /// example: Modjo - Kernel::Int32 Length; /// the patch length. - Kernel::Char Target[kBootNetNameLen]; /// the target file. + Kernel::Int32 Length; /// the patch length. + Kernel::Char Target[kBootNetNameLen]; /// the target file. - Kernel::Boolean ImpliesProgram : 1; /// does it imply reprogramming? + Kernel::Boolean ImpliesProgram : 1; /// does it imply reprogramming? - Kernel::Boolean Preflight : 1; /// is it a preflight packet. - Kernel::Char Data[1]; /// non preflight packet has a patch blob for a **PatchTarget** + Kernel::Boolean Preflight : 1; /// is it a preflight packet. + Kernel::Char Data[1]; /// non preflight packet has a patch blob for a **PatchTarget** } PACKED BOOTNET_INTERNET_HEADER; using BOOTNET_INTERNET_HEADER_PTR = BOOTNET_INTERNET_HEADER*; diff --git a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc index b837497e..7408639c 100644 --- a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc +++ b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc @@ -8,7 +8,7 @@ #include <KernelKit/ProcessScheduler.h> #include <KernelKit/UserMgr.h> #include <NeKit/KString.h> -#include <SignalKit/Signals.h> +#include <SignalKit/SignalGen.h> EXTERN_C Kernel::Void idt_handle_breakpoint(Kernel::UIntPtr rip); @@ -80,8 +80,9 @@ EXTERN_C void idt_handle_math(Kernel::UIntPtr rsp) { hal_idt_send_eoi(8); process.Leak().Signal.SignalArg = rsp; - process.Leak().Signal.SignalID = SIGKILL; - process.Leak().Signal.Status = process.Leak().Status; + process.Leak().Signal.SignalID = sig_generate_unique<SIGKILL>(); + ; + process.Leak().Signal.Status = process.Leak().Status; } /// @brief Handle any generic fault. @@ -95,8 +96,9 @@ EXTERN_C void idt_handle_generic(Kernel::UIntPtr rsp) { Kernel::kout << "Kernel: Generic Process Fault.\r"; process.Leak().Signal.SignalArg = rsp; - process.Leak().Signal.SignalID = SIGKILL; - process.Leak().Signal.Status = process.Leak().Status; + process.Leak().Signal.SignalID = sig_generate_unique<SIGSEG>(); + ; + process.Leak().Signal.Status = process.Leak().Status; Kernel::kout << "Kernel: SIGKILL status.\r"; } @@ -107,7 +109,7 @@ EXTERN_C Kernel::Void idt_handle_breakpoint(Kernel::UIntPtr rip) { hal_idt_send_eoi(3); process.Leak().Signal.SignalArg = rip; - process.Leak().Signal.SignalID = SIGTRAP; + process.Leak().Signal.SignalID = sig_generate_unique<SIGTRAP>(); process.Leak().Signal.Status = process.Leak().Status; @@ -123,7 +125,7 @@ EXTERN_C void idt_handle_ud(Kernel::UIntPtr rsp) { hal_idt_send_eoi(6); process.Leak().Signal.SignalArg = rsp; - process.Leak().Signal.SignalID = SIGKILL; + process.Leak().Signal.SignalID = sig_generate_unique<SIGKILL>(); process.Leak().Signal.Status = process.Leak().Status; } diff --git a/dev/kernel/HALKit/AMD64/HalKernelMain.cc b/dev/kernel/HALKit/AMD64/HalKernelMain.cc index 3c6e7d36..f121fbb4 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 <misc/BenchKit/X64Chrono.h> +#include <misc/BenchKit/HWChronometer.h> #include <modules/ACPI/ACPIFactoryInterface.h> #include <modules/CoreGfx/TextGfx.h> @@ -41,7 +41,8 @@ EXTERN_C Int32 hal_init_platform(Kernel::HEL::BootInfoHeader* handover_hdr) { Boot::ExitBootServices(handover_hdr->f_HardwareTables.f_ImageKey, handover_hdr->f_HardwareTables.f_ImageHandle); - kKernelVM = kHandoverHeader->f_PageStart; + kBitMapCursor = 0UL; + kKernelVM = kHandoverHeader->f_PageStart; if (!kKernelVM) { MUST_PASS(kKernelVM); diff --git a/dev/kernel/HALKit/ARM64/HalCoreInterruptHandler.cc b/dev/kernel/HALKit/ARM64/HalCoreInterruptHandler.cc index 0c26f4cb..dd875c63 100644 --- a/dev/kernel/HALKit/ARM64/HalCoreInterruptHandler.cc +++ b/dev/kernel/HALKit/ARM64/HalCoreInterruptHandler.cc @@ -8,7 +8,7 @@ #include <KernelKit/ProcessScheduler.h> #include <KernelKit/UserMgr.h> #include <NeKit/KString.h> -#include <SignalKit/Signals.h> +#include <SignalKit/SignalGen.h> EXTERN_C Kernel::Void int_handle_breakpoint(Kernel::UIntPtr rip); EXTERN_C BOOL mp_handle_gic_interrupt_el0(Void); diff --git a/dev/kernel/HALKit/ARM64/HalKernelMain.cc b/dev/kernel/HALKit/ARM64/HalKernelMain.cc index 20bd3d8a..d7663f4e 100644 --- a/dev/kernel/HALKit/ARM64/HalKernelMain.cc +++ b/dev/kernel/HALKit/ARM64/HalKernelMain.cc @@ -37,6 +37,8 @@ EXTERN_C void hal_init_platform(Kernel::HEL::BootInfoHeader* handover_hdr) { FB::fb_clear_video(); + kBitMapCursor = 0UL; + #ifdef __NE_ARM64_EFI__ fw_init_efi((EfiSystemTable*) handover_hdr->f_FirmwareCustomTables[1]); @@ -74,4 +76,4 @@ EXTERN_C void hal_init_platform(Kernel::HEL::BootInfoHeader* handover_hdr) { while (YES) ; } -#endif
\ No newline at end of file +#endif diff --git a/dev/kernel/KernelKit/DebugOutput.h b/dev/kernel/KernelKit/DebugOutput.h index 992d1ca7..d2839341 100644 --- a/dev/kernel/KernelKit/DebugOutput.h +++ b/dev/kernel/KernelKit/DebugOutput.h @@ -12,18 +12,6 @@ #include <NeKit/Stream.h> #include <NeKit/Utils.h> -#define kDebugPort (51820U) - -#define kDebugMag0 'K' -#define kDebugMag1 'D' -#define kDebugMag2 'B' -#define kDebugMag3 'G' - -#define kDebugSourceFile 23 -#define kDebugLine 33 -#define kDebugTeam 43 -#define kDebugEOP 49 - namespace Kernel { class TerminalDevice; class DTraceDevice; @@ -180,6 +168,10 @@ inline TerminalDevice get_console_in(Char* buf) { return self; } +inline constexpr auto kDebugPort = 51820; +inline constexpr auto kDebugMagic = "VMK1.0.0;"; +inline constexpr auto kDebugVersion = 0x0100; + inline constexpr SizeT kDebugCmdLen = 256U; typedef Char rt_debug_cmd[kDebugCmdLen]; diff --git a/dev/kernel/SignalKit/SignalGen.h b/dev/kernel/SignalKit/SignalGen.h new file mode 100644 index 00000000..4be9452a --- /dev/null +++ b/dev/kernel/SignalKit/SignalGen.h @@ -0,0 +1,51 @@ +/* ------------------------------------------- + + Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. + +------------------------------------------- */ + +#pragma once + +#include <NeKit/Defines.h> + +#define SIGKILL 1 /* kill */ +#define SIGPAUS 2 /* pause */ +#define SIGEXEC 3 /* execute */ +#define SIGTRAP 4 /* trap */ +#define SIGABRT 5 /* abort */ +#define SIGCONT 6 /* continue */ +#define SIGSEG 7 /* process fault */ +#define SIGBREK 8 +#define SIGATCH 9 +#define SIGDTCH 10 + +/// @author Amlal El Mahrouss +/// @brief Signal Generation API. + +namespace Kernel { +typedef SizeT rt_signal_kind; + +/// @brief Standard signal seed for general purpose usage. +inline static constexpr auto kUserSignalSeed = 0x0895034fUL; + +/// @brief Special signal seed for kernel usage. +inline static constexpr auto kKernelSignalSeed = 0x0895034f9fUL; + +/// @brief Generate signal from **Sig** +template <rt_signal_kind Sig, SizeT Seed = kUserSignalSeed> +inline rt_signal_kind sig_generate_unique() { + static_assert(Sig > 0, "Signal is zero (invalid)"); + return Sig ^ Seed; +} + +/// @brief Checks if the signal matches the seed (user_seed or kernel_seed) +template <SizeT Seed> +inline BOOL sig_matches_seed(rt_signal_kind sig) { + return (sig & 0xFF000000) == (Seed & 0xFF000000); +} + +/// @brief Validate signal from **sig** +inline BOOL sig_validate_unique(rt_signal_kind sig) { + return sig > 0; +} +} // namespace Kernel diff --git a/dev/kernel/SignalKit/Signals.h b/dev/kernel/SignalKit/Signals.h deleted file mode 100644 index 142ed3ab..00000000 --- a/dev/kernel/SignalKit/Signals.h +++ /dev/null @@ -1,24 +0,0 @@ -/* ------------------------------------------- - - Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. - -------------------------------------------- */ - -#pragma once - -#include <NeKit/Defines.h> - -#define SIGKILL 0 -#define SIGPAUS 1 -#define SIGEXEC 2 -#define SIGTRAP 3 -#define SIGABRT 4 -#define SIGCONT 5 - -#define SIGBREK 666 -#define SIGATCH 661 -#define SIGDTCH 662 - -namespace Kernel { -typedef UInt32 SignalKind; -}
\ No newline at end of file diff --git a/dev/kernel/src/ACPIFactoryInterface.cc b/dev/kernel/src/ACPIFactoryInterface.cc index b4ac03cc..711ea588 100644 --- a/dev/kernel/src/ACPIFactoryInterface.cc +++ b/dev/kernel/src/ACPIFactoryInterface.cc @@ -14,7 +14,7 @@ constexpr STATIC const auto kMinACPIVer = 1U; /// @brief Finds a descriptor table inside ACPI XSDT. ErrorOr<voidPtr> ACPIFactoryInterface::Find(const Char* signature) { - if (this->fRsdp) return ErrorOr<voidPtr>{kErrorInvalidData}; + if (this->fRsdp) return ErrorOr<voidPtr>{-kErrorInvalidData}; if (!signature) return ErrorOr<voidPtr>{-kErrorInvalidData}; if (*signature == 0) return ErrorOr<voidPtr>{-kErrorInvalidData}; @@ -42,7 +42,7 @@ ErrorOr<voidPtr> ACPIFactoryInterface::Find(const Char* signature) { (Void)(kout << "ACPI: Signature: " << xsdt->Signature << kendl); (Void)(kout << "ACPI: Address of XSDT: " << hex_number((UIntPtr) xsdt) << kendl); - const short cAcpiSignatureLength = 4; + static constexpr const UInt16 cAcpiSignatureLength = 4U; for (Size index = 0; index < this->fEntries; ++index) { SDT* sdt = reinterpret_cast<SDT*>(xsdt->AddressArr[index]); @@ -50,7 +50,7 @@ ErrorOr<voidPtr> ACPIFactoryInterface::Find(const Char* signature) { (Void)(kout << "ACPI: Checksum: " << number(sdt->Checksum) << kendl); (Void)(kout << "ACPI: Revision: " << number(sdt->Revision) << kendl); - for (short signature_index = 0; signature_index < cAcpiSignatureLength; ++signature_index) { + for (UInt16 signature_index = 0; signature_index < cAcpiSignatureLength; ++signature_index) { if (sdt->Signature[signature_index] != signature[signature_index]) break; if (signature_index == (cAcpiSignatureLength - 1)) { diff --git a/dev/kernel/src/BitMapMgr.cc b/dev/kernel/src/BitMapMgr.cc index 22737dbe..a7ca12ce 100644 --- a/dev/kernel/src/BitMapMgr.cc +++ b/dev/kernel/src/BitMapMgr.cc @@ -24,8 +24,6 @@ namespace Kernel { namespace HAL { namespace Detail { - STATIC SizeT kBitMapCursor = 0UL; - /***********************************************************************************/ /// \brief Proxy Interface to manage a bitmap allocator. /***********************************************************************************/ diff --git a/dev/kernel/src/UserProcessScheduler.cc b/dev/kernel/src/UserProcessScheduler.cc index 8a3152f0..15da4431 100644 --- a/dev/kernel/src/UserProcessScheduler.cc +++ b/dev/kernel/src/UserProcessScheduler.cc @@ -21,7 +21,7 @@ #include <KernelKit/ProcessScheduler.h> #include <NeKit/KString.h> #include <NeKit/Utils.h> -#include <SignalKit/Signals.h> +#include <SignalKit/SignalGen.h> ///! BUGS: 0 @@ -593,7 +593,7 @@ Bool UserProcessHelper::CanBeScheduled(const USER_PROCESS& process) { // real time processes shouldn't wait that much. if (process.Affinity == AffinityKind::kRealTime) return Yes; - if (process.Signal.SignalID == SIGTRAP) { + if (process.Signal.SignalID == sig_generate_unique<SIGTRAP>()) { return No; } |
