diff options
| author | James Bottomley <James.Bottomley@HansenPartnership.com> | 2008-08-22 17:15:22 -0400 |
|---|---|---|
| committer | Tony Luck <tony.luck@intel.com> | 2008-08-25 14:23:13 -0400 |
| commit | 8a549f8b581db95fec1e2d86ff857594fcfcd9db (patch) | |
| tree | dbf33ff8ee4c20ba7737c2968d5c7188bc3c4dff | |
| parent | 42aca483ddee8888926d913b660e1dd38d748ba9 (diff) | |
[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: Nishanth Aravamudan <nacc@us.ibm.com>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
Signed-off-by: Tony Luck <tony.luck@intel.com>
| -rw-r--r-- | arch/ia64/include/asm/io.h | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/arch/ia64/include/asm/io.h b/arch/ia64/include/asm/io.h index 260a85ac9d6a..7f257507cd86 100644 --- a/arch/ia64/include/asm/io.h +++ b/arch/ia64/include/asm/io.h | |||
| @@ -19,6 +19,8 @@ | |||
| 19 | * Copyright (C) 1999 Don Dugger <don.dugger@intel.com> | 19 | * Copyright (C) 1999 Don Dugger <don.dugger@intel.com> |
| 20 | */ | 20 | */ |
| 21 | 21 | ||
| 22 | #include <asm/unaligned.h> | ||
| 23 | |||
| 22 | /* We don't use IO slowdowns on the ia64, but.. */ | 24 | /* We don't use IO slowdowns on the ia64, but.. */ |
| 23 | #define __SLOW_DOWN_IO do { } while (0) | 25 | #define __SLOW_DOWN_IO do { } while (0) |
| 24 | #define SLOW_DOWN_IO do { } while (0) | 26 | #define SLOW_DOWN_IO do { } while (0) |
| @@ -241,7 +243,7 @@ __insw (unsigned long port, void *dst, unsigned long count) | |||
| 241 | unsigned short *dp = dst; | 243 | unsigned short *dp = dst; |
| 242 | 244 | ||
| 243 | while (count--) | 245 | while (count--) |
| 244 | *dp++ = platform_inw(port); | 246 | put_unaligned(platform_inw(port), dp++); |
| 245 | } | 247 | } |
| 246 | 248 | ||
| 247 | static inline void | 249 | static inline void |
| @@ -250,7 +252,7 @@ __insl (unsigned long port, void *dst, unsigned long count) | |||
| 250 | unsigned int *dp = dst; | 252 | unsigned int *dp = dst; |
| 251 | 253 | ||
| 252 | while (count--) | 254 | while (count--) |
| 253 | *dp++ = platform_inl(port); | 255 | put_unaligned(platform_inl(port), dp++); |
| 254 | } | 256 | } |
| 255 | 257 | ||
| 256 | static inline void | 258 | static inline void |
| @@ -268,7 +270,7 @@ __outsw (unsigned long port, const void *src, unsigned long count) | |||
| 268 | const unsigned short *sp = src; | 270 | const unsigned short *sp = src; |
| 269 | 271 | ||
| 270 | while (count--) | 272 | while (count--) |
| 271 | platform_outw(*sp++, port); | 273 | platform_outw(get_unaligned(sp++), port); |
| 272 | } | 274 | } |
| 273 | 275 | ||
| 274 | static inline void | 276 | static inline void |
| @@ -277,7 +279,7 @@ __outsl (unsigned long port, const void *src, unsigned long count) | |||
| 277 | const unsigned int *sp = src; | 279 | const unsigned int *sp = src; |
| 278 | 280 | ||
| 279 | while (count--) | 281 | while (count--) |
| 280 | platform_outl(*sp++, port); | 282 | platform_outl(get_unaligned(sp++), port); |
| 281 | } | 283 | } |
| 282 | 284 | ||
| 283 | /* | 285 | /* |
