From 9b7a2a6461a463b08a120c660fcc64b46b65d417 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Sat, 5 Apr 2025 06:27:18 +0200 Subject: kernel: storage, modules, mbci: implement mbci_read_auth_key, mbci_test_mmio, test DMA on AHCI too. - Alongside fixes for BootNet, SysChk, and refactor for KernelScheduler, and MemoryMgr. - IMPORTANT: Add MBCI specs. Signed-off-by: Amlal El Mahrouss --- dev/boot/amd64-desktop.make | 3 +- dev/boot/modules/BootNet/BootNet.cc | 4 +-- dev/boot/modules/BootNet/BootNetStartup.S | 2 ++ dev/boot/modules/BootNet/amd64.json | 2 +- dev/boot/modules/SysChk/SysChk.cc | 2 +- dev/boot/modules/SysChk/SysChkStartup.S | 2 ++ dev/boot/modules/SysChk/amd64.json | 2 +- dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc | 25 ++++++++------ dev/kernel/src/FileMgr.cc | 2 ++ dev/kernel/src/IDylibObject.cc | 4 +-- dev/kernel/src/IPEFDylibObject.cc | 2 +- dev/kernel/src/KernelProcessScheduler.cc | 4 +-- dev/kernel/src/MemoryMgr.cc | 3 +- dev/kernel/src/ThreadLocalStorage.cc | 2 +- dev/modules/CoreGfx/CoreAccess.h | 6 ++-- dev/modules/CoreGfx/CoreGfx.h | 9 ++---- dev/modules/CoreGfx/MathGfx.h | 2 +- dev/modules/MBCI/MBCI.h | 43 +++++++++++++++++++++---- dev/modules/NVME/NVME.h | 4 +-- 19 files changed, 82 insertions(+), 41 deletions(-) (limited to 'dev') diff --git a/dev/boot/amd64-desktop.make b/dev/boot/amd64-desktop.make index 6e796752..9e4e9894 100644 --- a/dev/boot/amd64-desktop.make +++ b/dev/boot/amd64-desktop.make @@ -97,7 +97,7 @@ all: compile-amd64 .PHONY: disk disk: dd if=/dev/zero of=$(BOOT) bs=30M count=100 - mformat -i $(BOOT) -F -v "NeKernel" + mformat -i $(BOOT) -F -v "NEKERNEL-ESP" ifneq ($(DEBUG_SUPPORT), ) @@ -151,6 +151,7 @@ help: @echo "=== HELP ===" @echo "epm-img: Format a disk using the Explicit Partition Map." @echo "gpt-img: Format a disk using the Explicit Partition Map." + @echo "disk: Format a FAT32 ESP disk." @echo "clean: remove bootloader and files." @echo "bootloader-amd64: Build bootloader. (PC AMD64)" @echo "run-efi-amd64-: Run bootloader. (PC AMD64)" diff --git a/dev/boot/modules/BootNet/BootNet.cc b/dev/boot/modules/BootNet/BootNet.cc index a877b9a1..47129d38 100644 --- a/dev/boot/modules/BootNet/BootNet.cc +++ b/dev/boot/modules/BootNet/BootNet.cc @@ -11,11 +11,11 @@ #include #include -EfiGUID kEfiIP4ProtoGUID; +STATIC EfiGUID kEfiIP4ProtoGUID = {}; STATIC Void bootnet_read_udp_packet(BOOTNET_INTERNET_HEADER&); -EXTERN_C Int32 ModuleMain(Kernel::HEL::BootInfoHeader* handover) +EXTERN_C Int32 BootNetModuleMain(Kernel::HEL::BootInfoHeader* handover) { BOOTNET_INTERNET_HEADER inet{}; diff --git a/dev/boot/modules/BootNet/BootNetStartup.S b/dev/boot/modules/BootNet/BootNetStartup.S index 976c5e88..d8113bd7 100644 --- a/dev/boot/modules/BootNet/BootNetStartup.S +++ b/dev/boot/modules/BootNet/BootNetStartup.S @@ -20,3 +20,5 @@ .quad kHandoverMagic .word kTypeDriver +.word 0 +.word kArchAmd64 \ No newline at end of file diff --git a/dev/boot/modules/BootNet/amd64.json b/dev/boot/modules/BootNet/amd64.json index 112cf9f1..86143e6a 100644 --- a/dev/boot/modules/BootNet/amd64.json +++ b/dev/boot/modules/BootNet/amd64.json @@ -10,7 +10,7 @@ "-fPIC", "-fno-rtti", "-fno-exceptions", - "-Wl,--subsystem=17,--image-base,0x1000000,-e,ModuleMain" + "-Wl,--subsystem=17,--image-base,0x1000000,-e,BootNetModuleMain" ], "cpp_macros": [ "__NEOSKRNL__", diff --git a/dev/boot/modules/SysChk/SysChk.cc b/dev/boot/modules/SysChk/SysChk.cc index 51b247a5..f9af8517 100644 --- a/dev/boot/modules/SysChk/SysChk.cc +++ b/dev/boot/modules/SysChk/SysChk.cc @@ -21,7 +21,7 @@ #include #include -EXTERN_C Int32 ModuleMain(Kernel::HEL::BootInfoHeader* handover) +EXTERN_C Int32 SysChkModuleMain(Kernel::HEL::BootInfoHeader* handover) { #ifdef __NE_AMD64__ Boot::BDiskFormatFactory partition_factory; diff --git a/dev/boot/modules/SysChk/SysChkStartup.S b/dev/boot/modules/SysChk/SysChkStartup.S index 976c5e88..d8113bd7 100644 --- a/dev/boot/modules/SysChk/SysChkStartup.S +++ b/dev/boot/modules/SysChk/SysChkStartup.S @@ -20,3 +20,5 @@ .quad kHandoverMagic .word kTypeDriver +.word 0 +.word kArchAmd64 \ No newline at end of file diff --git a/dev/boot/modules/SysChk/amd64.json b/dev/boot/modules/SysChk/amd64.json index d995bde2..3b5bab6f 100644 --- a/dev/boot/modules/SysChk/amd64.json +++ b/dev/boot/modules/SysChk/amd64.json @@ -10,7 +10,7 @@ "-fPIC", "-fno-rtti", "-fno-exceptions", - "-Wl,--subsystem=17,--image-base,0x1000000,-e,ModuleMain" + "-Wl,--subsystem=17,--image-base,0x1000000,-e,SysChkModuleMain" ], "cpp_macros": [ "__NEOSKRNL__", diff --git a/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc b/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc index f74db6c0..8d053d8b 100644 --- a/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc +++ b/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc @@ -252,8 +252,11 @@ SizeT drv_get_size_ahci() } /// @brief Enable Host and probe using the IDENTIFY command. -STATIC Void ahci_enable_and_probe() +STATIC BOOL ahci_enable_and_probe() { + if (kSATAHba->Cap == 0x0) + return NO; + kSATAHba->Ports[kSATAIndex].Cmd &= ~kHBAPxCmdFre; kSATAHba->Ports[kSATAIndex].Cmd &= ~kHBAPxCmdST; @@ -324,6 +327,8 @@ STATIC Void ahci_enable_and_probe() } drv_compute_disk_ahci(); + + return YES; } /// @brief Initializes an AHCI disk. @@ -372,22 +377,24 @@ STATIC Bool drv_std_init_ahci(UInt16& pi, BOOL& atapi) kSATAIndex = ahci_index; kSATAHba = mem_ahci; - ahci_enable_and_probe(); + if (ahci_enable_and_probe()) + { + err_global_get() = kErrorSuccess; - err_global_get() = kErrorSuccess; - - return YES; + return YES; + } } else if (atapi && kSATAPISignature == mem_ahci->Ports[ahci_index].Sig) { kSATAIndex = ahci_index; kSATAHba = mem_ahci; - ahci_enable_and_probe(); - - err_global_get() = kErrorSuccess; + if (ahci_enable_and_probe()) + { + err_global_get() = kErrorSuccess; - return YES; + return YES; + } } ports_implemented >>= 1; diff --git a/dev/kernel/src/FileMgr.cc b/dev/kernel/src/FileMgr.cc index 67c15e64..1a1ee6b8 100644 --- a/dev/kernel/src/FileMgr.cc +++ b/dev/kernel/src/FileMgr.cc @@ -7,8 +7,10 @@ #include #include +/***********************************************************************************/ /// @file FileMgr.cc //! @brief File System Manager API. +/***********************************************************************************/ namespace Kernel { diff --git a/dev/kernel/src/IDylibObject.cc b/dev/kernel/src/IDylibObject.cc index 92907859..ef4d5ecf 100644 --- a/dev/kernel/src/IDylibObject.cc +++ b/dev/kernel/src/IDylibObject.cc @@ -1,7 +1,7 @@ /* * ======================================================== * - * neoskrnl + * NeKernel * Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. * * ======================================================== @@ -10,6 +10,4 @@ #include #include -#include - using namespace Kernel; diff --git a/dev/kernel/src/IPEFDylibObject.cc b/dev/kernel/src/IPEFDylibObject.cc index 39c99263..a42d267a 100644 --- a/dev/kernel/src/IPEFDylibObject.cc +++ b/dev/kernel/src/IPEFDylibObject.cc @@ -1,7 +1,7 @@ /* * ======================================================== * - * neoskrnl +* NeKernel * Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. * * ======================================================== diff --git a/dev/kernel/src/KernelProcessScheduler.cc b/dev/kernel/src/KernelProcessScheduler.cc index 2a2384e2..58137545 100644 --- a/dev/kernel/src/KernelProcessScheduler.cc +++ b/dev/kernel/src/KernelProcessScheduler.cc @@ -2,8 +2,8 @@ Copyright (C) 2025, Amlal El Mahrouss, all rights reserved. - FILE: UserProcessScheduler.cc - PURPOSE: Low level/Ring-3 Process scheduler. + FILE: KernelProcessScheduler.cc + PURPOSE: Privileged/Ring-0 process scheduler. ------------------------------------------- */ diff --git a/dev/kernel/src/MemoryMgr.cc b/dev/kernel/src/MemoryMgr.cc index b064bafb..5c483ed5 100644 --- a/dev/kernel/src/MemoryMgr.cc +++ b/dev/kernel/src/MemoryMgr.cc @@ -108,7 +108,8 @@ namespace Kernel if (!ptr_heap || new_sz < 1) return nullptr; - kout << "This function is not implemented by NeOSKrnl, please use the BSD's realloc instead.\r"; + kout << "This function is not implemented by the kernel itself.\r"; + ke_panic(RUNTIME_CHECK_INVALID); return nullptr; diff --git a/dev/kernel/src/ThreadLocalStorage.cc b/dev/kernel/src/ThreadLocalStorage.cc index 314e7583..79d2ef5f 100644 --- a/dev/kernel/src/ThreadLocalStorage.cc +++ b/dev/kernel/src/ThreadLocalStorage.cc @@ -1,7 +1,7 @@ /* * ======================================================== * - * neoskrnl +* NeKernel * Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. * * ======================================================== diff --git a/dev/modules/CoreGfx/CoreAccess.h b/dev/modules/CoreGfx/CoreAccess.h index adc9ed33..b3d17a59 100644 --- a/dev/modules/CoreGfx/CoreAccess.h +++ b/dev/modules/CoreGfx/CoreAccess.h @@ -4,8 +4,8 @@ ------------------------------------------- */ -#ifndef GFX_MGR_ACCESSIBILITY_H -#define GFX_MGR_ACCESSIBILITY_H +#ifndef CORE_GFX_ACCESSIBILITY_H +#define CORE_GFX_ACCESSIBILITY_H #include #include @@ -38,4 +38,4 @@ namespace FB }; } // namespace FB -#endif // !GFX_MGR_ACCESSIBILITY_H_ +#endif // !CORE_GFX_ACCESSIBILITY_H_ diff --git a/dev/modules/CoreGfx/CoreGfx.h b/dev/modules/CoreGfx/CoreGfx.h index df22fed0..eda52520 100644 --- a/dev/modules/CoreGfx/CoreGfx.h +++ b/dev/modules/CoreGfx/CoreGfx.h @@ -129,15 +129,13 @@ #define FBDrawInRegionA(clr, height, width, base_x, base_y) #endif // __NE_AMD64__ -#ifndef GFX_MGR_ACCESSIBILITY_H +#ifndef CORE_GFX_ACCESSIBILITY_H #include -#endif // ifndef GFX_MGR_ACCESSIBILITY_H +#endif // ifndef CORE_GFX_ACCESSIBILITY_H namespace FB { - struct FB_CONTROL_BLOCK; - - inline void fb_clear_video() noexcept + inline Void fb_clear_video() noexcept { fb_init(); @@ -146,5 +144,4 @@ namespace FB fb_clear(); } - } // namespace FB \ No newline at end of file diff --git a/dev/modules/CoreGfx/MathGfx.h b/dev/modules/CoreGfx/MathGfx.h index 655903e2..f03e2f19 100644 --- a/dev/modules/CoreGfx/MathGfx.h +++ b/dev/modules/CoreGfx/MathGfx.h @@ -11,7 +11,7 @@ namespace UI { -#ifdef NE_GFX_MGR_USE_DOUBLE +#ifdef NE_CORE_GFX_USE_DOUBLE typedef double fb_real_t; #else typedef float fb_real_t; diff --git a/dev/modules/MBCI/MBCI.h b/dev/modules/MBCI/MBCI.h index 975fa7fe..ebc73f69 100644 --- a/dev/modules/MBCI/MBCI.h +++ b/dev/modules/MBCI/MBCI.h @@ -7,9 +7,13 @@ #ifndef _INC_MODULE_MBCI_H_ #define _INC_MODULE_MBCI_H_ +#include #include #include +/// @file MBCI.h +/// @brief Mini Bus Controller Interface. + /** - VCC (IN) (OUT for MCU) - CLK (IN) (OUT for MCU) @@ -22,8 +26,9 @@ */ #define kMBCIZeroSz (8) +#define kMBCIESBSz (64) -namespace NeOS +namespace Kernel { struct IMBCIHost; @@ -53,14 +58,15 @@ namespace NeOS UInt64 BaseAddressRegister; UInt64 BaseAddressRegisterSize; UInt32 CommandIssue; - Char Zero[kMBCIZeroSz]; + UInt8 Esb[kMBCIESBSz]; // Extended Signature Block + UInt8 Zero[kMBCIZeroSz]; }; /// @brief MBCI host flags. enum MBCIHostFlags { kMBCIHostFlagsSupportsNothing, // Invalid MBCI device. - kMBCIHostFlagsSupportsAPM, // Advanced Power Management. + kMBCIHostFlagsSupportsAPM, // FW's Advanced Power Management. kMBCIHostFlagsSupportsDaisyChain, // Is daisy chained. kMBCIHostFlagsSupportsHWInterrupts, // Has HW interrupts. kMBCIHostFlagsSupportsDMA, // Has DMA. @@ -93,8 +99,33 @@ namespace NeOS kMBCIHostStateCount, }; - /// @brief An AuthKey is a context used to decrpy data from an MBCI packet. - typedef UInt64 MBCIAuthKeyType; -} // namespace NeOS + /// @brief An AuthKey is a context used to tokenize data for an MBCI packet. + typedef UInt32 MBCIAuthKeyType; + + /// @brief Read Auth key for MBCI host. + /// @param host the mbci host to get the key on. + /// @return the 24-bit key. + inline MBCIAuthKeyType mbci_read_auth_key(_Input volatile struct IMBCIHost* host) + { + constexpr auto const kChallengeMBCI = 0xdeadbeef; + + host->MMIOTest = kChallengeMBCI; + + if (host->MMIOTest == kChallengeMBCI) + { + return (host->Esb[kMBCIESBSz - 1] << 16) | (host->Esb[kMBCIESBSz - 2] << 8) | (host->Esb[kMBCIESBSz - 3] & 0xFF); + } + + return kChallengeMBCI; + } + + inline BOOL mbci_test_mmio(_Input volatile struct IMBCIHost* host) + { + constexpr auto const kChallengeMBCI = 0xdeadbeef; + + host->MMIOTest = kChallengeMBCI; + return host->MMIOTest == kChallengeMBCI; + } +} // namespace Kernel #endif // ifndef _INC_MODULE_MBCI_H_ \ No newline at end of file diff --git a/dev/modules/NVME/NVME.h b/dev/modules/NVME/NVME.h index 42edd149..f58aacf9 100644 --- a/dev/modules/NVME/NVME.h +++ b/dev/modules/NVME/NVME.h @@ -15,7 +15,7 @@ #include /// @file NVME.h -/// @brief NVME driver. +/// @brief Non Volatile Memory. #define NE_ALIGN_NVME ATTRIBUTE(aligned(sizeof(Kernel::UInt32))) @@ -46,7 +46,7 @@ namespace Kernel enum { - kInvalidNVME, + kInvalidNVME = 0xFF, kCreateCompletionQueueNVME = 0x05, kCreateSubmissionQueueNVME = 0x01, kIdentifyNVME = 0x06, -- cgit v1.2.3