Optimize ATA PIO routines
diff --git a/include/kernel/dri/ata_pio/ata_pio.h b/include/kernel/dri/ata_pio/ata_pio.h
index acd7667..c509f52 100644
--- a/include/kernel/dri/ata_pio/ata_pio.h
+++ b/include/kernel/dri/ata_pio/ata_pio.h
@@ -40,7 +40,8 @@
void ata_pio_wait_bsy();
void ata_pio_wait_drq();
-void ata_pio_read_sectors(uchar *buffer, uint lba, uchar num_sectors);
-void ata_pio_write_sectors(uint lba, uchar num_sectors, uchar *buffer);
+void ata_pio_read_sectors(void *buffer, uint lba, uchar num_sectors);
+void ata_pio_write_sectors(uint lba, uchar num_sectors, void *buffer);
+uint ata_pio_get_error();
void test_ata_pio();
diff --git a/src/kernel/dri/ata_pio/ata_pio.c b/src/kernel/dri/ata_pio/ata_pio.c
index a8ec300..b33ee20 100644
--- a/src/kernel/dri/ata_pio/ata_pio.c
+++ b/src/kernel/dri/ata_pio/ata_pio.c
@@ -17,6 +17,11 @@
{}
}
+uint ata_pio_get_error()
+{
+
+}
+
static void ata_pio_send_init(uint lba, uchar num_sectors)
{
outb(ATA_PORT_DRIVE_SEL, 0xe0 | (lba >> 24));
@@ -26,44 +31,42 @@
outb(ATA_PORT_LBA_HIGH, (lba >> 16) & 0xff);
}
-void ata_pio_read_sectors(uchar *buffer, uint lba, uchar num_sectors)
+void ata_pio_read_sectors(void *buffer, uint lba, uchar num_sectors)
{
ata_pio_wait_bsy();
ata_pio_send_init(lba, num_sectors);
outb(ATA_PORT_CMD, ATA_CMD_READ);
- for (int i = 0; i < num_sectors; i++)
- {
- ata_pio_wait_bsy();
- ata_pio_wait_drq();
+ ata_pio_wait_bsy();
- for (int j = 0; j < 256; j++)
- buffer[i * 256 + j] = inb(ATA_PORT_DATA);
- }
+ asm volatile("rep insw" ::
+ "c"(num_sectors * 256),
+ "d"(ATA_PORT_DATA),
+ "D"(buffer));
+
+ ata_pio_wait_bsy();
}
-void ata_pio_write_sectors(uint lba, uchar num_sectors, uchar *buffer)
+void ata_pio_write_sectors(uint lba, uchar num_sectors, void *buffer)
{
ata_pio_wait_bsy();
ata_pio_send_init(lba, num_sectors);
outb(ATA_PORT_CMD, ATA_CMD_WRITE);
- for (int i = 0; i < num_sectors; i++)
- {
- ata_pio_wait_bsy();
- ata_pio_wait_drq();
+ ata_pio_wait_bsy();
- for (int j = 0; j < 256; j++)
- outb(ATA_PORT_DATA, buffer[i * 256 + j]);
- }
+ asm volatile("rep outsw" ::
+ "c"(num_sectors * 256),
+ "d"(ATA_PORT_DATA),
+ "S"(buffer));
}
void test_ata_pio()
{
kprintf("Going to ata_pio_read_sectors\n");
- ata_pio_read_sectors(test_buffer, 0, 4);
+ ata_pio_read_sectors(test_buffer, 0, 1);
for (int i = 0; i < 256 * 4; i += 64)
kprintf("Byte %d = %d\n", test_buffer[i]);