]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
* grub-core/disk/pata.c (grub_pata_pio_read): Handle unaligned buffer.
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Tue, 13 Dec 2011 14:55:36 +0000 (15:55 +0100)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Tue, 13 Dec 2011 14:55:36 +0000 (15:55 +0100)
(grub_pata_pio_write): Likewise.

ChangeLog
grub-core/disk/pata.c

index f62cc0ba60930f0d707cd8adbbae9d875f4b3549..06572f7a929e5d3e3cfc7be256a48f6ed2b0b9a6 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2011-12-13  Vladimir Serbinenko  <phcoder@gmail.com>
+
+       * grub-core/disk/pata.c (grub_pata_pio_read): Handle unaligned buffer.
+       (grub_pata_pio_write): Likewise.
+
 2011-12-13  Vladimir Serbinenko  <phcoder@gmail.com>
 
        Add noreturn attributes and remove unreachable code.
index c54fe91ab148fc81bf4d2e96ac1565bdba448c84..ff76cc1fb1363667154aa65768a2d3ad50b4cce2 100644 (file)
@@ -116,12 +116,13 @@ grub_pata_wait (void)
 static void
 grub_pata_pio_read (struct grub_pata_device *dev, char *buf, grub_size_t size)
 { 
-  grub_uint16_t *buf16 = (grub_uint16_t *) buf;
   unsigned int i;
 
   /* Read in the data, word by word.  */
   for (i = 0; i < size / 2; i++)
-    buf16[i] = grub_le_to_cpu16 (grub_inw(dev->ioaddress + GRUB_ATA_REG_DATA));
+    grub_set_unaligned16 (buf + 2 * i,
+                         grub_le_to_cpu16 (grub_inw(dev->ioaddress
+                                                    + GRUB_ATA_REG_DATA)));
   if (size & 1)
     buf[size - 1] = (char) grub_le_to_cpu16 (grub_inw (dev->ioaddress
                                                       + GRUB_ATA_REG_DATA));
@@ -130,12 +131,11 @@ grub_pata_pio_read (struct grub_pata_device *dev, char *buf, grub_size_t size)
 static void
 grub_pata_pio_write (struct grub_pata_device *dev, char *buf, grub_size_t size)
 {
-  grub_uint16_t *buf16 = (grub_uint16_t *) buf;
   unsigned int i;
 
   /* Write the data, word by word.  */
   for (i = 0; i < size / 2; i++)
-    grub_outw(grub_cpu_to_le16 (buf16[i]), dev->ioaddress + GRUB_ATA_REG_DATA);
+    grub_outw(grub_cpu_to_le16 (grub_get_unaligned16 (buf + 2 * i)), dev->ioaddress + GRUB_ATA_REG_DATA);
 }
 
 /* ATA pass through support, used by hdparm.mod.  */