summaryrefslogtreecommitdiffhomepage
path: root/dev/kernel/HALKit/AMD64
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal@nekernel.org>2025-05-14 18:35:05 +0200
committerAmlal El Mahrouss <amlal@nekernel.org>2025-05-14 18:39:11 +0200
commitf8aaa274535b6541f376090958eedbbba3ba00ba (patch)
tree420a4d41f339ac6e6f083099390dddcf59922cab /dev/kernel/HALKit/AMD64
parent2b91067c894efde74e96fd9216598a5782699c7b (diff)
feat(kernel): Filesystem fixes, and others.
what? - Add simple generic RTL8139 NIC driver, to be used within a NK device. - Update IVT accordingly. - Comment ARM's AP GIC init function, to tell what it's actually doing. - Cleanup Kernel Main, removed the useless pre_init_scheduler function. - Prepare new FileMgr with HeFileSystemMgr. - Fallback to NeFS when trying to format a fileysstem. Signed-off-by: Amlal El Mahrouss <amlal@nekernel.org>
Diffstat (limited to 'dev/kernel/HALKit/AMD64')
-rw-r--r--dev/kernel/HALKit/AMD64/HalAPICController.cc12
-rw-r--r--dev/kernel/HALKit/AMD64/HalDebugPort.cc3
-rw-r--r--dev/kernel/HALKit/AMD64/HalInterruptAPI.asm19
-rw-r--r--dev/kernel/HALKit/AMD64/HalKernelMain.cc14
-rw-r--r--dev/kernel/HALKit/AMD64/Network/Generic+Basic+RTL8139.cc81
-rw-r--r--dev/kernel/HALKit/AMD64/Storage/PIO+Generic+Next.cc280
-rw-r--r--dev/kernel/HALKit/AMD64/Storage/PIO+Generic.cc42
7 files changed, 140 insertions, 311 deletions
diff --git a/dev/kernel/HALKit/AMD64/HalAPICController.cc b/dev/kernel/HALKit/AMD64/HalAPICController.cc
index 758e2f52..e547d982 100644
--- a/dev/kernel/HALKit/AMD64/HalAPICController.cc
+++ b/dev/kernel/HALKit/AMD64/HalAPICController.cc
@@ -7,8 +7,8 @@
#include <HALKit/AMD64/Processor.h>
#include <modules/ACPI/ACPIFactoryInterface.h>
-#define cIOAPICRegVal (4)
-#define cIOAPICRegReg (0)
+#define kIOAPICRegVal (4)
+#define kIOAPICRegReg (0)
namespace Kernel::HAL {
APICController::APICController(VoidPtr base) : fApic(base) {}
@@ -19,9 +19,9 @@ UInt32 APICController::Read(UInt32 reg) noexcept {
MUST_PASS(this->fApic);
UInt32 volatile* io_apic = (UInt32 volatile*) this->fApic;
- io_apic[cIOAPICRegReg] = (reg & 0xFF);
+ io_apic[kIOAPICRegReg] = (reg & 0xFF);
- return io_apic[cIOAPICRegVal];
+ return io_apic[kIOAPICRegVal];
}
/// @brief Write to APIC controller.
@@ -32,7 +32,7 @@ Void APICController::Write(UInt32 reg, UInt32 value) noexcept {
UInt32 volatile* io_apic = (UInt32 volatile*) this->fApic;
- io_apic[cIOAPICRegReg] = (reg & 0xFF);
- io_apic[cIOAPICRegVal] = value;
+ io_apic[kIOAPICRegReg] = (reg & 0xFF);
+ io_apic[kIOAPICRegVal] = value;
}
} // namespace Kernel::HAL
diff --git a/dev/kernel/HALKit/AMD64/HalDebugPort.cc b/dev/kernel/HALKit/AMD64/HalDebugPort.cc
index 105fcf47..4e0e2b7f 100644
--- a/dev/kernel/HALKit/AMD64/HalDebugPort.cc
+++ b/dev/kernel/HALKit/AMD64/HalDebugPort.cc
@@ -9,11 +9,12 @@
#include <ArchKit/ArchKit.h>
#include <KernelKit/DebugOutput.h>
+#include <NetworkKit/NetworkDevice.h>
// after that we have start of additional data.
namespace Kernel {
-void rt_debug_listen(KernelDebugHeader* the_hdr) noexcept {
+Void rt_debug_listen(KernelDebugHeader* the_hdr) noexcept {
NE_UNUSED(the_hdr);
}
} // namespace Kernel
diff --git a/dev/kernel/HALKit/AMD64/HalInterruptAPI.asm b/dev/kernel/HALKit/AMD64/HalInterruptAPI.asm
index cf2870c8..a6c6bbb5 100644
--- a/dev/kernel/HALKit/AMD64/HalInterruptAPI.asm
+++ b/dev/kernel/HALKit/AMD64/HalInterruptAPI.asm
@@ -257,7 +257,24 @@ IntNormal 36
IntNormal 37
IntNormal 38
IntNormal 39
-IntNormal 40
+
+[extern rtl_rtl8139_interrupt_handler]
+
+__NE_INT_40:
+ cld
+
+ mov al, 0x20
+ out 0xA0, al
+ out 0x20, al
+
+ push rax
+ mov rcx, rsp
+ call rtl_rtl8139_interrupt_handler
+ pop rax
+
+ std
+
+ o64 iret
IntNormal 41
diff --git a/dev/kernel/HALKit/AMD64/HalKernelMain.cc b/dev/kernel/HALKit/AMD64/HalKernelMain.cc
index 70b07193..2d213a9b 100644
--- a/dev/kernel/HALKit/AMD64/HalKernelMain.cc
+++ b/dev/kernel/HALKit/AMD64/HalKernelMain.cc
@@ -20,13 +20,6 @@
#ifndef __NE_MODULAR_KERNEL_COMPONENTS__
EXTERN_C Kernel::VoidPtr kInterruptVectorTable[];
-STATIC Kernel::Void hal_pre_init_scheduler() noexcept {
- for (Kernel::SizeT i = 0U;
- i < Kernel::UserProcessScheduler::The().CurrentTeam().AsArray().Count(); ++i) {
- Kernel::UserProcessScheduler::The().CurrentTeam().AsArray()[i] = Kernel::USER_PROCESS();
- }
-}
-
/// @brief Kernel init function.
/// @param handover_hdr Handover boot header.
EXTERN_C Int32 hal_init_platform(Kernel::HEL::BootInfoHeader* handover_hdr) {
@@ -109,10 +102,11 @@ EXTERN_C Int32 hal_init_platform(Kernel::HEL::BootInfoHeader* handover_hdr) {
}
EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept {
- hal_pre_init_scheduler();
-
#ifdef __FSKIT_INCLUDES_HEFS__
- Kernel::HeFS::fs_init_hefs();
+ if (!Kernel::HeFS::fs_init_hefs()) {
+ // Fallback to NeFS, if HeFS doesn't work here.
+ Kernel::NeFS::fs_init_nefs();
+ }
#elif defined(__FSKIT_INCLUDES_NEFS__)
Kernel::NeFS::fs_init_nefs();
#endif
diff --git a/dev/kernel/HALKit/AMD64/Network/Generic+Basic+RTL8139.cc b/dev/kernel/HALKit/AMD64/Network/Generic+Basic+RTL8139.cc
new file mode 100644
index 00000000..06c18d8b
--- /dev/null
+++ b/dev/kernel/HALKit/AMD64/Network/Generic+Basic+RTL8139.cc
@@ -0,0 +1,81 @@
+/* -------------------------------------------
+
+Copyright (C) 2025, Amlal El Mahrouss, all rights reserved.
+
+------------------------------------------- */
+
+#include <HALKit/AMD64/Processor.h>
+#include <StorageKit/DmaPool.h>
+#include <modules/ACPI/ACPIFactoryInterface.h>
+
+using namespace Kernel;
+using namespace Kernel::HAL;
+
+STATIC UInt16 kIOBase = 0xFFFF;
+
+STATIC UInt32 kRXOffset = 0UL;
+STATIC constexpr const UInt32 kRxBufferSize = 8192 + 16 + 1500;
+
+STATIC BOOL kTXEnabled = NO;
+
+STATIC UInt8* kRXUpperLayer = nullptr;
+STATIC UInt8* kRxBuffer = nullptr;
+
+EXTERN_C Void rtl_init_nic_rtl8139(UInt16 io_base) noexcept {
+ if (kTXEnabled) return;
+
+ kIOBase = io_base;
+ MUST_PASS(io_base);
+
+ kRxBuffer = (UInt8*) rtl_dma_alloc(sizeof(UInt8) * kRxBufferSize, 0);
+
+ MUST_PASS(kRxBuffer);
+
+ /// Reset first.
+
+ rt_out8(io_base + 0x37, 0x10);
+
+ UInt16 timeout = 0U;
+
+ while (rt_in8(io_base + 0x37) & 0x10) {
+ ++timeout;
+ if (timeout > 0x1000) break;
+ }
+
+ MUST_PASS(timeout <= 0x1000);
+
+ rt_out32(io_base + 0x30, (UInt32) (UIntPtr) kRxBuffer);
+
+ rt_out8(io_base + 0x37, 0x0C);
+
+ rt_out32(io_base + 0x44, 0xf | (1 << 7));
+
+ // Enable IRQ.
+ rt_out16(io_base + 0x3C, 0x0005);
+
+ kTXEnabled = YES;
+}
+
+EXTERN_C void rtl_rtl8139_interrupt_handler() {
+ if (kIOBase == 0xFFFF) return;
+
+ UInt16 status = rt_in16(kIOBase + 0x3E);
+ rt_out16(kIOBase + 0x3E, status);
+
+ if (status & 0x01) {
+ while ((rt_in8(kIOBase + 0x37) & 0x01) == 0) {
+ UInt32 offset = kRXOffset % kRxBufferSize;
+ volatile UInt8* packet = kRxBuffer + offset + 4;
+ UInt16 len = *(UInt16*) (kRxBuffer + offset + 2);
+
+ kRXUpperLayer[offset + 4] = *packet;
+
+ kRXOffset += len + 4;
+ rt_out16(kIOBase + 0x38, (UInt16) (kRXOffset - 16));
+ }
+ }
+
+ if (!(status & 0x04)) {
+ err_global_get() = kErrorNoNetwork;
+ }
+} \ No newline at end of file
diff --git a/dev/kernel/HALKit/AMD64/Storage/PIO+Generic+Next.cc b/dev/kernel/HALKit/AMD64/Storage/PIO+Generic+Next.cc
deleted file mode 100644
index dd6b9aea..00000000
--- a/dev/kernel/HALKit/AMD64/Storage/PIO+Generic+Next.cc
+++ /dev/null
@@ -1,280 +0,0 @@
-/* -------------------------------------------
-
- Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved.
-
-------------------------------------------- */
-
-/**
- * @file PIO+Generic.cc
- * @author Amlal El Mahrouss (amlal@nekernel.org)
- * @brief ATA driver (PIO mode).
- * @version 0.1
- * @date 2024-02-02
- *
- * @copyright Copyright (c) Amlal El Mahrouss
- *
- */
-
-#if 0
-
-#include <ArchKit/ArchKit.h>
-#include <KernelKit/DriveMgr.h>
-#include <StorageKit/ATA.h>
-#include <modules/ATA/ATA.h>
-
-using namespace Kernel;
-using namespace Kernel::HAL;
-
-/// BUGS: 0
-
-#define kATADataLen 256
-
-STATIC Boolean kATADetected = false;
-STATIC UInt16 kATAIdentifyData[kATADataLen] = {0};
-STATIC Char kATADiskModel[50] = {"GENERIC PIO"};
-
-static Boolean drv_pio_std_wait_io(UInt16 IO) {
- for (int i = 0; i < 400; i++) rt_in8(IO + ATA_REG_STATUS);
-
-ATAWaitForIO_Retry:
- auto stat_rdy = rt_in8(IO + ATA_REG_STATUS);
-
- if ((stat_rdy & ATA_SR_BSY)) goto ATAWaitForIO_Retry;
-
-ATAWaitForIO_Retry2:
- stat_rdy = rt_in8(IO + ATA_REG_STATUS);
-
- if (stat_rdy & ATA_SR_ERR) return false;
-
- if (!(stat_rdy & ATA_SR_DRDY)) goto ATAWaitForIO_Retry2;
-
- return true;
-}
-
-STATIC Void drv_pio_std_select(UInt16 Bus) {
- if (Bus == ATA_PRIMARY_IO)
- rt_out8(Bus + ATA_REG_HDDEVSEL, ATA_PRIMARY_SEL);
- else
- rt_out8(Bus + ATA_REG_HDDEVSEL, ATA_SECONDARY_SEL);
-}
-
-Boolean drv_pio_std_init(UInt16 Bus, UInt8 Drive, UInt16& OutBus, UInt8& OutMaster) {
- UInt16 IO = Bus;
-
- NE_UNUSED(Drive);
-
- drv_pio_std_select(IO);
-
- // Bus init, NEIN bit.
- rt_out8(IO + ATA_REG_NEIN, 1);
-
- // identify until it's good.
-ATAInit_Retry:
- auto stat_rdy = rt_in8(IO + ATA_REG_STATUS);
-
- if (stat_rdy & ATA_SR_ERR) {
- return false;
- }
-
- if ((stat_rdy & ATA_SR_BSY)) goto ATAInit_Retry;
-
- OutBus = (Bus == ATA_PRIMARY_IO) ? ATA_PRIMARY_IO : ATA_SECONDARY_IO;
- OutMaster = (Bus == ATA_PRIMARY_IO) ? ATA_MASTER : ATA_SLAVE;
-
- drv_pio_std_select(IO);
-
- rt_out8(OutBus + ATA_REG_COMMAND, ATA_CMD_IDENTIFY);
-
- while (!(rt_in8(IO + ATA_REG_STATUS) & ATA_SR_DRQ));
-
-
- /// fetch serial info
- /// model, speed, number of sectors...
-
- for (SizeT i = 0ul; i < kATADataLen; ++i) {
- kATAIdentifyData[i] = rt_in16(OutBus + ATA_REG_DATA);
- }
-
- for (Int32 i = 0; i < 20; i++) {
- kATADiskModel[i * 2] = (kATAIdentifyData[27 + i] >> 8) & 0xFF;
- kATADiskModel[i * 2 + 1] = kATAIdentifyData[27 + i] & 0xFF;
- }
-
- kATADiskModel[40] = '\0';
-
- (Void)(kout << "Drive Model: " << kATADiskModel << kendl);
-
- return true;
-}
-
-Void drv_pio_std_read(UInt64 Lba, UInt16 IO, UInt8 Master, Char* Buf, SizeT SectorSz, SizeT Size) {
- Lba /= SectorSz;
-
- UInt8 Command = ((!Master) ? 0xE0 : 0xF0);
-
- drv_pio_std_wait_io(IO);
- drv_pio_std_select(IO);
-
- rt_out8(IO + ATA_REG_HDDEVSEL, (Command) | (((Lba) >> 24) & 0x0F));
-
- rt_out8(IO + ATA_REG_SEC_COUNT0, ((Size + SectorSz) / SectorSz));
-
- rt_out8(IO + ATA_REG_LBA0, (Lba) & 0xFF);
- rt_out8(IO + ATA_REG_LBA1, (Lba) >> 8);
- rt_out8(IO + ATA_REG_LBA2, (Lba) >> 16);
- rt_out8(IO + ATA_REG_LBA3, (Lba) >> 24);
-
- rt_out8(IO + ATA_REG_COMMAND, ATA_CMD_READ_PIO);
-
- while (!(rt_in8(IO + ATA_REG_STATUS) & ATA_SR_DRQ));
-
- for (SizeT IndexOff = 0; IndexOff < Size; IndexOff += 2) {
- drv_pio_std_wait_io(IO);
-
- auto in = rt_in16(IO + ATA_REG_DATA);
-
- Buf[IndexOff] = in & 0xFF;
- Buf[IndexOff + 1] = (in >> 8) & 0xFF;
- }
-}
-
-Void drv_pio_std_write(UInt64 Lba, UInt16 IO, UInt8 Master, Char* Buf, SizeT SectorSz, SizeT Size) {
- Lba /= SectorSz;
-
- UInt8 Command = ((!Master) ? 0xE0 : 0xF0);
-
- drv_pio_std_wait_io(IO);
- drv_pio_std_select(IO);
-
- rt_out8(IO + ATA_REG_HDDEVSEL, (Command) | (((Lba) >> 24) & 0x0F));
-
- rt_out8(IO + ATA_REG_SEC_COUNT0, ((Size + SectorSz) / SectorSz));
-
- rt_out8(IO + ATA_REG_LBA0, (Lba) & 0xFF);
- rt_out8(IO + ATA_REG_LBA1, (Lba) >> 8);
- rt_out8(IO + ATA_REG_LBA2, (Lba) >> 16);
- rt_out8(IO + ATA_REG_LBA3, (Lba) >> 24);
-
- rt_out8(IO + ATA_REG_COMMAND, ATA_CMD_WRITE_PIO);
-
- while (!(rt_in8(IO + ATA_REG_STATUS) & ATA_SR_DRQ));
-
- for (SizeT IndexOff = 0; IndexOff < Size; IndexOff += 2) {
- drv_pio_std_wait_io(IO);
-
- UInt8 low = (UInt8)Buf[IndexOff];
- UInt8 high = (IndexOff + 1 < Size) ? (UInt8)Buf[IndexOff + 1] : 0;
- UInt16 packed = (high << 8) | low;
-
- rt_out16(IO + ATA_REG_DATA, packed);
- }
-}
-
-/// @brief is ATA detected?
-Boolean drv_pio_std_detected(Void) {
- return kATADetected;
-}
-
-/***
- @brief Getter, gets the number of sectors inside the drive.
- */
-SizeT drv_pio_get_sector_count() {
- return (kATAIdentifyData[61] << 16) | kATAIdentifyData[60];
-}
-
-/// @brief Get the drive size.
-SizeT drv_pio_get_size() {
- return (drv_pio_get_sector_count()) * kATASectorSize;
-}
-
-namespace Kernel {
-/// @brief Initialize an PIO device (StorageKit function)
-/// @param is_master is the current PIO master?
-/// @return [io:master] for PIO device.
-BOOL sk_init_ata_device(BOOL is_master, UInt16& io, UInt8& master) {
- return drv_pio_std_init(ATA_SECONDARY_IO, is_master, io, master);
-}
-
-/// @brief Implementation details namespace.
-namespace Detail {
- /// @brief Read PIO device.
- /// @param self device
- /// @param mnt mounted disk.
- STATIC Void sk_io_read_pio(IDeviceObject<MountpointInterface*>* self, MountpointInterface* mnt) {
- ATADeviceInterface* dev = (ATADeviceInterface*) self;
-
- err_global_get() = kErrorDisk;
-
- if (!dev) return;
-
- auto disk = mnt->GetAddressOf(dev->GetIndex());
-
- if (!disk) return;
-
- err_global_get() = kErrorSuccess;
-
- drv_pio_std_read(disk->fPacket.fPacketLba, dev->GetIO(), dev->GetMaster(),
- (Char*) disk->fPacket.fPacketContent, kATASectorSize,
- disk->fPacket.fPacketSize);
- }
-
- /// @brief Write PIO device.
- /// @param self device
- /// @param mnt mounted disk.
- STATIC Void sk_io_write_pio(IDeviceObject<MountpointInterface*>* self, MountpointInterface* mnt) {
- ATADeviceInterface* dev = (ATADeviceInterface*) self;
-
- err_global_get() = kErrorDisk;
-
- if (!dev) return;
-
- auto disk = mnt->GetAddressOf(dev->GetIndex());
-
- if (!disk) return;
-
- err_global_get() = kErrorSuccess;
-
- drv_pio_std_write(disk->fPacket.fPacketLba, dev->GetIO(), dev->GetMaster(),
- (Char*) disk->fPacket.fPacketContent, kATASectorSize,
- disk->fPacket.fPacketSize);
- }
-} // namespace Detail
-
-/// @brief Acquires a new PIO device with drv_index in mind.
-/// @param drv_index The drive index to assign.
-/// @return A wrapped device interface if successful, or error code.
-ErrorOr<ATADeviceInterface> sk_acquire_ata_device(Int32 drv_index) {
- /// here we don't check if we probed ATA, since we'd need to grab IO after that.
- ATADeviceInterface device(Detail::sk_io_read_pio, Detail::sk_io_write_pio);
-
- device.SetIndex(drv_index);
-
- return ErrorOr<ATADeviceInterface>(device);
-}
-} // namespace Kernel
-
-#ifdef __ATA_PIO__
-
-Void drv_std_read(UInt64 Lba, UInt16 IO, UInt8 Master, Char* Buf, SizeT SectorSz, SizeT Size) {
- drv_pio_std_read(Lba, IO, Master, Buf, SectorSz, Size);
-}
-
-Void drv_std_write(UInt64 Lba, UInt16 IO, UInt8 Master, Char* Buf, SizeT SectorSz, SizeT Size) {
- drv_pio_std_write(Lba, IO, Master, Buf, SectorSz, Size);
-}
-
-SizeT drv_std_get_size() {
- return drv_pio_get_size();
-}
-
-SizeT drv_std_get_sector_count() {
- return drv_pio_get_sector_count();
-}
-
-Boolean drv_std_init(UInt16 Bus, UInt8 Drive, UInt16& OutBus, UInt8& OutMaster) {
- return drv_pio_std_init(Bus, Drive, OutBus, OutMaster);
-}
-
-#endif
-
-#endif \ No newline at end of file
diff --git a/dev/kernel/HALKit/AMD64/Storage/PIO+Generic.cc b/dev/kernel/HALKit/AMD64/Storage/PIO+Generic.cc
index aec21ee4..dd6b9aea 100644
--- a/dev/kernel/HALKit/AMD64/Storage/PIO+Generic.cc
+++ b/dev/kernel/HALKit/AMD64/Storage/PIO+Generic.cc
@@ -15,6 +15,8 @@
*
*/
+#if 0
+
#include <ArchKit/ArchKit.h>
#include <KernelKit/DriveMgr.h>
#include <StorageKit/ATA.h>
@@ -49,7 +51,7 @@ ATAWaitForIO_Retry2:
return true;
}
-static Void drv_pio_std_select(UInt16 Bus) {
+STATIC Void drv_pio_std_select(UInt16 Bus) {
if (Bus == ATA_PRIMARY_IO)
rt_out8(Bus + ATA_REG_HDDEVSEL, ATA_PRIMARY_SEL);
else
@@ -79,15 +81,18 @@ ATAInit_Retry:
OutBus = (Bus == ATA_PRIMARY_IO) ? ATA_PRIMARY_IO : ATA_SECONDARY_IO;
OutMaster = (Bus == ATA_PRIMARY_IO) ? ATA_MASTER : ATA_SLAVE;
+ drv_pio_std_select(IO);
+
rt_out8(OutBus + ATA_REG_COMMAND, ATA_CMD_IDENTIFY);
- drv_pio_std_wait_io(IO);
+ while (!(rt_in8(IO + ATA_REG_STATUS) & ATA_SR_DRQ));
+
/// fetch serial info
/// model, speed, number of sectors...
for (SizeT i = 0ul; i < kATADataLen; ++i) {
- kATAIdentifyData[i] = HAL::rt_in16(OutBus + ATA_REG_DATA);
+ kATAIdentifyData[i] = rt_in16(OutBus + ATA_REG_DATA);
}
for (Int32 i = 0; i < 20; i++) {
@@ -99,10 +104,6 @@ ATAInit_Retry:
(Void)(kout << "Drive Model: " << kATADiskModel << kendl);
- // Why? the current disk driver writes whole word instead of a single byte (expected btw) so i'm
- // planning to finish +Next drivers for 0.0.3
- ke_panic(RUNTIME_CHECK_INVALID, "PIO driver is currently being reworked.");
-
return true;
}
@@ -118,16 +119,22 @@ Void drv_pio_std_read(UInt64 Lba, UInt16 IO, UInt8 Master, Char* Buf, SizeT Sect
rt_out8(IO + ATA_REG_SEC_COUNT0, ((Size + SectorSz) / SectorSz));
- rt_out8(IO + ATA_REG_LBA0, (Lba) &0xFF);
+ rt_out8(IO + ATA_REG_LBA0, (Lba) & 0xFF);
rt_out8(IO + ATA_REG_LBA1, (Lba) >> 8);
rt_out8(IO + ATA_REG_LBA2, (Lba) >> 16);
rt_out8(IO + ATA_REG_LBA3, (Lba) >> 24);
rt_out8(IO + ATA_REG_COMMAND, ATA_CMD_READ_PIO);
- for (SizeT IndexOff = 0; IndexOff < Size; ++IndexOff) {
+ while (!(rt_in8(IO + ATA_REG_STATUS) & ATA_SR_DRQ));
+
+ for (SizeT IndexOff = 0; IndexOff < Size; IndexOff += 2) {
drv_pio_std_wait_io(IO);
- Buf[IndexOff] = HAL::rt_in16(IO + ATA_REG_DATA);
+
+ auto in = rt_in16(IO + ATA_REG_DATA);
+
+ Buf[IndexOff] = in & 0xFF;
+ Buf[IndexOff + 1] = (in >> 8) & 0xFF;
}
}
@@ -143,16 +150,23 @@ Void drv_pio_std_write(UInt64 Lba, UInt16 IO, UInt8 Master, Char* Buf, SizeT Sec
rt_out8(IO + ATA_REG_SEC_COUNT0, ((Size + SectorSz) / SectorSz));
- rt_out8(IO + ATA_REG_LBA0, (Lba) &0xFF);
+ rt_out8(IO + ATA_REG_LBA0, (Lba) & 0xFF);
rt_out8(IO + ATA_REG_LBA1, (Lba) >> 8);
rt_out8(IO + ATA_REG_LBA2, (Lba) >> 16);
rt_out8(IO + ATA_REG_LBA3, (Lba) >> 24);
rt_out8(IO + ATA_REG_COMMAND, ATA_CMD_WRITE_PIO);
- for (SizeT IndexOff = 0; IndexOff < Size; ++IndexOff) {
+ while (!(rt_in8(IO + ATA_REG_STATUS) & ATA_SR_DRQ));
+
+ for (SizeT IndexOff = 0; IndexOff < Size; IndexOff += 2) {
drv_pio_std_wait_io(IO);
- rt_out16(IO + ATA_REG_DATA, Buf[IndexOff]);
+
+ UInt8 low = (UInt8)Buf[IndexOff];
+ UInt8 high = (IndexOff + 1 < Size) ? (UInt8)Buf[IndexOff + 1] : 0;
+ UInt16 packed = (high << 8) | low;
+
+ rt_out16(IO + ATA_REG_DATA, packed);
}
}
@@ -261,4 +275,6 @@ Boolean drv_std_init(UInt16 Bus, UInt8 Drive, UInt16& OutBus, UInt8& OutMaster)
return drv_pio_std_init(Bus, Drive, OutBus, OutMaster);
}
+#endif
+
#endif \ No newline at end of file