From ebd17d6f5134c6fc8087bfc0699e17e16420f05a Mon Sep 17 00:00:00 2001 From: Vladimir 'phcoder' Serbinenko Date: Wed, 29 Feb 2012 12:45:32 +0100 Subject: [PATCH] * grub-core/disk/pata.c (grub_pata_readwrite): Fix ATAPI protocol error. --- ChangeLog | 4 ++++ grub-core/disk/pata.c | 11 ++++++----- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 06c934255..c4b1ae4c8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2012-02-29 Vladimir Serbinenko + + * grub-core/disk/pata.c (grub_pata_readwrite): Fix ATAPI protocol error. + 2012-02-28 Vladimir Serbinenko Fix make dist. diff --git a/grub-core/disk/pata.c b/grub-core/disk/pata.c index 089059d10..5fc11ee91 100644 --- a/grub-core/disk/pata.c +++ b/grub-core/disk/pata.c @@ -203,11 +203,8 @@ grub_pata_readwrite (struct grub_ata *disk, /* Transfer data. */ while (nread < parms->size - && ((sts & (GRUB_ATA_STATUS_DRQ | GRUB_ATA_STATUS_ERR)) - == GRUB_ATA_STATUS_DRQ) - && (!parms->cmdsize - || ((grub_pata_regget (dev, GRUB_ATAPI_REG_IREASON) - & GRUB_ATAPI_IREASON_MASK) == GRUB_ATAPI_IREASON_DATA_IN))) + && (sts & (GRUB_ATA_STATUS_DRQ | GRUB_ATA_STATUS_ERR)) + == GRUB_ATA_STATUS_DRQ) { unsigned cnt; @@ -217,6 +214,10 @@ grub_pata_readwrite (struct grub_ata *disk, if (parms->cmdsize) { + if ((grub_pata_regget (dev, GRUB_ATAPI_REG_IREASON) + & GRUB_ATAPI_IREASON_MASK) != GRUB_ATAPI_IREASON_DATA_IN) + return grub_error (GRUB_ERR_READ_ERROR, "ATAPI protocol error"); + cnt = grub_pata_regget (dev, GRUB_ATAPI_REG_CNTHIGH) << 8 | grub_pata_regget (dev, GRUB_ATAPI_REG_CNTLOW); grub_dprintf("pata", "DRQ count=%u\n", cnt);