summaryrefslogtreecommitdiffhomepage
path: root/dev
diff options
context:
space:
mode:
authorAmlal <amlal.elmahrouss@icloud.com>2025-02-19 20:28:01 +0100
committerAmlal <amlal.elmahrouss@icloud.com>2025-02-19 20:28:01 +0100
commit3dcad477f1a8e050aee038c5a424fab1068b564b (patch)
tree7d0c689de2eadcb56cc2dcc41b07c13a47f4b1ff /dev
parenta4975f8b54c863583a7dfdd88d711bc4d2074059 (diff)
ADD: Found the root cause of the AHCI issue.
Signed-off-by: Amlal <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'dev')
-rw-r--r--dev/Boot/amd64-desktop.make6
-rw-r--r--dev/Kernel/HALKit/AMD64/Storage/AHCI.cc78
-rw-r--r--dev/Kernel/src/DriveMgr.cc8
3 files changed, 28 insertions, 64 deletions
diff --git a/dev/Boot/amd64-desktop.make b/dev/Boot/amd64-desktop.make
index de14f5ca..300856c7 100644
--- a/dev/Boot/amd64-desktop.make
+++ b/dev/Boot/amd64-desktop.make
@@ -50,12 +50,14 @@ endif
ifeq ($(shell uname), Darwin)
EMU_FLAGS=-net none -smp 4 -m 8G \
- -bios $(BIOS) -cdrom $(BOOT) -boot d
+ -bios $(BIOS) -cdrom $(BOOT) -boot d -drive \
+ file=fat:rw:src/Root/,index=3,format=raw
endif
ifneq ($(shell uname), Darwin)
EMU_FLAGS=-net none -smp 4 -m 8G \
- -bios $(BIOS) -M q35 -cdrom $(BOOT) -boot d -accel kvm
+ -bios $(BIOS) -M q35 -cdrom $(BOOT) -boot d -accel kvm -drive \
+ file=fat:rw:src/Root/,index=3,format=raw
endif
LD_FLAGS=-e Main --subsystem=10
diff --git a/dev/Kernel/HALKit/AMD64/Storage/AHCI.cc b/dev/Kernel/HALKit/AMD64/Storage/AHCI.cc
index 283a873d..712a5c49 100644
--- a/dev/Kernel/HALKit/AMD64/Storage/AHCI.cc
+++ b/dev/Kernel/HALKit/AMD64/Storage/AHCI.cc
@@ -15,6 +15,8 @@
*
*/
+#include "HALKit/AMD64/Processor.h"
+#include "KernelKit/DebugOutput.h"
#include <KernelKit/UserProcessScheduler.h>
#include <KernelKit/LPC.h>
@@ -113,54 +115,13 @@ Kernel::Boolean drv_std_init(Kernel::UInt16& PortsImplemented)
Kernel::UInt8 ipm = (mem_ahci->Ports[ahci_index].Ssts >> 8) & 0x0F;
Kernel::UInt8 det = mem_ahci->Ports[ahci_index].Ssts & 0x0F;
- if (mem_ahci->Ports[ahci_index].Sig == kSATASignature)
+ if (mem_ahci->Ports[ahci_index].Sig == kSATASignature && det == kAhciPresent && ipm == kAhciIPMActive)
{
kout << "Port is SATA.\r";
kSATAPortIdx = ahci_index;
kSATA = mem_ahci;
- kSATA->Ports[kSATAPortIdx].Cmd &= ~kHBAPxCmdST;
- kSATA->Ports[kSATAPortIdx].Cmd &= ~kHBAPxCmdFre;
-
- while (YES)
- {
- if (kSATA->Ports[kSATAPortIdx].Cmd & kHBAPxCmdFR)
- continue;
- if (kSATA->Ports[kSATAPortIdx].Cmd & kHBAPxCmdCR)
- continue;
-
- break;
- }
-
- const auto kAHCIBaseAddress = mib_cast(4);
-
- kSATA->Ports[kSATAPortIdx].Clb = kAHCIBaseAddress + (kSATAPortIdx << 10);
- kSATA->Ports[kSATAPortIdx].Clbu = 0;
-
- rt_set_memory((VoidPtr)((UIntPtr)kSATA->Ports[kSATAPortIdx].Clb), 0, 1024);
-
- kSATA->Ports[kSATAPortIdx].Fb = kAHCIBaseAddress + (32 << 10) + (kSATAPortIdx << 8);
- kSATA->Ports[kSATAPortIdx].Fbu = 0;
-
- rt_set_memory((VoidPtr)((UIntPtr)kSATA->Ports[kSATAPortIdx].Fb), 0, 256);
-
- HbaCmdHeader* cmdheader = (HbaCmdHeader*)((UIntPtr)kSATA->Ports[kSATAPortIdx].Clb);
-
- for (int i = 0; i < 32; i++)
- {
- cmdheader[i].Prdtl = 8;
-
- cmdheader[i].Ctba = kAHCIBaseAddress + (40 << 10) + (kSATAPortIdx << 13) + (i << 8);
- cmdheader[i].Ctbau = 0;
-
- rt_set_memory((VoidPtr)(UIntPtr)cmdheader[i].Ctba, 0, 256);
- }
-
- while (kSATA->Ports[kSATAPortIdx].Cmd & kHBAPxCmdCR)
- {
- }
-
kSATA->Ports[kSATAPortIdx].Cmd |= kHBAPxCmdFre;
kSATA->Ports[kSATAPortIdx].Cmd |= kHBAPxCmdST;
@@ -205,7 +166,7 @@ static Kernel::Int32 drv_find_cmd_slot(HbaPort* port) noexcept
Kernel::UInt32 slots = (kSATA->Ports[kSATAPortIdx].Sact | kSATA->Ports[kSATAPortIdx].Ci);
- for (Kernel::Int32 i = 0; i < ((kSATA->Cap & 0x1F) + 1); i++)
+ for (Kernel::Int32 i = 0; i < 32; i++)
{
if ((slots & 1) == 0)
return i;
@@ -221,9 +182,6 @@ BOOL kAHCICommandIssued = NO;
template <BOOL Write, BOOL CommandOrCTRL, BOOL Identify>
static Kernel::Void drv_std_input_output(Kernel::UInt64 lba, Kernel::UInt8* buffer, Kernel::SizeT sector_sz, Kernel::SizeT size_buffer) noexcept
{
- kSATA->Ports[kSATAPortIdx].Is = -1;
- kSATA->Is = -1;
-
auto slot = 0L;
slot = drv_find_cmd_slot(&kSATA->Ports[kSATAPortIdx]);
@@ -239,21 +197,23 @@ static Kernel::Void drv_std_input_output(Kernel::UInt64 lba, Kernel::UInt8* buff
command_header->Cfl = sizeof(FisRegH2D) / sizeof(Kernel::UInt32);
command_header->Write = Write;
- command_header->Prdtl = (size_buffer / 16) + 1;
+ command_header->Prdtl = 2;
- volatile HbaCmdTbl* command_table = (volatile HbaCmdTbl*)((Kernel::UInt64)command_header->Ctba + command_header->Ctbau);
+ volatile HbaCmdTbl* command_table = (volatile HbaCmdTbl*)((Kernel::UInt64)command_header->Ctba);
MUST_PASS(command_table);
- auto buffer_phys = buffer;
+ auto buffer_phys = Kernel::HAL::hal_get_phys_address(buffer);
- for (Kernel::SizeT i = 0; i < (command_header->Prdtl); ++i)
- {
- command_table->Prdt[i].Dba = ((Kernel::UInt32)(Kernel::UInt64)buffer_phys + (i * 16) & 0xFFFFFFFF);
- command_table->Prdt[i].Dbau = (((Kernel::UInt64)(buffer_phys + (i * 16)) >> 32) & 0xFFFFFFFF);
- command_table->Prdt[i].Dbc = (16 - 1);
- command_table->Prdt[i].Ie = YES;
- }
+ command_table->Prdt[0].Dba = ((Kernel::UInt32)(Kernel::UInt64)buffer_phys & 0xFFFFFFFF);
+ command_table->Prdt[0].Dbau = (((Kernel::UInt64)(buffer_phys) >> 32) & 0xFFFFFFFF);
+ command_table->Prdt[0].Dbc = ((size_buffer / 2) - 1);
+ command_table->Prdt[0].Ie = YES;
+
+ command_table->Prdt[1].Dba = ((Kernel::UInt32)(Kernel::UInt64)(buffer_phys + ((size_buffer / 2) - 1)) & 0xFFFFFFFF);
+ command_table->Prdt[1].Dbau = (((Kernel::UInt64)(buffer_phys + ((size_buffer / 2) - 1)) >> 32) & 0xFFFFFFFF);
+ command_table->Prdt[1].Dbc = ((size_buffer / 2) - 1);
+ command_table->Prdt[1].Ie = YES;
volatile FisRegH2D* h2d_fis = (volatile FisRegH2D*)((Kernel::UInt64)&command_table->Cfis);
@@ -273,8 +233,8 @@ static Kernel::Void drv_std_input_output(Kernel::UInt64 lba, Kernel::UInt8* buff
h2d_fis->Device = kSataLBAMode;
- h2d_fis->CountLow = (size_buffer - 1) & 0xFF;
- h2d_fis->CountHigh = ((size_buffer - 1) >> 8) & 0xFF;
+ h2d_fis->CountLow = (sector_sz - 1) & 0xFF;
+ h2d_fis->CountHigh = ((sector_sz - 1) >> 8) & 0xFF;
while ((kSATA->Ports[kSATAPortIdx].Tfd & (kAhciSRBsy | kAhciSRDrq)))
{
@@ -286,6 +246,8 @@ static Kernel::Void drv_std_input_output(Kernel::UInt64 lba, Kernel::UInt8* buff
while (kSATA->Ports[kSATAPortIdx].Ci & (1 << slot))
{
+ kout << Kernel::hex_number(command_header->Prdtl) << endl;
+
if (kSATA->Is & kHBAErrTaskFile) // check for task file error.
{
Kernel::ke_panic(RUNTIME_CHECK_BAD_BEHAVIOR, "AHCI Read disk failure, faulty component.");
diff --git a/dev/Kernel/src/DriveMgr.cc b/dev/Kernel/src/DriveMgr.cc
index 0a4093c3..bd94db6c 100644
--- a/dev/Kernel/src/DriveMgr.cc
+++ b/dev/Kernel/src/DriveMgr.cc
@@ -155,10 +155,12 @@ namespace Kernel
return trait;
}
- namespace Detect
+ namespace Detail
{
Void io_detect_drive(DriveTrait& trait)
{
+ trait.fInit(trait.fPacket);
+
EPM_PART_BLOCK block_struct;
trait.fPacket.fPacketLba = kEPMBootBlockLba;
@@ -168,8 +170,6 @@ namespace Kernel
rt_copy_memory((VoidPtr) "fs/detect-packet", trait.fPacket.fPacketMime,
rt_string_len("fs/detect-packet"));
- trait.fInit(trait.fPacket);
-
trait.fInput(trait.fPacket);
if (rt_string_cmp(((BOOT_BLOCK_STRUCT*)trait.fPacket.fPacketContent)->Magic, kEPMMagic, kEPMMagicLength) == 0)
@@ -235,7 +235,7 @@ namespace Kernel
kout << "Detecting partition scheme of: " << trait.fName << ".\r";
- Detect::io_detect_drive(trait);
+ Detail::io_detect_drive(trait);
return trait;
}