summaryrefslogtreecommitdiffhomepage
path: root/dev
diff options
context:
space:
mode:
Diffstat (limited to 'dev')
-rw-r--r--dev/boot/BootKit/BitManip.h2
-rw-r--r--dev/kernel/ArchKit/ArchKit.h6
-rw-r--r--dev/kernel/FirmwareKit/NeBoot/BootNet.h22
-rw-r--r--dev/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc16
-rw-r--r--dev/kernel/HALKit/AMD64/HalKernelMain.cc5
-rw-r--r--dev/kernel/HALKit/ARM64/HalCoreInterruptHandler.cc2
-rw-r--r--dev/kernel/HALKit/ARM64/HalKernelMain.cc4
-rw-r--r--dev/kernel/KernelKit/DebugOutput.h16
-rw-r--r--dev/kernel/SignalKit/SignalGen.h51
-rw-r--r--dev/kernel/SignalKit/Signals.h24
-rw-r--r--dev/kernel/src/ACPIFactoryInterface.cc6
-rw-r--r--dev/kernel/src/BitMapMgr.cc2
-rw-r--r--dev/kernel/src/UserProcessScheduler.cc4
-rw-r--r--dev/libDDK/libDDK.json (renamed from dev/libDDK/ddk.json)2
-rw-r--r--dev/misc/BenchKit/Chronometer.h (renamed from dev/misc/BenchKit/Chrono.h)0
-rw-r--r--dev/misc/BenchKit/HWChronometer.h66
-rw-r--r--dev/misc/BenchKit/X64Chrono.h56
17 files changed, 160 insertions, 124 deletions
diff --git a/dev/boot/BootKit/BitManip.h b/dev/boot/BootKit/BitManip.h
index b1c72bfb..196953b3 100644
--- a/dev/boot/BootKit/BitManip.h
+++ b/dev/boot/BootKit/BitManip.h
@@ -8,7 +8,7 @@
#define __BITMANIP_H__
/// File: BitManip.h
-/// Purpose: Bit manipulation helpers, based on coreboot-dev.
+/// Purpose: Bit manipulation helpers, based on neboot-dev.
#define bk_set_bit(X, O) X = (1 << O) | X
#define bk_clear_bit(X, O) X = ~(1 << O) & X
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;
}
diff --git a/dev/libDDK/ddk.json b/dev/libDDK/libDDK.json
index ffc05f5f..113dd585 100644
--- a/dev/libDDK/ddk.json
+++ b/dev/libDDK/libDDK.json
@@ -3,7 +3,7 @@
"compiler_std": "c++20",
"headers_path": ["../", "./"],
"sources_path": ["src/*.c", "src/*.cc", "src/*.S"],
- "output_name": "ddk.sys",
+ "output_name": "libDDK.dll",
"compiler_flags": [
"-ffreestanding",
"-shared",
diff --git a/dev/misc/BenchKit/Chrono.h b/dev/misc/BenchKit/Chronometer.h
index 3a82a94e..3a82a94e 100644
--- a/dev/misc/BenchKit/Chrono.h
+++ b/dev/misc/BenchKit/Chronometer.h
diff --git a/dev/misc/BenchKit/HWChronometer.h b/dev/misc/BenchKit/HWChronometer.h
new file mode 100644
index 00000000..e232db7e
--- /dev/null
+++ b/dev/misc/BenchKit/HWChronometer.h
@@ -0,0 +1,66 @@
+/* -------------------------------------------
+
+Copyright (C) 2025, Amlal El Mahrouss, all rights reserved.
+
+------------------------------------------- */
+
+#pragma once
+
+#include <misc/BenchKit/Chronometer.h>
+
+namespace Kernel {
+struct HWChronoTraits;
+
+template <typename ChronoTraits = HWChronoTraits>
+class HWChrono;
+
+/// @brief BenchKit chrono logic for x64.
+struct HWChronoTraits final {
+ private:
+ STATIC UInt64 TickImpl_(void) {
+#ifdef __NE_AMD64__
+ UInt64 a = 0, d = 0;
+
+ asm volatile("rdtsc" : "=a"(a), "=d"(d));
+
+ return (d << 32) | a;
+#elif defined(__NE_ARM64__)
+ UInt64 result;
+
+ asm volatile("mrs %0, cntvct_el1" : "=r"(result));
+
+ return result;
+#else
+#error !!! no backend defined !!!
+#endif
+ }
+
+ friend HWChrono<HWChronoTraits>;
+};
+
+/// @brief hardware chronometer implementation using a trait to extract the data.
+template <typename ChronoTraits>
+class HWChrono BENCHKIT_INTERFACE {
+ public:
+ HWChrono() = default;
+ virtual ~HWChrono() override = default;
+
+ NE_COPY_DEFAULT(HWChrono)
+
+ public:
+ Void Start() override { fStart = ChronoTraits::TickImpl_(); }
+
+ Void Stop() override { fStop = ChronoTraits::TickImpl_(); }
+
+ Void Reset() override {
+ fStart = 0;
+ fStop = 0;
+ }
+
+ UInt64 GetElapsedTime() const override { return fStop - fStart; }
+
+ private:
+ UInt64 fStart{};
+ UInt64 fStop{};
+};
+} // namespace Kernel
diff --git a/dev/misc/BenchKit/X64Chrono.h b/dev/misc/BenchKit/X64Chrono.h
deleted file mode 100644
index 728e7d60..00000000
--- a/dev/misc/BenchKit/X64Chrono.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/* -------------------------------------------
-
-Copyright (C) 2025, Amlal El Mahrouss, all rights reserved.
-
-------------------------------------------- */
-
-#pragma once
-
-#include <misc/BenchKit/Chrono.h>
-
-#if defined(__NE_AMD64__)
-
-namespace Kernel {
-class X64Chrono;
-struct X64ChronoTraits;
-
-/// @brief BenchKit chrono logic for x64.
-struct X64ChronoTraits {
- private:
- STATIC UInt64 TickImpl_(void) {
- UInt64 a = 0, d = 0;
-
- asm volatile("rdtsc" : "=a"(a), "=d"(d));
- return (d << 32) | a;
- }
-
- friend X64Chrono;
-};
-
-/// @brief X86_64 hardware chrono implementation using the `rdtsc` instruction.
-class X64Chrono BENCHKIT_INTERFACE {
- public:
- X64Chrono() = default;
- ~X64Chrono() override = default;
-
- NE_COPY_DEFAULT(X64Chrono)
-
- public:
- Void Start() override { fStart = X64ChronoTraits::TickImpl_(); }
-
- Void Stop() override { fStop = X64ChronoTraits::TickImpl_(); }
-
- Void Reset() override {
- fStart = 0;
- fStop = 0;
- }
-
- UInt64 GetElapsedTime() const override { return fStop - fStart; }
-
- private:
- UInt64 fStart{};
- UInt64 fStop{};
-};
-} // namespace Kernel
-
-#endif // defined(__NE_AMD64__) \ No newline at end of file