summaryrefslogtreecommitdiffhomepage
path: root/dev/Kernel/HALKit
diff options
context:
space:
mode:
authorAmlal <amlal.elmahrouss@icloud.com>2025-02-16 19:26:51 +0100
committerAmlal <amlal.elmahrouss@icloud.com>2025-02-16 19:26:51 +0100
commit0737d2f96d52e80cd6d13b0c37a4f8428e1b5bb9 (patch)
tree9443bee06cd6cf39d57335c66990c537df821b7d /dev/Kernel/HALKit
parent384710f48befc0e68d9fd8e70926b4ab8163119d (diff)
ADD: Many tweaks to the OS.
Signed-off-by: Amlal <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'dev/Kernel/HALKit')
-rw-r--r--dev/Kernel/HALKit/AMD64/HalInterruptAPI.asm16
-rw-r--r--dev/Kernel/HALKit/AMD64/Storage/SATA.cc40
2 files changed, 24 insertions, 32 deletions
diff --git a/dev/Kernel/HALKit/AMD64/HalInterruptAPI.asm b/dev/Kernel/HALKit/AMD64/HalInterruptAPI.asm
index b9a1e831..ffea6707 100644
--- a/dev/Kernel/HALKit/AMD64/HalInterruptAPI.asm
+++ b/dev/Kernel/HALKit/AMD64/HalInterruptAPI.asm
@@ -18,14 +18,6 @@ global __NE_INT_%1
__NE_INT_%1:
cld
- mov al, 0x20
- out 0xA0, al
- out 0x20, al
-
- push rcx
- call idt_handle_generic
- pop rcx
-
std
o64 iret
@@ -36,10 +28,6 @@ global __NE_INT_%1
__NE_INT_%1:
cld
- mov al, 0x20
- out 0xA0, al
- out 0x20, al
-
std
o64 iret
@@ -66,6 +54,10 @@ __NE_INT_0:
mov al, 0x20
out 0x20, al
+ push rcx
+ call idt_handle_generic
+ pop rcx
+
std
o64 iret
diff --git a/dev/Kernel/HALKit/AMD64/Storage/SATA.cc b/dev/Kernel/HALKit/AMD64/Storage/SATA.cc
index 6d2cfb9d..70fd5cb4 100644
--- a/dev/Kernel/HALKit/AMD64/Storage/SATA.cc
+++ b/dev/Kernel/HALKit/AMD64/Storage/SATA.cc
@@ -15,8 +15,7 @@
*
*/
-#include "HALKit/AMD64/Processor.h"
-#include "NewKit/Macros.h"
+#include "NewKit/Defines.h"
#include <KernelKit/UserProcessScheduler.h>
#include <KernelKit/LPC.h>
@@ -64,13 +63,13 @@ static Kernel::Void drvi_calculate_disk_geometry() noexcept
{
kCurrentDiskSectorCount = 0UL;
- Kernel::UInt8 identify_data[512] = {};
+ Kernel::UInt8* identify_data = new Kernel::UInt8[512];
drvi_std_input_output<NO, YES, YES>(0, identify_data, 0, 512);
kCurrentDiskSectorCount = (identify_data[61] << 16) | identify_data[60];
- for (int i = 0; i < 20; i++)
+ for (Kernel::Int32 i = 0; i < 20; i++)
{
kCurrentDiskModel[i * 2] = identify_data[27 + i] >> 8;
kCurrentDiskModel[i * 2 + 1] = identify_data[27 + i] & 0xFF;
@@ -82,6 +81,8 @@ static Kernel::Void drvi_calculate_disk_geometry() noexcept
kout << "Disk Size: " << Kernel::number(drv_get_size()) << endl;
kout << "Highest Disk LBA: " << Kernel::number(kCurrentDiskSectorCount) << endl;
+
+ delete [] identify_data;
}
/// @brief Initializes an AHCI disk.
@@ -101,11 +102,11 @@ Kernel::Boolean drv_std_init(Kernel::UInt16& PortsImplemented)
if (kDevice.Subclass() == kSATASubClass &&
kDevice.ProgIf() == kSATAProgIfAHCI)
{
- kDevice.EnableMmio(kSATABar5); // Enable the memory index_byte/o for this ahci device.
- kDevice.BecomeBusMaster(kSATABar5); // Become bus master for this ahci device, so that we can control it.
-
HbaMem* mem_ahci = (HbaMem*)kDevice.Bar(kSATABar5);
+ kDevice.EnableMmio(kDevice.Bar(kSATABar5)); // Enable the memory index_byte/o for this ahci device.
+ kDevice.BecomeBusMaster(kDevice.Bar(kSATABar5)); // Become bus master for this ahci device, so that we can control it.
+
Kernel::UInt32 ports_implemented = mem_ahci->Pi;
Kernel::UInt16 ahci_index = 0;
@@ -121,9 +122,7 @@ 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;
- HAL::mm_map_page(mem_ahci, mem_ahci, HAL::kMMFlagsWr);
-
- if (mem_ahci->Ports[ahci_index].Sig == kSATASignature && det == 3 && ipm == 1 &&
+ if (mem_ahci->Ports[ahci_index].Sig == kSATASignature && det == kSATAPresent && ipm == kSATAIPMActive &&
(mem_ahci->Ports[ahci_index].Ssts & 0xF))
{
kout << "Port is implemented as SATA.\r";
@@ -131,8 +130,6 @@ Kernel::Boolean drv_std_init(Kernel::UInt16& PortsImplemented)
kSATAPortIdx = ahci_index;
kSATA = mem_ahci;
- kSATA->Ghc |= kHBACmdAE;
-
drvi_calculate_disk_geometry();
return YES;
@@ -187,18 +184,18 @@ static Kernel::Void drvi_std_input_output(Kernel::UInt64 lba, Kernel::UInt8* buf
return;
if (size_buffer > mib_cast(4))
- Kernel::ke_panic(RUNTIME_CHECK_FAILED, "AHCI only supports < 4mb DMA transfers per PRD.");
+ Kernel::ke_panic(RUNTIME_CHECK_FAILED, "AHCI only supports < 4mib DMA transfers per PRD.");
if (!Write)
Kernel::rt_set_memory(buffer, 0, size_buffer);
- HbaCmdHeader* command_header = ((HbaCmdHeader*)((Kernel::UInt64)(kSATA->Ports[kSATAPortIdx].Clb)));
+ HbaCmdHeader* ATTRIBUTE(aligned(1024)) command_header = ((HbaCmdHeader*)((Kernel::UInt64)(kSATA->Ports[kSATAPortIdx].Clb)));
command_header->Cfl = sizeof(FisRegH2D) / sizeof(Kernel::UInt32);
command_header->Write = Write;
command_header->Prdtl = 1;
command_header->Atapi = 0;
- command_header->Prefetchable = 1;
+ command_header->Prefetchable = 0;
HbaCmdTbl* command_table = ((HbaCmdTbl*)((Kernel::UInt64)(command_header->Ctba)));
@@ -209,9 +206,9 @@ static Kernel::Void drvi_std_input_output(Kernel::UInt64 lba, Kernel::UInt8* buf
auto phys_dma_buf = (Kernel::UIntPtr)Kernel::HAL::hal_get_phys_address(buffer);
command_table->Prdt[0].Dbau = (((Kernel::UInt64)phys_dma_buf >> 32));
- command_table->Prdt[0].Dba = ((Kernel::UInt32)(Kernel::UInt64)phys_dma_buf & 0xFFFFFFFF);
+ command_table->Prdt[0].Dba = ((Kernel::UInt32)(Kernel::UInt64)phys_dma_buf);
command_table->Prdt[0].Dbc = ((size_buffer)-1);
- command_table->Prdt[0].IE = 1;
+ command_table->Prdt[0].Ie = 0;
FisRegH2D* h2d_fis = (FisRegH2D*)((Kernel::UInt64)&command_table->Cfis);
@@ -239,15 +236,18 @@ static Kernel::Void drvi_std_input_output(Kernel::UInt64 lba, Kernel::UInt8* buf
if (kSATA->Is & kHBAErrTaskFile)
Kernel::ke_panic(RUNTIME_CHECK_BAD_BEHAVIOR, "AHCI Read disk failure, faulty component.");
- while (kSATA->Ports[kSATAPortIdx].Cmd & (kHBAPxCmdCR | kHBAPxCmdFR))
- ; // Ensure controller is idle
+ kSATA->Ports[kSATAPortIdx].Ie = 0;
+ kSATA->Ports[kSATAPortIdx].Cmd = kHBAPxCmdFR | kHBAPxCmdST;
kSATA->Ports[kSATAPortIdx].Ci = (1 << slot);
+
+ while (!drv_is_ready())
+ ;
}
BOOL drv_is_ready(void)
{
- return kSATA->Ports[kSATAPortIdx].Is == 0;
+ return kSATA->Ports[kSATAPortIdx].Ci == 0;
}
/***