summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@sunset.davemloft.net>2005-09-28 16:48:40 -0700
committerDavid S. Miller <davem@sunset.davemloft.net>2005-09-28 16:48:40 -0700
commit705747ab87c96f1b4b8e73ba617c323d9087f6ac (patch)
treeefef5a442b2cccd76f94ae6cf3848519043e742d
parentd2212bc7db13268bef0799d9ff4b2e511c284885 (diff)
downloadlinux-705747ab87c96f1b4b8e73ba617c323d9087f6ac.tar.gz
linux-705747ab87c96f1b4b8e73ba617c323d9087f6ac.tar.bz2
linux-705747ab87c96f1b4b8e73ba617c323d9087f6ac.zip
[SPARC64]: Fix bug in unaligned load endianness swapping
The in-memory value was being swapped, not the value we loaded into the register. Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--arch/sparc64/kernel/unaligned.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/arch/sparc64/kernel/unaligned.c b/arch/sparc64/kernel/unaligned.c
index 42718f6a7d36..02af08ffec8f 100644
--- a/arch/sparc64/kernel/unaligned.c
+++ b/arch/sparc64/kernel/unaligned.c
@@ -294,7 +294,7 @@ asmlinkage void kernel_unaligned_trap(struct pt_regs *regs, unsigned int insn, u
kernel_mna_trap_fault();
} else {
- unsigned long addr;
+ unsigned long addr, *reg_addr;
int orig_asi, asi;
addr = compute_effective_address(regs, insn,
@@ -319,11 +319,11 @@ asmlinkage void kernel_unaligned_trap(struct pt_regs *regs, unsigned int insn, u
};
switch (dir) {
case load:
- do_int_load(fetch_reg_addr(((insn>>25)&0x1f), regs),
- size, (unsigned long *) addr,
+ reg_addr = fetch_reg_addr(((insn>>25)&0x1f), regs);
+ do_int_load(reg_addr, size, (unsigned long *) addr,
decode_signedness(insn), asi);
if (unlikely(asi != orig_asi)) {
- unsigned long val_in = *(unsigned long *) addr;
+ unsigned long val_in = *reg_addr;
switch (size) {
case 2:
val_in = swab16(val_in);
@@ -339,7 +339,7 @@ asmlinkage void kernel_unaligned_trap(struct pt_regs *regs, unsigned int insn, u
BUG();
break;
};
- *(unsigned long *) addr = val_in;
+ *reg_addr = val_in;
}
break;