lib: sbi: Fix sign-extension in sbi_misaligned_load_handler()
authorAnup Patel <anup.patel@wdc.com>
Sat, 19 Dec 2020 12:09:57 +0000 (17:39 +0530)
committerAnup Patel <anup@brainfault.org>
Thu, 24 Dec 2020 11:05:28 +0000 (16:35 +0530)
The misaligned load emulation does not sign-extend values correctly
due to missing sign typecast in value passed to the SET_RD() macro.

A very easy way to reproduce this issue is to load 16-bit value
0xff1e from a byte aligned address using LH instruction on hardware
lacking misaligned load/store.

This patch fixes sbi_misaligned_load_handler() for above issue.

Signed-off-by: Anup Patel <anup.patel@wdc.com>
Reviewed-by: Atish Patra <atish.patra@wdc.com>
lib/sbi/sbi_misaligned_ldst.c

index 964a372..5057cb5 100644 (file)
@@ -128,7 +128,7 @@ int sbi_misaligned_load_handler(ulong addr, ulong tval2, ulong tinst,
        }
 
        if (!fp)
-               SET_RD(insn, regs, val.data_ulong << shift >> shift);
+               SET_RD(insn, regs, ((long)(val.data_ulong << shift)) >> shift);
 #ifdef __riscv_flen
        else if (len == 8)
                SET_F64_RD(insn, regs, val.data_u64);