--- grub-0.95/grub/asmstub.c.odirect	2004-11-30 16:58:06.577019488 -0500
+++ grub-0.95/grub/asmstub.c	2004-11-30 16:59:56.057375944 -0500
@@ -53,6 +53,9 @@
 # ifndef BLKFLSBUF
 #  define BLKFLSBUF	_IO (0x12,97)	/* flush buffer cache */
 # endif /* ! BLKFLSBUF */
+# ifndef O_DIRECT
+#   define O_DIRECT 040000
+# endif /* ! O_DIRECT */
 #endif /* __linux__ */
 
 /* We want to prevent any circularararity in our stubs, as well as
@@ -764,7 +767,7 @@
     {
       /* The unpartitioned device name: /dev/XdX */
       char *devname = device_map[drive];
-      char buf[512];
+      char * buf, * buf_unaligned;
 
       if (! devname)
 	return -1;
@@ -775,13 +778,13 @@
 
       /* Open read/write, or read-only if that failed. */
       if (! read_only)
-	disks[drive].flags = open (devname, O_RDWR);
+	disks[drive].flags = open (devname, O_RDWR | O_DIRECT);
 
       if (disks[drive].flags == -1)
 	{
 	  if (read_only || errno == EACCES || errno == EROFS || errno == EPERM)
 	    {
-	      disks[drive].flags = open (devname, O_RDONLY);
+	      disks[drive].flags = open (devname, O_RDONLY | O_DIRECT);
 	      if (disks[drive].flags == -1)
 		{
 		  assign_device_name (drive, 0);
@@ -795,6 +798,10 @@
 	    }
 	}
 
+      buf_unaligned = malloc((512 * sizeof(char)) + 4095);
+      buf = (char *) (((unsigned long)buf_unaligned + 4096 - 1) &
+                      (~(4096-1)));
+
       /* Attempt to read the first sector.  */
       if (read (disks[drive].flags, buf, 512) != 512)
 	{
@@ -806,6 +813,7 @@
 
       if (disks[drive].flags != -1)
 	get_drive_geometry (&disks[drive], device_map, drive);
+      free(buf_unaligned);
     }
 
   if (disks[drive].flags == -1)
@@ -827,24 +835,34 @@
 nread (int fd, char *buf, size_t len)
 {
   int size = len;
+  char * buf_unaligned, * buff, * obuff;
+  int ret;
+
+  buf_unaligned = malloc((len * sizeof(char)) + 4095);
+  obuff = buff = (char *) (((unsigned long)buf_unaligned + 4096 - 1) &
+                           (~(4096-1)));
+
 
   while (len)
     {
-      int ret = read (fd, buf, len);
+      ret = read (fd, buff, len);
 
       if (ret <= 0)
 	{
 	  if (errno == EINTR)
 	    continue;
 	  else
-	    return ret;
+            break;
 	}
 
       len -= ret;
-      buf += ret;
+      buff += ret;
     }
 
-  return size;
+  if (!len) ret = size;
+
+  buf = memcpy(buf, obuff, size);
+  return ret;
 }
 
 /* Write LEN bytes from BUF to FD. Return less than or equal to zero if an
@@ -853,10 +871,18 @@
 nwrite (int fd, char *buf, size_t len)
 {
   int size = len;
+  char * buf_unaligned, * buff;
+
+  buf_unaligned = malloc((len * sizeof(char)) + 4095);
+  buff = (char *) (((unsigned long)buf_unaligned + 4096 - 1) &
+                   (~(4096-1)));
 
   while (len)
     {
-      int ret = write (fd, buf, len);
+      int ret;
+
+      memcpy(buff, buf, len);
+      ret = write (fd, buff, len);
 
       if (ret <= 0)
 	{
