@@ -2511,6 +2524,11 @@ static uint32_t ide_data_readw(void *opaque, uint32_t
addr)
IDEState *s = ((IDEState *)opaque)->cur_drive;
uint8_t *p;
int ret;
+
+ /* PIO data access allowed only when DRQ bit is set */
+ if (!(s->status & DRQ_STAT))
+ return;
p = s->data_ptr;
ret = cpu_to_le16(*(uint16_t *)p);
p += 2;
@@ -2525,6 +2543,10 @@ static void ide_data_writel(void *opaque, uint32_t addr,
uint32_t val)
IDEState *s = ((IDEState *)opaque)->cur_drive;
uint8_t *p;
+ /* PIO data access allowed only when DRQ bit is set */
+ if (!(s->status & DRQ_STAT))
+ return;
+
p = s->data_ptr;
*(uint32_t *)p = le32_to_cpu(val);
p += 4;
@@ -2539,6 +2561,10 @@ static uint32_t ide_data_readl(void *opaque, uint32_t
addr)
uint8_t *p;
int ret;
+ /* PIO data access allowed only when DRQ bit is set */
+ if (!(s->status & DRQ_STAT))
+ return;