summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal@nekernel.org>2025-04-08 10:19:56 +0200
committerGitHub <noreply@github.com>2025-04-08 10:19:56 +0200
commit29828ef52df7a51e22057b4557b8d9a3d5550839 (patch)
tree8f809bcf67e1c77beae47bce71877bd546db5146
parentb18c5e09961d8bc0b2368176d9fb23789afebb87 (diff)
parent1f6dd86d548ec8194c79bd9e2a8b27991061cd9e (diff)
Merge pull request #12 from amlel-el-mahrouss/dev
pr/ahci: generic driver improvements.
-rw-r--r--dev/boot/amd64-ci.make2
-rw-r--r--dev/boot/modules/BootNet/BootNet.cc2
-rw-r--r--dev/boot/src/HEL/AMD64/BootEFI.cc28
-rw-r--r--dev/kernel/HALKit/AMD64/HalInterruptAPI.asm1
-rw-r--r--dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc83
-rw-r--r--dev/kernel/HALKit/ARM64/Storage/UFS+Generic.cc3
-rw-r--r--dev/kernel/KernelKit/PCI/Device.h7
-rw-r--r--dev/kernel/src/DriveMgr.cc16
-rw-r--r--dev/kernel/src/FS/NeFS.cc5
9 files changed, 62 insertions, 85 deletions
diff --git a/dev/boot/amd64-ci.make b/dev/boot/amd64-ci.make
index 3c7c6527..bdb4545f 100644
--- a/dev/boot/amd64-ci.make
+++ b/dev/boot/amd64-ci.make
@@ -49,7 +49,7 @@ DEBUG_MACRO = -D__DEBUG__
endif
ifeq ($(shell uname), Darwin)
-EMU_FLAGS=-M q35 -smp 4 -m 8G \
+EMU_FLAGS=-M q35 -smp 4 -m 8G \
-bios $(BIOS) -cdrom $(BOOT) -boot d
endif
diff --git a/dev/boot/modules/BootNet/BootNet.cc b/dev/boot/modules/BootNet/BootNet.cc
index 47129d38..284b3442 100644
--- a/dev/boot/modules/BootNet/BootNet.cc
+++ b/dev/boot/modules/BootNet/BootNet.cc
@@ -23,7 +23,7 @@ EXTERN_C Int32 BootNetModuleMain(Kernel::HEL::BootInfoHeader* handover)
memset(&inet, 0, sizeof(BOOTNET_INTERNET_HEADER));
- /// TODO: Read packet from JSON file 'bootnet.json'
+ /// TODO: Read address from JSON file 'bootnet.json'
if (inet.Length < 1)
{
diff --git a/dev/boot/src/HEL/AMD64/BootEFI.cc b/dev/boot/src/HEL/AMD64/BootEFI.cc
index ef9af9ca..bd1c7860 100644
--- a/dev/boot/src/HEL/AMD64/BootEFI.cc
+++ b/dev/boot/src/HEL/AMD64/BootEFI.cc
@@ -220,7 +220,7 @@ EFI_EXTERN_C EFI_API Int32 ModuleMain(EfiHandlePtr image_handle,
// Update handover file specific table and phyiscal start field.
//-------------------------------------------------------------//
- handover_hdr->f_BitMapStart = (VoidPtr)struct_ptr[lookup_index].VirtualStart; /* Start of bitmap. */
+ handover_hdr->f_BitMapStart = (VoidPtr)(struct_ptr[lookup_index].VirtualStart); /* Start of bitmap. */
handover_hdr->f_BitMapSize = struct_ptr[lookup_index].NumberOfPages * kib_cast(4); /* Size of bitmap in bytes. */
handover_hdr->f_FirmwareCustomTables[0] = (VoidPtr)BS;
@@ -230,7 +230,6 @@ EFI_EXTERN_C EFI_API Int32 ModuleMain(EfiHandlePtr image_handle,
// If we succeed in reading the blob, then execute it.
// ------------------------------------------ //
-#if defined(__ATA_PIO__)
Boot::BootFileReader reader_syschk(L"chk.efi", image_handle);
reader_syschk.ReadAll(0);
@@ -241,34 +240,17 @@ EFI_EXTERN_C EFI_API Int32 ModuleMain(EfiHandlePtr image_handle,
syschk_thread = new Boot::BootThread(reader_syschk.Blob());
syschk_thread->SetName("BootZ: System Check");
- Boot::BDiskFormatFactory<BootDeviceATA> partition_factory;
-
if (syschk_thread->Start(handover_hdr, NO) != kEfiOk)
{
- if (partition_factory.IsPartitionValid() == NO)
- {
- Boot::BDiskFormatFactory<BootDeviceATA>::BFileDescriptor root{};
-
- root.fFileName[0] = kNeFSRoot[0];
- root.fFileName[1] = 0;
-
- root.fKind = kNeFSCatalogKindDir;
-
- const auto kFSName = "SSD";
+ fb_init();
- partition_factory.Format(kFSName, &root, 1);
+ FB::fb_clear_video();
- fb_init();
+ FBDrawBitMapInRegion(zka_has_disk, NE_HAS_DISK_WIDTH, NE_HAS_DISK_HEIGHT, (kHandoverHeader->f_GOP.f_Width - NE_HAS_DISK_WIDTH) / 2, (kHandoverHeader->f_GOP.f_Height - NE_HAS_DISK_HEIGHT) / 2);
- FB::fb_clear_video();
-
- FBDrawBitMapInRegion(zka_has_disk, NE_HAS_DISK_WIDTH, NE_HAS_DISK_HEIGHT, (kHandoverHeader->f_GOP.f_Width - NE_HAS_DISK_WIDTH) / 2, (kHandoverHeader->f_GOP.f_Height - NE_HAS_DISK_HEIGHT) / 2);
-
- fb_clear();
- }
+ fb_clear();
}
}
-#endif
// ------------------------------------------ //
// null these fields, to avoid being reused later.
diff --git a/dev/kernel/HALKit/AMD64/HalInterruptAPI.asm b/dev/kernel/HALKit/AMD64/HalInterruptAPI.asm
index 77f1d9a1..cc34b99f 100644
--- a/dev/kernel/HALKit/AMD64/HalInterruptAPI.asm
+++ b/dev/kernel/HALKit/AMD64/HalInterruptAPI.asm
@@ -98,7 +98,6 @@ __NE_INT_3:
out 0x20, al
push rcx
- mov rcx, rsp
call idt_handle_generic
pop rcx
diff --git a/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc b/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc
index 8d053d8b..3336e20e 100644
--- a/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc
+++ b/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc
@@ -67,6 +67,22 @@ STATIC Int32 drv_find_cmd_slot_ahci(HbaPort* port) noexcept;
STATIC Void drv_compute_disk_ahci() noexcept;
+namespace AHCI::Detail
+{
+ template <typename RetType>
+ RetType* ahci_align_address(RetType* address, Int32 alignement)
+ {
+ if (!address)
+ return nullptr;
+
+ UIntPtr addr = (UIntPtr)address;
+
+ UIntPtr aligned_addr = (addr + alignement - 1) & ~alignement - 1;
+
+ return (RetType*)aligned_addr;
+ }
+} // namespace AHCI::Detail
+
STATIC Void drv_compute_disk_ahci() noexcept
{
kSATASectorCount = 0UL;
@@ -75,7 +91,7 @@ STATIC Void drv_compute_disk_ahci() noexcept
const UInt16 kSzIdent = 256;
/// Push it to the stack
- UInt16* identify_data ATTRIBUTE(aligned(4096)) = new UInt16[kSzIdent];
+ UInt16* identify_data ATTRIBUTE(aligned(kib_cast(1))) = AHCI::Detail::ahci_align_address<UInt16>(new UInt16[kSzIdent], kib_cast(1));
/// Send AHCI command for identification.
drv_std_input_output_ahci<NO, YES, YES>(0, (UInt8*)identify_data, kAHCISectorSize, kSzIdent);
@@ -166,7 +182,7 @@ STATIC Void drv_std_input_output_ahci(UInt64 lba, UInt8* buffer, SizeT sector_sz
for (UInt16 i = 0; i < prdt_count; ++i)
{
- UInt32 chunk = (bytes_remaining > kMaxPRDSize) ? kMaxPRDSize : bytes_remaining;
+ UInt32 chunk = bytes_remaining / prdt_count;
if (chunk == 0)
break;
@@ -277,8 +293,8 @@ STATIC BOOL ahci_enable_and_probe()
// Relocate Command List Base.
- auto const addr = mm_new_heap(kib_cast(64), YES, NO, 0);
- auto kAHCIBaseAddress = (UIntPtr)addr;
+ VoidPtr const kAHCIBasePtr = AHCI::Detail::ahci_align_address<Void>(mm_new_heap(kib_cast(64), YES, NO, 0), kib_cast(1));
+ UIntPtr const kAHCIBaseAddress = reinterpret_cast<UIntPtr>(kAHCIBasePtr);
port->Clb = kAHCIBaseAddress + (kSATAIndex << 10);
port->Clbu = 0;
@@ -288,7 +304,7 @@ STATIC BOOL ahci_enable_and_probe()
// Relocate Frame Info Structure now.
- port->Fb = kAHCIBaseAddress + (kSATAPortCnt << 10) + (kSATAIndex << 10);
+ port->Fb = (UInt32)(UIntPtr)(UIntPtr*)AHCI::Detail::ahci_align_address<UInt32>((UInt32*)(kAHCIBaseAddress + (kSATAPortCnt << 10) + (kSATAIndex << 10)), kib_cast(1));
port->Fbu = 0;
// clean it.
@@ -299,18 +315,12 @@ STATIC BOOL ahci_enable_and_probe()
for (Int32 i = 0; i < kSATAPortCnt; i++)
{
cmd_hdr[i].Prdtl = 8;
- cmd_hdr[i].Ctba = kAHCIBaseAddress + (40 << 10) + (kSATAPortCnt << 10) + (kSATAIndex << 10);
+ cmd_hdr[i].Ctba = (UInt32)(UIntPtr)(UIntPtr*)AHCI::Detail::ahci_align_address<UInt32>((UInt32*)(kAHCIBaseAddress + (40 << 10) + (kSATAPortCnt << 10) + (kSATAIndex << 10)), kib_cast(1));
cmd_hdr[i].Ctbau = 0;
rt_set_memory(reinterpret_cast<VoidPtr>(cmd_hdr[i].Ctba), 0, 256);
}
- for (UIntPtr offset = 0; offset < kib_cast(64); offset += kib_cast(1))
- {
- VoidPtr addr = reinterpret_cast<VoidPtr>(kAHCIBaseAddress + offset);
- HAL::mm_map_page(addr, addr, HAL::kMMFlagsWr);
- }
-
// Now we are ready.
kSATAHba->Ports[kSATAIndex].Cmd |= kHBAPxCmdFre;
@@ -356,45 +366,30 @@ STATIC Bool drv_std_init_ahci(UInt16& pi, BOOL& atapi)
pi = ports_implemented;
- const UInt16 kMaxPortsImplemented = kSATAPortCnt;
- const UInt32 kSATASignature = kSATASig;
- const UInt32 kSATAPISignature = kSATAPISig;
- const UInt8 kSATAPresent = 0x03;
- const UInt8 kSATAIPMActive = 0x01;
+ const UInt16 kSATAMaxPortsImplemented = ports_implemented;
+ const UInt32 kSATASignature = kSATASig;
+ const UInt32 kSATAPISignature = kSATAPISig;
+ const UInt8 kSATAPresent = 0x03;
+ const UInt8 kSATAIPMActive = 0x01;
- kSATAHba = mem_ahci;
+ if (kSATAMaxPortsImplemented < 1)
+ continue;
while (ports_implemented)
{
UInt8 ipm = (mem_ahci->Ports[ahci_index].Ssts >> 8) & 0x0F;
- UInt8 det = mem_ahci->Ports[ahci_index].Ssts & 0x0F;
+ UInt8 det = (mem_ahci->Ports[ahci_index].Ssts & 0x0F);
if (det != kSATAPresent || ipm != kSATAIPMActive)
continue;
- if (mem_ahci->Ports[ahci_index].Sig == kSATASignature)
+ if ((mem_ahci->Ports[ahci_index].Sig == kSATASignature) ||
+ (atapi && kSATAPISignature == mem_ahci->Ports[ahci_index].Sig))
{
kSATAIndex = ahci_index;
kSATAHba = mem_ahci;
- if (ahci_enable_and_probe())
- {
- err_global_get() = kErrorSuccess;
-
- return YES;
- }
- }
- else if (atapi && kSATAPISignature == mem_ahci->Ports[ahci_index].Sig)
- {
- kSATAIndex = ahci_index;
- kSATAHba = mem_ahci;
-
- if (ahci_enable_and_probe())
- {
- err_global_get() = kErrorSuccess;
-
- return YES;
- }
+ goto success_hba_fetch;
}
ports_implemented >>= 1;
@@ -406,6 +401,16 @@ STATIC Bool drv_std_init_ahci(UInt16& pi, BOOL& atapi)
err_global_get() = kErrorDisk;
return NO;
+
+success_hba_fetch:
+ if (ahci_enable_and_probe())
+ {
+ err_global_get() = kErrorSuccess;
+
+ return YES;
+ }
+
+ return NO;
}
/// @brief Checks if an AHCI device is detected.
@@ -418,7 +423,7 @@ Bool drv_std_detected_ahci()
// ================================================================================================
//
-// This applies only if we compile with AHCI as a default disk driver.
+/// @note This applies only if we compile with AHCI as a default disk driver.
//
// ================================================================================================
diff --git a/dev/kernel/HALKit/ARM64/Storage/UFS+Generic.cc b/dev/kernel/HALKit/ARM64/Storage/UFS+Generic.cc
index 2aeb0932..1529e158 100644
--- a/dev/kernel/HALKit/ARM64/Storage/UFS+Generic.cc
+++ b/dev/kernel/HALKit/ARM64/Storage/UFS+Generic.cc
@@ -6,6 +6,3 @@
/// @file UFS.cc
/// @brief UFS Flash Memory support.
-
-#define UFS_PCI_VENDOR_ID (0x01001) /* AKER */
-#define UFS_PCI_DEVICE_ID (0xAEAEA) /* AKER */ \ No newline at end of file
diff --git a/dev/kernel/KernelKit/PCI/Device.h b/dev/kernel/KernelKit/PCI/Device.h
index 2c92ba4f..9b750e43 100644
--- a/dev/kernel/KernelKit/PCI/Device.h
+++ b/dev/kernel/KernelKit/PCI/Device.h
@@ -24,10 +24,9 @@ namespace Kernel::PCI
Device() = default;
public:
- explicit Device(UShort bus, UShort device, UShort function, UInt32 bar);
+ Device(UShort bus, UShort device, UShort function, UInt32 bar);
Device& operator=(const Device&) = default;
-
Device(const Device&) = default;
~Device();
@@ -43,14 +42,14 @@ namespace Kernel::PCI
template <typename T>
UInt Read(UInt bar)
{
- static_assert(sizeof(T) <= 4, "64-bit PCI addressing is unsupported");
+ static_assert(sizeof(T) <= sizeof(UInt32), "64-bit PCI addressing is unsupported");
return Read(bar, sizeof(T));
}
template <typename T>
void Write(UInt bar, UIntPtr data)
{
- static_assert(sizeof(T) <= 4, "64-bit PCI addressing is unsupported");
+ static_assert(sizeof(T) <= sizeof(UInt32), "64-bit PCI addressing is unsupported");
Write(bar, data, sizeof(T));
}
diff --git a/dev/kernel/src/DriveMgr.cc b/dev/kernel/src/DriveMgr.cc
index c83e63c8..36e0a7e4 100644
--- a/dev/kernel/src/DriveMgr.cc
+++ b/dev/kernel/src/DriveMgr.cc
@@ -89,12 +89,11 @@ namespace Kernel
#elif defined(__AHCI__)
kAHCIPortsImplemented = 0;
- if (!drv_std_init(kAHCIPortsImplemented))
+ if (drv_std_init(kAHCIPortsImplemented))
{
- return;
+ pckt.fPacketGood = YES;
}
- pckt.fPacketGood = YES;
#endif // if defined(__ATA_PIO__) || defined (__ATA_DMA__)
}
@@ -106,23 +105,20 @@ namespace Kernel
{
return "ATA-PIO";
}
-#endif
-#ifdef __ATA_DMA__
+#elif defined(__ATA_DMA__)
const Char* io_drv_kind(Void)
{
return "ATA-DMA";
}
-#endif
-#ifdef __AHCI__
+#elif defined( __AHCI__)
const Char* io_drv_kind(Void)
{
return "AHCI";
}
-#endif
-#ifdef __NE_MINIMAL_OS__
+#else
const Char* io_drv_kind(Void)
{
- return "Not Loaded";
+ return "null";
}
#endif
diff --git a/dev/kernel/src/FS/NeFS.cc b/dev/kernel/src/FS/NeFS.cc
index 90c5995a..7bc02b39 100644
--- a/dev/kernel/src/FS/NeFS.cc
+++ b/dev/kernel/src/FS/NeFS.cc
@@ -505,18 +505,17 @@ bool NeFileSystemParser::Format(_Input _Output DriveTrait* drive, _Input const L
constexpr auto kFsName = "NeFS";
constexpr auto kBlockName = "NeKernel:";
- rt_copy_memory(reinterpret_cast<VoidPtr>(const_cast<Char*>(kFsName)), epm_boot->Fs, rt_string_len(kFsName));
-
epm_boot->FsVersion = kNeFSVersionInteger;
epm_boot->LbaStart = start;
epm_boot->SectorSz = kNeFSSectorSz;
+ rt_copy_memory(reinterpret_cast<VoidPtr>(const_cast<Char*>(kFsName)), epm_boot->Fs, rt_string_len(kFsName));
rt_copy_memory(reinterpret_cast<VoidPtr>(const_cast<Char*>(kBlockName)), epm_boot->Name, rt_string_len(kBlockName));
rt_copy_memory(reinterpret_cast<VoidPtr>(const_cast<Char*>(kEPMMagic)), epm_boot->Magic, rt_string_len(kEPMMagic));
Lba outEpmLba = kEPMBootBlockLba;
- Char buf[kNeFSSectorSz];
+ Char buf[kNeFSSectorSz] = {0};
Lba prevStart = 0;
SizeT cnt = 0;