Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 705747ab authored by David S. Miller's avatar David S. Miller
Browse files

[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: default avatarDavid S. Miller <davem@davemloft.net>
parent d2212bc7
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -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;