[IA64-SGI] fix unaligned memory access in snsc_event.c
It's been pointed out that environmental events from the system controllers on Altix machines cause the kernel to complain about unaligned memory accesses. This turns out to be because "be32_to_cpup()" didn't do everything I thought/hoped it did. I've added calls to pull the offending integers out of the buffers using get_unaligned() before feeding them to be32_to_cpup(). Signed-off-by: Greg Howard <ghoward@sgi.com> Signed-off-by: Tony Luck <tony.luck@intel.com>
This commit is contained in:
parent
2ba84684e8
commit
1a402aaca5
1 changed files with 8 additions and 3 deletions
|
@ -19,6 +19,7 @@
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/byteorder/generic.h>
|
#include <linux/byteorder/generic.h>
|
||||||
#include <asm/sn/sn_sal.h>
|
#include <asm/sn/sn_sal.h>
|
||||||
|
#include <asm/unaligned.h>
|
||||||
#include "snsc.h"
|
#include "snsc.h"
|
||||||
|
|
||||||
static struct subch_data_s *event_sd;
|
static struct subch_data_s *event_sd;
|
||||||
|
@ -62,13 +63,16 @@ static int
|
||||||
scdrv_parse_event(char *event, int *src, int *code, int *esp_code, char *desc)
|
scdrv_parse_event(char *event, int *src, int *code, int *esp_code, char *desc)
|
||||||
{
|
{
|
||||||
char *desc_end;
|
char *desc_end;
|
||||||
|
__be32 from_buf;
|
||||||
|
|
||||||
/* record event source address */
|
/* record event source address */
|
||||||
*src = be32_to_cpup((__be32 *)event);
|
from_buf = get_unaligned((__be32 *)event);
|
||||||
|
*src = be32_to_cpup(&from_buf);
|
||||||
event += 4; /* move on to event code */
|
event += 4; /* move on to event code */
|
||||||
|
|
||||||
/* record the system controller's event code */
|
/* record the system controller's event code */
|
||||||
*code = be32_to_cpup((__be32 *)event);
|
from_buf = get_unaligned((__be32 *)event);
|
||||||
|
*code = be32_to_cpup(&from_buf);
|
||||||
event += 4; /* move on to event arguments */
|
event += 4; /* move on to event arguments */
|
||||||
|
|
||||||
/* how many arguments are in the packet? */
|
/* how many arguments are in the packet? */
|
||||||
|
@ -82,7 +86,8 @@ scdrv_parse_event(char *event, int *src, int *code, int *esp_code, char *desc)
|
||||||
/* not an integer argument, so give up */
|
/* not an integer argument, so give up */
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
*esp_code = be32_to_cpup((__be32 *)event);
|
from_buf = get_unaligned((__be32 *)event);
|
||||||
|
*esp_code = be32_to_cpup(&from_buf);
|
||||||
event += 4;
|
event += 4;
|
||||||
|
|
||||||
/* parse out the event description */
|
/* parse out the event description */
|
||||||
|
|
Loading…
Reference in a new issue