mirror of
https://github.com/torvalds/linux.git
synced 2024-11-02 10:11:36 +00:00
[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>
This commit is contained in:
parent
d2212bc7db
commit
705747ab87
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user