From 2ead335ccc7afd8e1b2a6533e966c10f49fbdfe9 Mon Sep 17 00:00:00 2001 From: Amlal Date: Mon, 28 Apr 2025 09:06:35 +0200 Subject: dev, kernel: HeFS, Tooling: reworked the mkfs.hefs tool for the new filesystem. other/related: - Add new KPC codes. - Final refactors for HeFS's Format method. - Dma pool improvements. - Better standard disk I/O names. - Add mm_memory_fence function inside HalPagingMgrAMD64.cc Signed-off-by: Amlal --- dev/kernel/HALKit/AMD64/HalKernelMain.cc | 2 +- dev/kernel/HALKit/AMD64/HalPagingMgrAMD64.cc | 16 +++++++++++++--- dev/kernel/HALKit/AMD64/Processor.h | 2 ++ dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc | 14 +++++++------- dev/kernel/HALKit/AMD64/Storage/DMA+Generic.cc | 6 +++--- dev/kernel/HALKit/AMD64/Storage/PIO+Generic.cc | 4 ++-- 6 files changed, 28 insertions(+), 16 deletions(-) (limited to 'dev/kernel/HALKit') diff --git a/dev/kernel/HALKit/AMD64/HalKernelMain.cc b/dev/kernel/HALKit/AMD64/HalKernelMain.cc index 66793aa6..a6bf09c7 100644 --- a/dev/kernel/HALKit/AMD64/HalKernelMain.cc +++ b/dev/kernel/HALKit/AMD64/HalKernelMain.cc @@ -142,4 +142,4 @@ EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept { ++team_index; } } -#endif // ifndef __NE_MODULAR_KERNEL_COMPONENTS__ \ No newline at end of file +#endif // ifndef __NE_MODULAR_KERNEL_COMPONENTS__ \ No newline at end of file diff --git a/dev/kernel/HALKit/AMD64/HalPagingMgrAMD64.cc b/dev/kernel/HALKit/AMD64/HalPagingMgrAMD64.cc index d7a8baf6..b6176e39 100644 --- a/dev/kernel/HALKit/AMD64/HalPagingMgrAMD64.cc +++ b/dev/kernel/HALKit/AMD64/HalPagingMgrAMD64.cc @@ -93,6 +93,18 @@ UIntPtr hal_get_phys_address(VoidPtr virt) { return (pte->PhysicalAddress << 12) | (kVMAddr & 0xFFF); } +/***********************************************************************************/ +/// @brief clflush+mfence helper function. +/***********************************************************************************/ +EXTERN_C Int32 mm_memory_fence(VoidPtr virtual_address) { + if (!virtual_address || !hal_get_phys_address(virtual_address)) return kErrorInvalidData; + + asm volatile("clflush (%0)" : : "r"(virtual_address) : "memory"); + asm volatile("mfence" ::: "memory"); + + return kErrorSuccess; +} + /***********************************************************************************/ /// @brief Maps or allocates a page from virtual_address. /// @param virtual_address a valid virtual address. @@ -136,9 +148,7 @@ EXTERN_C Int32 mm_map_page(VoidPtr virtual_address, VoidPtr physical_address, UI hal_invl_tlb(virtual_address); - asm volatile("clflush (%0)" : : "r"(virtual_address) : "memory"); - - asm volatile("mfence" ::: "memory"); + mm_memory_fence(virtual_address); mmi_page_status(pte); diff --git a/dev/kernel/HALKit/AMD64/Processor.h b/dev/kernel/HALKit/AMD64/Processor.h index 1319277f..b57e9abf 100644 --- a/dev/kernel/HALKit/AMD64/Processor.h +++ b/dev/kernel/HALKit/AMD64/Processor.h @@ -272,6 +272,8 @@ EXTERN_C Void rt_cli(); EXTERN_C Void rt_sti(); EXTERN_C Void rt_cld(); EXTERN_C Void rt_std(); + +EXTERN_C Int32 mm_memory_fence(VoidPtr virtual_address); } // namespace Kernel::HAL EXTERN_C Kernel::Void idt_handle_generic(Kernel::UIntPtr rsp); diff --git a/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc b/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc index 06c7781c..050826e3 100644 --- a/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc +++ b/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc @@ -257,7 +257,7 @@ SizeT drv_get_sector_count_ahci() { /// @brief Get the drive size. /// @return Disk size in bytes. SizeT drv_get_size_ahci() { - return drv_get_sector_count() * kAHCISectorSize; + return drv_std_get_sector_count() * kAHCISectorSize; } /// @brief Enable Host and probe using the IDENTIFY command. @@ -426,16 +426,16 @@ Bool drv_std_detected_ahci() { /// //////////////////////////////////////////////////// Void drv_std_write(UInt64 lba, Char* buffer, SizeT sector_sz, SizeT size_buffer) { - drv_std_input_output_ahci(lba / sector_sz, reinterpret_cast(buffer), sector_sz, - size_buffer); + drv_std_input_output_ahci(lba / sector_sz, reinterpret_cast(buffer), + sector_sz, size_buffer); } //////////////////////////////////////////////////// /// //////////////////////////////////////////////////// Void drv_std_read(UInt64 lba, Char* buffer, SizeT sector_sz, SizeT size_buffer) { - drv_std_input_output_ahci(lba / sector_sz, reinterpret_cast(buffer), sector_sz, - size_buffer); + drv_std_input_output_ahci(lba / sector_sz, reinterpret_cast(buffer), + sector_sz, size_buffer); } //////////////////////////////////////////////////// @@ -459,7 +459,7 @@ Bool drv_std_detected(Void) { @return Sector size in bytes. */ //////////////////////////////////////////////////// -SizeT drv_get_sector_count() { +SizeT drv_std_get_sector_count() { return drv_get_sector_count_ahci(); } @@ -467,7 +467,7 @@ SizeT drv_get_sector_count() { /// @brief Get the drive size. /// @return Disk size in bytes. //////////////////////////////////////////////////// -SizeT drv_get_size() { +SizeT drv_std_get_size() { return drv_get_size_ahci(); } diff --git a/dev/kernel/HALKit/AMD64/Storage/DMA+Generic.cc b/dev/kernel/HALKit/AMD64/Storage/DMA+Generic.cc index ca3e9ee4..4688203f 100644 --- a/dev/kernel/HALKit/AMD64/Storage/DMA+Generic.cc +++ b/dev/kernel/HALKit/AMD64/Storage/DMA+Generic.cc @@ -183,15 +183,15 @@ Boolean drv_std_detected(Void) { @return Number of sectors, or zero. */ /***********************************************************************************/ -Kernel::SizeT drv_get_sector_count() { +Kernel::SizeT drv_std_get_sector_count() { return (kATAIdentifyData[61] << 16) | kATAIdentifyData[60]; } /***********************************************************************************/ /// @brief Get the size of the current drive. /***********************************************************************************/ -Kernel::SizeT drv_get_size() { - return (drv_get_sector_count()) * kATASectorSize; +Kernel::SizeT drv_std_get_size() { + return (drv_std_get_sector_count()) * kATASectorSize; } #endif /* ifdef __ATA_DMA__ */ diff --git a/dev/kernel/HALKit/AMD64/Storage/PIO+Generic.cc b/dev/kernel/HALKit/AMD64/Storage/PIO+Generic.cc index a024d2fe..e57494a7 100644 --- a/dev/kernel/HALKit/AMD64/Storage/PIO+Generic.cc +++ b/dev/kernel/HALKit/AMD64/Storage/PIO+Generic.cc @@ -245,11 +245,11 @@ Void drv_std_write(UInt64 Lba, UInt16 IO, UInt8 Master, Char* Buf, SizeT SectorS drv_pio_std_write(Lba, IO, Master, Buf, SectorSz, Size); } -SizeT drv_get_size() { +SizeT drv_std_get_size() { return drv_pio_get_size(); } -SizeT drv_get_sector_count() { +SizeT drv_std_get_sector_count() { return drv_pio_get_sector_count(); } -- cgit v1.2.3