Fix error handling in ATA PIO
diff --git a/src/kernel/dri/ata_pio/ata_pio.c b/src/kernel/dri/ata_pio/ata_pio.c
index cd426ef..54db487 100644
--- a/src/kernel/dri/ata_pio/ata_pio.c
+++ b/src/kernel/dri/ata_pio/ata_pio.c
@@ -39,17 +39,27 @@
 
 void ata_pio_read_sectors(void *buffer, uint lba, uchar num_sectors)
 {
-	ata_pio_wait_bsy();
+	ushort *word_buffer = buffer;
 
+	ata_pio_wait_bsy();
 	ata_pio_send_init(lba, num_sectors);
 	outb(ATA_PORT_CMD, ATA_CMD_READ);
 
 	ata_pio_wait_bsy();
+	
+	if (inb(ATA_PORT_CMD) & ATA_ERR)
+	{
+		kprintf(ERROR "ATA_ERR on read\n");
+		kpanic("Failed to read");
+	}
 
-	asm volatile("rep insw" ::"c"(num_sectors * 256), "d"(ATA_PORT_DATA),
-				 "D"(buffer));
+	for (int i = 0; i < num_sectors * 256; i++)
+	{
+		word_buffer[i] = inw(ATA_PORT_DATA);
+	}
 
 	ata_pio_wait_bsy();
+	outw(ATA_PORT_CMD, ATA_CMD_FLUSH_CACHE);
 }
 
 void ata_pio_write_sectors(uint lba, uchar num_sectors, ushort *buffer)
@@ -65,6 +75,9 @@
 	{
 		outw(ATA_PORT_DATA, buffer[i]);
 	}
+
+	ata_pio_wait_bsy();
+	outw(ATA_PORT_CMD, ATA_CMD_FLUSH_CACHE);
 }
 
 static void print_buffer()