From 17bd847ebc85f4f9e62f510563482939a98f0c8e Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Fri, 6 Jun 2025 05:44:34 +0200 Subject: feat: kernel: Start enforcing `User`s validation when issuing OS calls. refactor: PE: remove BaseOfData, as we are only relying on PE32+ now. Signed-off-by: Amlal El Mahrouss --- dev/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'dev/kernel/HALKit') diff --git a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc index 01456ae5..98e1ed61 100644 --- a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc +++ b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc @@ -6,6 +6,7 @@ #include #include +#include #include #include @@ -133,6 +134,8 @@ EXTERN_C Kernel::Void hal_system_call_enter(Kernel::UIntPtr rcx_syscall_index, Kernel::UIntPtr rdx_syscall_struct) { hal_idt_send_eoi(50); + if (!Kernel::kCurrentUser) return; + if (rcx_syscall_index < kSysCalls.Count()) { if (kSysCalls[rcx_syscall_index].fHooked) { if (kSysCalls[rcx_syscall_index].fProc) { @@ -149,6 +152,10 @@ EXTERN_C Kernel::Void hal_kernel_call_enter(Kernel::UIntPtr rcx_kerncall_index, Kernel::UIntPtr rdx_kerncall_struct) { hal_idt_send_eoi(51); + if (!Kernel::kRootUser) return; + if (Kernel::kCurrentUser != Kernel::kRootUser) return; + if (!Kernel::kCurrentUser->IsSuperUser()) return; + if (rcx_kerncall_index < kKernCalls.Count()) { if (kKernCalls[rcx_kerncall_index].fHooked) { if (kKernCalls[rcx_kerncall_index].fProc) { -- cgit v1.2.3 From dbf1190718c1a5adb4b2dc56e4d6da45429bb65e Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Fri, 6 Jun 2025 21:05:55 +0200 Subject: feat: The `APM` HW protocol implementation got improvements (ARM64) fix: BootNet: be more descriptive when trying to flash from network, and it fails. Signed-off-by: Amlal El Mahrouss --- dev/boot/amd64-ci.make | 2 +- dev/boot/amd64-desktop.make | 2 +- dev/boot/modules/BootNet/BootNet.cc | 4 ++-- dev/boot/src/BootloaderRsrc.rsrc | 25 ---------------------- dev/boot/src/boot_rsrc.rsrc | 25 ++++++++++++++++++++++ dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc | 2 +- dev/kernel/HALKit/ARM64/APM/APM+IO.cc | 4 ++-- dev/kernel/HALKit/ARM64/HalACPIFactoryInterface.cc | 4 ++-- dev/kernel/SwapKit/DiskSwap.h | 12 +++++------ dev/kernel/kernel_rsrc.rsrc | 4 ++-- dev/kernel/src/FS/HeFS+FileSystemParser.cc | 8 +++---- dev/modules/APM/APM.h | 8 +------ 12 files changed, 47 insertions(+), 53 deletions(-) delete mode 100644 dev/boot/src/BootloaderRsrc.rsrc create mode 100644 dev/boot/src/boot_rsrc.rsrc (limited to 'dev/kernel/HALKit') diff --git a/dev/boot/amd64-ci.make b/dev/boot/amd64-ci.make index 0715151c..f4f76a59 100644 --- a/dev/boot/amd64-ci.make +++ b/dev/boot/amd64-ci.make @@ -98,7 +98,7 @@ endif .PHONY: compile-amd64 compile-amd64: - $(WINDRES) src/BootloaderRsrc.rsrc -O coff -o BootloaderRsrc.o + $(WINDRES) src/boot_rsrc.rsrc -O coff -o boot_rsrc.o $(CC_GNU) $(NE_MODEL) $(STANDALONE_MACRO) $(FLAG_GNU) $(DEBUG) \ $(wildcard src/HEL/AMD64/*.cc) \ $(wildcard src/HEL/AMD64/*.S) \ diff --git a/dev/boot/amd64-desktop.make b/dev/boot/amd64-desktop.make index d7515367..2e487f94 100644 --- a/dev/boot/amd64-desktop.make +++ b/dev/boot/amd64-desktop.make @@ -108,7 +108,7 @@ endif .PHONY: compile-amd64 compile-amd64: - $(WINDRES) src/BootloaderRsrc.rsrc -O coff -o BootloaderRsrc.o + $(WINDRES) src/boot_rsrc.rsrc -O coff -o boot_rsrc.o $(CC_GNU) $(NE_MODEL) $(STANDALONE_MACRO) $(FLAG_GNU) $(DEBUG) \ $(wildcard src/HEL/AMD64/*.cc) \ $(wildcard src/HEL/AMD64/*.S) \ diff --git a/dev/boot/modules/BootNet/BootNet.cc b/dev/boot/modules/BootNet/BootNet.cc index ba9beef4..c91460cb 100644 --- a/dev/boot/modules/BootNet/BootNet.cc +++ b/dev/boot/modules/BootNet/BootNet.cc @@ -48,7 +48,7 @@ EXTERN_C Int32 BootNetModuleMain(Kernel::HEL::BootInfoHeader* handover) { Boot::BootThread thread(inet_out->Data); if (thread.IsValid()) { - writer.Write("BootNet: Running kernel...\r"); + writer.Write("BootNet: Running NeKernel...\r"); return thread.Start(handover, YES); } @@ -57,7 +57,7 @@ EXTERN_C Int32 BootNetModuleMain(Kernel::HEL::BootInfoHeader* handover) { constexpr auto kROMSize = 0x200; if (inet_out->Length > kROMSize) { - writer.Write("BootNet: Not within 512K.\r"); + writer.Write("BootNet: Not within 512K, won't flash EEPROM.\r"); return kEfiFail; } diff --git a/dev/boot/src/BootloaderRsrc.rsrc b/dev/boot/src/BootloaderRsrc.rsrc deleted file mode 100644 index 33bce7f7..00000000 --- a/dev/boot/src/BootloaderRsrc.rsrc +++ /dev/null @@ -1,25 +0,0 @@ -#include "../../kernel/CompilerKit/Version.h" - -1 VERSIONINFO -FILEVERSION 1,0,0,0 -PRODUCTVERSION 1,0,0,0 -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "080904E4" - BEGIN - VALUE "CompanyName", "Amlal El Mahrouss" - VALUE "FileDescription", "NeKernel OS Loader." - VALUE "FileVersion", BOOTLOADER_VERSION - VALUE "InternalName", "bootz" - VALUE "LegalCopyright", "Copyright (C) 2024, Amlal El Mahrouss all rights reserved." - VALUE "OriginalFilename", "ne_bootz" - VALUE "ProductName", "bootz" - VALUE "ProductVersion", BOOTLOADER_VERSION - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x809, 1252 - END -END diff --git a/dev/boot/src/boot_rsrc.rsrc b/dev/boot/src/boot_rsrc.rsrc new file mode 100644 index 00000000..fedbdee0 --- /dev/null +++ b/dev/boot/src/boot_rsrc.rsrc @@ -0,0 +1,25 @@ +#include "../../kernel/CompilerKit/Version.h" + +1 VERSIONINFO +FILEVERSION 1,0,0,0 +PRODUCTVERSION 1,0,0,0 +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "080904E4" + BEGIN + VALUE "CompanyName", "Amlal El Mahrouss" + VALUE "FileDescription", "NeKernel OS Loader." + VALUE "FileVersion", BOOTLOADER_VERSION + VALUE "InternalName", "bootz" + VALUE "LegalCopyright", "Copyright (C) 2024-2025, Amlal El Mahrouss all rights reserved." + VALUE "OriginalFilename", "ne_bootz" + VALUE "ProductName", "bootz" + VALUE "ProductVersion", BOOTLOADER_VERSION + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x809, 1252 + END +END diff --git a/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc b/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc index 24a81af9..aeaeff52 100644 --- a/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc +++ b/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc @@ -216,7 +216,7 @@ Void mp_init_cores(VoidPtr vendor_ptr) noexcept { kout << "Kind: LAPIC: OFF\r"; } } else { - kout << "Kind: UNKNOWN\r"; + kout << "Kind: UNKNOWN: OFF\r"; } entry_ptr += length; diff --git a/dev/kernel/HALKit/ARM64/APM/APM+IO.cc b/dev/kernel/HALKit/ARM64/APM/APM+IO.cc index 3df8a407..e58fb782 100644 --- a/dev/kernel/HALKit/ARM64/APM/APM+IO.cc +++ b/dev/kernel/HALKit/ARM64/APM/APM+IO.cc @@ -9,11 +9,11 @@ using namespace Kernel; -/// @brief Send APM command to it's space. +/// @brief Send APM command to it's IO space. /// @param base_dma the IO base port. /// @param cmd the command. /// @return status code. -EXTERN_C Int32 apm_send_io_command(UInt16 cmd, APMPowerCmd value) { +EXTERN_C Int32 apm_send_io_command(UInt16 cmd) { switch (cmd) { case kAPMPowerCommandReboot: { asm volatile( diff --git a/dev/kernel/HALKit/ARM64/HalACPIFactoryInterface.cc b/dev/kernel/HALKit/ARM64/HalACPIFactoryInterface.cc index dc883239..fa678494 100644 --- a/dev/kernel/HALKit/ARM64/HalACPIFactoryInterface.cc +++ b/dev/kernel/HALKit/ARM64/HalACPIFactoryInterface.cc @@ -14,13 +14,13 @@ namespace Kernel { ACPIFactoryInterface::ACPIFactoryInterface(VoidPtr rsp_ptr) : fRsdp(rsp_ptr), fEntries(0) {} BOOL ACPIFactoryInterface::Shutdown() { - apm_send_io_command(kAPMPowerCommandShutdown, 0); + apm_send_io_command(kAPMPowerCommandShutdown); return NO; } /// @brief Reboot machine in either ACPI or by triple faulting. /// @return nothing it's a reboot. Void ACPIFactoryInterface::Reboot() { - apm_send_io_command(kAPMPowerCommandReboot, 0); + apm_send_io_command(kAPMPowerCommandReboot); } } // namespace Kernel diff --git a/dev/kernel/SwapKit/DiskSwap.h b/dev/kernel/SwapKit/DiskSwap.h index 1a0536c9..674524c8 100644 --- a/dev/kernel/SwapKit/DiskSwap.h +++ b/dev/kernel/SwapKit/DiskSwap.h @@ -35,21 +35,21 @@ class DiskSwapInterface final { public: /***********************************************************************************/ /// @brief Write memory chunk onto disk. - /// @param fork_name The swap name to recognize this memory region. - /// @param fork_name_len length of fork name. + /// @param name The swap name to recognize this memory region. + /// @param name_len length of fork name. /// @param data the data packet. /// @return Whether the swap was written to disk, or not. /***********************************************************************************/ - BOOL Write(const Char* fork_name, SizeT fork_name_len, SWAP_DISK_HEADER* data); + BOOL Write(const Char* name, SizeT name_len, SWAP_DISK_HEADER* data); /***********************************************************************************/ /// @brief Read memory chunk from disk. - /// @param fork_name The swap name to recognize this memory region. - /// @param fork_name_len length of fork name. + /// @param name The swap name to recognize this memory region. + /// @param name_len length of fork name. /// @param data the data packet length. /// @return Whether the swap was fetched to disk, or not. /***********************************************************************************/ - _Output SWAP_DISK_HEADER* Read(const Char* fork_name, SizeT fork_name_len, SizeT data_len); + _Output SWAP_DISK_HEADER* Read(const Char* name, SizeT name_len, SizeT data_len); }; /// @brief Swap disk header, containing information about the held virtual memory. diff --git a/dev/kernel/kernel_rsrc.rsrc b/dev/kernel/kernel_rsrc.rsrc index 5b1cb14f..a785a311 100644 --- a/dev/kernel/kernel_rsrc.rsrc +++ b/dev/kernel/kernel_rsrc.rsrc @@ -9,9 +9,9 @@ BEGIN BLOCK "080904E4" BEGIN VALUE "CompanyName", "Amlal El Mahrouss" - VALUE "FileDescription", "NeKernel" + VALUE "FileDescription", "NeKernel" VALUE "FileVersion", KERNEL_VERSION - VALUE "InternalName", "krnl" + VALUE "InternalName", "ne_kernel" VALUE "LegalCopyright", "(c) 2024-2025 Amlal El Mahrouss, all rights reserved." VALUE "OriginalFilename", "ne_kernel" VALUE "ProductName", "NeKernel" diff --git a/dev/kernel/src/FS/HeFS+FileSystemParser.cc b/dev/kernel/src/FS/HeFS+FileSystemParser.cc index 893f43ef..bfd38f69 100644 --- a/dev/kernel/src/FS/HeFS+FileSystemParser.cc +++ b/dev/kernel/src/FS/HeFS+FileSystemParser.cc @@ -1,6 +1,6 @@ /* ------------------------------------------- - Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. + Copyright (C) 2024-2025 Amlal El Mahrouss, all rights reserved. ------------------------------------------- */ @@ -758,8 +758,8 @@ _Output Bool HeFileSystemParser::Format(_Input _Output DriveTrait* mnt, _Input c } if (drv_std_get_size() < kHeFSMinimumDiskSize) { - (Void)(kout << "HeFS recommends at least 128 GiB of free space." << kendl); - (Void)(kout << "The OS will still try to format a HeFS disk here." << kendl); + (Void)(kout << "OpenHeFS recommends at least 128 GiB of free space." << kendl); + (Void)(kout << "The OS will still try to format a HeFS disk here anyway, don't expect perfect geometry." << kendl); } HEFS_BOOT_NODE* boot = (HEFS_BOOT_NODE*) RTL_ALLOCA(sizeof(HEFS_BOOT_NODE)); @@ -1142,7 +1142,7 @@ STATIC DriveTrait kMountPoint; /// @brief Initialize the HeFS filesystem. /// @return To check its status, see err_local_get(). Boolean HeFS::fs_init_hefs(Void) noexcept { - kout << "Creating HeFS disk...\r"; + kout << "Verifying disk...\r"; kMountPoint = io_construct_main_drive(); diff --git a/dev/modules/APM/APM.h b/dev/modules/APM/APM.h index b071a770..29de5114 100644 --- a/dev/modules/APM/APM.h +++ b/dev/modules/APM/APM.h @@ -21,15 +21,9 @@ enum { kAPMPowerCommandReboot = 0x08, }; -/// @brief Send a APM command into it's own DMA space. -/// @param base_dma the DMA base address. -/// @param cmd the command. -/// @return status code. -EXTERN_C Int32 apm_send_dma_command(Ptr64 register_addr, APMPowerCmd value); - /// @brief Send a APM command into it's own IO space. /// @param base_dma the IO base port. /// @param cmd the command. /// @return status code. -EXTERN_C Int32 apm_send_io_command(UInt16 cmd, APMPowerCmd value); +EXTERN_C Int32 apm_send_io_command(UInt16 cmd); } // namespace Kernel -- cgit v1.2.3 From bac8a3de6477a080360ab460b97f6a79d847235e Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Sun, 8 Jun 2025 09:44:30 +0200 Subject: feat: arm64: add .ldr stub for ARM64 VMKernel. Signed-off-by: Amlal El Mahrouss --- dev/kernel/HALKit/ARM64/HalHandoverStub.s | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 dev/kernel/HALKit/ARM64/HalHandoverStub.s (limited to 'dev/kernel/HALKit') diff --git a/dev/kernel/HALKit/ARM64/HalHandoverStub.s b/dev/kernel/HALKit/ARM64/HalHandoverStub.s new file mode 100644 index 00000000..0f73cf7b --- /dev/null +++ b/dev/kernel/HALKit/ARM64/HalHandoverStub.s @@ -0,0 +1,15 @@ +;; /* +;; * ======================================================== +;; * +;; * NeKernel +;; * Copyright (C) 2025, Amlal El Mahrouss, all rights reserved. +;; * +;; * ======================================================== +;; */ + +.section .ldr + +.quad 0xDAB4 +.word 100 +.word 0 +.word 122 \ No newline at end of file -- cgit v1.2.3 From a5851dfaa65d15f44f52b2aed1aa0179291b46fc Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Thu, 12 Jun 2025 02:54:29 +0200 Subject: feat: libSystem, kernel: finalizing the hash and routing system of libSystem's handlers. feat: Rework TTY, and CD-ROM API too. Signed-off-by: Amlal El Mahrouss --- dev/boot/modules/BootNet/BootNet.cc | 2 +- dev/boot/src/HEL/ARM64/BootEFI.cc | 4 ++-- dev/kernel/ArchKit/ArchKit.h | 2 +- dev/kernel/FirmwareKit/CoreBoot/BootNet.h | 10 ++++---- dev/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc | 28 +++++++++++----------- dev/kernel/src/FS/HeFS+FileSystemParser.cc | 5 +++- dev/libSystem/SystemKit/System.h | 10 +++++--- 7 files changed, 34 insertions(+), 27 deletions(-) (limited to 'dev/kernel/HALKit') diff --git a/dev/boot/modules/BootNet/BootNet.cc b/dev/boot/modules/BootNet/BootNet.cc index d4f8c1fc..8236dd0d 100644 --- a/dev/boot/modules/BootNet/BootNet.cc +++ b/dev/boot/modules/BootNet/BootNet.cc @@ -48,7 +48,7 @@ EXTERN_C Int32 BootNetModuleMain(Kernel::HEL::BootInfoHeader* handover) { writer.Write("BootNet: The version clashes, not good.\r"); return kEfiFail; } - + if (!inet_out->ImpliesProgram) { Boot::BootThread thread(inet_out->Data); diff --git a/dev/boot/src/HEL/ARM64/BootEFI.cc b/dev/boot/src/HEL/ARM64/BootEFI.cc index 12ace024..467cae23 100644 --- a/dev/boot/src/HEL/ARM64/BootEFI.cc +++ b/dev/boot/src/HEL/ARM64/BootEFI.cc @@ -129,8 +129,8 @@ EFI_EXTERN_C EFI_API Int32 BootloaderMain(EfiHandlePtr image_handle, EfiSystemTa kHandoverHeader->f_BitMapStart = nullptr; /* Start of bitmap. */ kHandoverHeader->f_BitMapSize = kHandoverBitMapSz; /* Size of bitmap in bytes. */ - - UInt16 trials = 5; + + UInt16 trials = 5; while (BS->AllocatePool(EfiLoaderData, kHandoverHeader->f_BitMapSize, &kHandoverHeader->f_BitMapStart) != kEfiOk) { diff --git a/dev/kernel/ArchKit/ArchKit.h b/dev/kernel/ArchKit/ArchKit.h index 09839d98..a9dca240 100644 --- a/dev/kernel/ArchKit/ArchKit.h +++ b/dev/kernel/ArchKit/ArchKit.h @@ -70,7 +70,7 @@ namespace HAL { typedef Kernel::Void (*rt_syscall_proc)(Kernel::VoidPtr); struct HAL_DISPATCH_ENTRY final { - Kernel::Int64 fHash; + Kernel::UInt64 fHash; Kernel::Bool fHooked; rt_syscall_proc fProc; diff --git a/dev/kernel/FirmwareKit/CoreBoot/BootNet.h b/dev/kernel/FirmwareKit/CoreBoot/BootNet.h index c42c98db..3ed11363 100644 --- a/dev/kernel/FirmwareKit/CoreBoot/BootNet.h +++ b/dev/kernel/FirmwareKit/CoreBoot/BootNet.h @@ -18,11 +18,11 @@ /// 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::UInt16 Version; + 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::Char Name[kBootNetNameLen]; /// example: Modjo Kernel::Int32 Length; /// the patch length. Kernel::Char Target[kBootNetNameLen]; /// the target file. diff --git a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc index 98e1ed61..be6d0af5 100644 --- a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc +++ b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc @@ -127,39 +127,39 @@ EXTERN_C void idt_handle_ud(Kernel::UIntPtr rsp) { process.Leak().Signal.Status = process.Leak().Status; } -/// @brief Enter syscall from assembly. +/// @brief Enter syscall from assembly (libSystem only) /// @param stack the stack pushed from assembly routine. /// @return nothing. -EXTERN_C Kernel::Void hal_system_call_enter(Kernel::UIntPtr rcx_syscall_index, - Kernel::UIntPtr rdx_syscall_struct) { +EXTERN_C Kernel::Void hal_system_call_enter(Kernel::UIntPtr rcx_hash, + Kernel::UIntPtr rdx_syscall_arg) { hal_idt_send_eoi(50); if (!Kernel::kCurrentUser) return; - if (rcx_syscall_index < kSysCalls.Count()) { - if (kSysCalls[rcx_syscall_index].fHooked) { - if (kSysCalls[rcx_syscall_index].fProc) { - (kSysCalls[rcx_syscall_index].fProc)((Kernel::VoidPtr) rdx_syscall_struct); + for (SizeT i = 0UL; i < kMaxDispatchCallCount; ++i) { + if (kSysCalls[i].fHooked && rcx_hash == kSysCalls[i].fHash) { + if (kSysCalls[i].fProc) { + (kSysCalls[i].fProc)((Kernel::VoidPtr) rdx_syscall_arg); } } } } -/// @brief Enter Kernel call from assembly (DDK only). +/// @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_kerncall_index, - Kernel::UIntPtr rdx_kerncall_struct) { +EXTERN_C Kernel::Void hal_kernel_call_enter(Kernel::UIntPtr rcx_hash, + Kernel::UIntPtr rdx_kerncall_arg) { hal_idt_send_eoi(51); if (!Kernel::kRootUser) return; if (Kernel::kCurrentUser != Kernel::kRootUser) return; if (!Kernel::kCurrentUser->IsSuperUser()) return; - if (rcx_kerncall_index < kKernCalls.Count()) { - if (kKernCalls[rcx_kerncall_index].fHooked) { - if (kKernCalls[rcx_kerncall_index].fProc) { - (kKernCalls[rcx_kerncall_index].fProc)((Kernel::VoidPtr) rdx_kerncall_struct); + 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); } } } diff --git a/dev/kernel/src/FS/HeFS+FileSystemParser.cc b/dev/kernel/src/FS/HeFS+FileSystemParser.cc index bfd38f69..39f8c0a1 100644 --- a/dev/kernel/src/FS/HeFS+FileSystemParser.cc +++ b/dev/kernel/src/FS/HeFS+FileSystemParser.cc @@ -759,7 +759,10 @@ _Output Bool HeFileSystemParser::Format(_Input _Output DriveTrait* mnt, _Input c if (drv_std_get_size() < kHeFSMinimumDiskSize) { (Void)(kout << "OpenHeFS recommends at least 128 GiB of free space." << kendl); - (Void)(kout << "The OS will still try to format a HeFS disk here anyway, don't expect perfect geometry." << kendl); + (Void)( + kout + << "The OS will still try to format a HeFS disk here anyway, don't expect perfect geometry." + << kendl); } HEFS_BOOT_NODE* boot = (HEFS_BOOT_NODE*) RTL_ALLOCA(sizeof(HEFS_BOOT_NODE)); diff --git a/dev/libSystem/SystemKit/System.h b/dev/libSystem/SystemKit/System.h index 91899efe..421868ae 100644 --- a/dev/libSystem/SystemKit/System.h +++ b/dev/libSystem/SystemKit/System.h @@ -309,16 +309,20 @@ IMPORT_C SInt32 PwrSendCode(_Output SInt32& code); // CD-ROM API. // ------------------------------------------------------------------------------------------ // -IMPORT_C SInt32 CdEjectDrive(_Input Char drv_letter); +#define kCDDevicePath "/devices/dvd{}" -IMPORT_C SInt32 CdOpenTray(Void); +IMPORT_C IORef CdOpenTray(Void); + +IMPORT_C SInt32 CdEjectDrive(_Input IORef cdrom); IMPORT_C SInt32 CdCloseTray(Void); // ------------------------------------------------------------------------------------------ // -// Printer API. +// TTY API. // ------------------------------------------------------------------------------------------ // +#define kPrintDevicePath "/devices/tty{}" + IMPORT_C SInt32 PrintOut(IORef file /* nullptr to direct to stdout */, const Char* fmt, ...); IMPORT_C SInt32 PrintIn(IORef file /* nullptr to direct to stdout */, const Char* fmt, ...); -- cgit v1.2.3 From b30ebc63242e02a8eb2d2c49bf7c046dc892ff8e Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Sun, 15 Jun 2025 15:36:36 +0200 Subject: feat: DmaPool, and Scheduler Interrupts for ARM. I extended DmaKit to support `ARM` fully, taking ISA internals, such as alignment into play. Also implemented the scheduler's interrupts for `ARM` too. Signed-off-by: Amlal El Mahrouss --- dev/kernel/DmaKit/DmaPool.h | 19 ++- dev/kernel/HALKit/ARM64/HalCoreInterruptHandler.cc | 161 +++++++++++++++++++++ dev/kernel/HALKit/ARM64/HalKernelPanic.cc | 4 +- 3 files changed, 178 insertions(+), 6 deletions(-) create mode 100644 dev/kernel/HALKit/ARM64/HalCoreInterruptHandler.cc (limited to 'dev/kernel/HALKit') diff --git a/dev/kernel/DmaKit/DmaPool.h b/dev/kernel/DmaKit/DmaPool.h index 9decb3f1..d4bec398 100644 --- a/dev/kernel/DmaKit/DmaPool.h +++ b/dev/kernel/DmaKit/DmaPool.h @@ -2,8 +2,8 @@ Copyright (C) 2025, Amlal El Mahrouss , all rights reserved. - File: FileMgr.h - Purpose: Kernel file manager. + File: DmaPool.h + Purpose: Dma Pool Manager. ------------------------------------------- */ @@ -15,6 +15,13 @@ #ifdef __NE_AMD64__ #define kNeDMAPoolStart (0x1000000) #define kNeDMAPoolSize (0x1000000) +#elif defined(__NE_ARM64__) +/// @todo what reference offset shall we use? +#define kNeDMAPoolStart (0x1000000) +#define kNeDMAPoolSize (0x1000000) +#endif + +#define kNeDMABestAlign __BIGGEST_ALIGNMENT__ namespace Kernel { /// @brief DMA pool base pointer, here we're sure that AHCI or whatever tricky standard sees it. @@ -31,6 +38,11 @@ inline VoidPtr rtl_dma_alloc(SizeT size, SizeT align) { return nullptr; } + /// Check alignement according to architecture. + if ((align % kNeDMABestAlign) != 0) { + return nullptr; + } + UIntPtr addr = (UIntPtr) kDmaPoolPtr; /// here we just align the address according to a `align` variable, i'd rather be a power of two @@ -84,5 +96,4 @@ inline Void rtl_dma_flush(VoidPtr ptr, SizeT size_buffer) { HAL::mm_memory_fence((VoidPtr) ((UInt8*) ptr + buf_idx)); } } -} // namespace Kernel -#endif \ No newline at end of file +} // namespace Kernel \ No newline at end of file diff --git a/dev/kernel/HALKit/ARM64/HalCoreInterruptHandler.cc b/dev/kernel/HALKit/ARM64/HalCoreInterruptHandler.cc new file mode 100644 index 00000000..61a82314 --- /dev/null +++ b/dev/kernel/HALKit/ARM64/HalCoreInterruptHandler.cc @@ -0,0 +1,161 @@ +/* ------------------------------------------- + + Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. + +------------------------------------------- */ + +#include +#include +#include +#include +#include + +EXTERN_C Kernel::Void int_handle_breakpoint(Kernel::UIntPtr rip); + EXTERN_C BOOL mp_handle_gic_interrupt_el0(Void); + +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; + kEndOfInterruptVector = vector; +} + +/// @brief Handle GPF fault. +/// @param rsp +EXTERN_C Kernel::Void int_handle_gpf(Kernel::UIntPtr rsp) { + auto& process = Kernel::UserProcessScheduler::The().TheCurrentProcess(); + process.Leak().Crash(); + + hal_int_send_eoi(13); + + process.Leak().Signal.SignalArg = rsp; + process.Leak().Signal.SignalID = SIGKILL; + process.Leak().Signal.Status = process.Leak().Status; +} + +/// @brief Handle page fault. +/// @param rsp +EXTERN_C void int_handle_pf(Kernel::UIntPtr rsp) { + auto& process = Kernel::UserProcessScheduler::The().TheCurrentProcess(); + process.Leak().Crash(); + + hal_int_send_eoi(14); + + process.Leak().Signal.SignalArg = rsp; + process.Leak().Signal.SignalID = SIGKILL; + process.Leak().Signal.Status = process.Leak().Status; +} + +/// @brief Handle scheduler interrupt. +EXTERN_C void int_handle_scheduler(Kernel::UIntPtr rsp) { + NE_UNUSED(rsp); + + hal_int_send_eoi(32); + + while (kIsRunning) + ; + + kIsRunning = YES; + + mp_handle_gic_interrupt_el0(); + + kIsRunning = NO; +} + +/// @brief Handle math fault. +/// @param rsp +EXTERN_C void int_handle_math(Kernel::UIntPtr rsp) { + auto& process = Kernel::UserProcessScheduler::The().TheCurrentProcess(); + process.Leak().Crash(); + + hal_int_send_eoi(8); + + process.Leak().Signal.SignalArg = rsp; + process.Leak().Signal.SignalID = SIGKILL; + process.Leak().Signal.Status = process.Leak().Status; +} + +/// @brief Handle any generic fault. +/// @param rsp +EXTERN_C void int_handle_generic(Kernel::UIntPtr rsp) { + auto& process = Kernel::UserProcessScheduler::The().TheCurrentProcess(); + process.Leak().Crash(); + + hal_int_send_eoi(30); + + Kernel::kout << "Kernel: Generic Process Fault.\r"; + + process.Leak().Signal.SignalArg = rsp; + process.Leak().Signal.SignalID = SIGKILL; + process.Leak().Signal.Status = process.Leak().Status; + + Kernel::kout << "Kernel: SIGKILL status.\r"; +} + +EXTERN_C Kernel::Void int_handle_breakpoint(Kernel::UIntPtr rip) { + auto& process = Kernel::UserProcessScheduler::The().TheCurrentProcess(); + + hal_int_send_eoi(3); + + process.Leak().Signal.SignalArg = rip; + process.Leak().Signal.SignalID = SIGTRAP; + + process.Leak().Signal.Status = process.Leak().Status; + + process.Leak().Status = Kernel::ProcessStatusKind::kFrozen; +} + +/// @brief Handle #UD fault. +/// @param rsp +EXTERN_C void int_handle_ud(Kernel::UIntPtr rsp) { + auto& process = Kernel::UserProcessScheduler::The().TheCurrentProcess(); + process.Leak().Crash(); + + hal_int_send_eoi(6); + + process.Leak().Signal.SignalArg = rsp; + process.Leak().Signal.SignalID = SIGKILL; + process.Leak().Signal.Status = process.Leak().Status; +} + +/// @brief Enter syscall from assembly (libSystem only) +/// @param stack the stack pushed from assembly routine. +/// @return nothing. +EXTERN_C Kernel::Void hal_system_call_enter(Kernel::UIntPtr rcx_hash, + Kernel::UIntPtr rdx_syscall_arg) { + hal_int_send_eoi(50); + + if (!Kernel::kCurrentUser) return; + + for (SizeT i = 0UL; i < kMaxDispatchCallCount; ++i) { + if (kSysCalls[i].fHooked && rcx_hash == kSysCalls[i].fHash) { + if (kSysCalls[i].fProc) { + (kSysCalls[i].fProc)((Kernel::VoidPtr) rdx_syscall_arg); + } + } + } +} + +/// @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); + + if (!Kernel::kRootUser) return; + if (Kernel::kCurrentUser != Kernel::kRootUser) return; + if (!Kernel::kCurrentUser->IsSuperUser()) return; + + 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); + } + } + } +} diff --git a/dev/kernel/HALKit/ARM64/HalKernelPanic.cc b/dev/kernel/HALKit/ARM64/HalKernelPanic.cc index d70fef00..91b2fe8a 100644 --- a/dev/kernel/HALKit/ARM64/HalKernelPanic.cc +++ b/dev/kernel/HALKit/ARM64/HalKernelPanic.cc @@ -45,8 +45,8 @@ Void RecoveryFactory::Recover() noexcept { void ke_runtime_check(bool expr, const Char* file, const Char* line) { if (!expr) { - (Void)(kout << "FAILED: FILE: " << file << kendl); - (Void)(kout << "FAILED: LINE: " << line << kendl); + (Void)(kout << "Kernel_Panic_FILE: " << file << kendl); + (Void)(kout << "Kernel_Panic_LINE: " << line << kendl); ke_panic(RUNTIME_CHECK_FAILED, file); // Runtime Check failed } -- cgit v1.2.3