Commit 8a549f8b authored by James Bottomley's avatar James Bottomley Committed by Tony Luck

[IA64] Fix __{in,out}s{w,l} to handle unaligned data

Some ia64 systems produce several repeats of kernel messages like this:

 kernel unaligned access to 0xe000000644220466, ip=0xa000000100516fa1

This was tracked to ide code using the __cmd[] field in "struct request"
via the __outsw() function.  __cmd[] is a char array, so is not guaranteed
to be properly aligned when accessed as words.
Tested-by: default avatarNishanth Aravamudan <nacc@us.ibm.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@HansenPartnership.com>
Signed-off-by: default avatarTony Luck <tony.luck@intel.com>
parent 42aca483
...@@ -19,6 +19,8 @@ ...@@ -19,6 +19,8 @@
* Copyright (C) 1999 Don Dugger <don.dugger@intel.com> * Copyright (C) 1999 Don Dugger <don.dugger@intel.com>
*/ */
#include <asm/unaligned.h>
/* We don't use IO slowdowns on the ia64, but.. */ /* We don't use IO slowdowns on the ia64, but.. */
#define __SLOW_DOWN_IO do { } while (0) #define __SLOW_DOWN_IO do { } while (0)
#define SLOW_DOWN_IO do { } while (0) #define SLOW_DOWN_IO do { } while (0)
...@@ -241,7 +243,7 @@ __insw (unsigned long port, void *dst, unsigned long count) ...@@ -241,7 +243,7 @@ __insw (unsigned long port, void *dst, unsigned long count)
unsigned short *dp = dst; unsigned short *dp = dst;
while (count--) while (count--)
*dp++ = platform_inw(port); put_unaligned(platform_inw(port), dp++);
} }
static inline void static inline void
...@@ -250,7 +252,7 @@ __insl (unsigned long port, void *dst, unsigned long count) ...@@ -250,7 +252,7 @@ __insl (unsigned long port, void *dst, unsigned long count)
unsigned int *dp = dst; unsigned int *dp = dst;
while (count--) while (count--)
*dp++ = platform_inl(port); put_unaligned(platform_inl(port), dp++);
} }
static inline void static inline void
...@@ -268,7 +270,7 @@ __outsw (unsigned long port, const void *src, unsigned long count) ...@@ -268,7 +270,7 @@ __outsw (unsigned long port, const void *src, unsigned long count)
const unsigned short *sp = src; const unsigned short *sp = src;
while (count--) while (count--)
platform_outw(*sp++, port); platform_outw(get_unaligned(sp++), port);
} }
static inline void static inline void
...@@ -277,7 +279,7 @@ __outsl (unsigned long port, const void *src, unsigned long count) ...@@ -277,7 +279,7 @@ __outsl (unsigned long port, const void *src, unsigned long count)
const unsigned int *sp = src; const unsigned int *sp = src;
while (count--) while (count--)
platform_outl(*sp++, port); platform_outl(get_unaligned(sp++), port);
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment