Skip to content

Commit f81393a

Browse files
xhackerustcpalmer-dabbelt
authored andcommitted
riscv: extable: fix err reg writing in dedicated uaccess handler
Mayuresh reported commit 20802d8 ("riscv: extable: add a dedicated uaccess handler") breaks the writev02 test case in LTP. This is due to the err reg isn't correctly set with the errno(-EFAULT in writev02 case). First of all, the err and zero regs are reg numbers rather than reg offsets in struct pt_regs; Secondly, regs_set_gpr() should write the regs when offset isn't zero(zero means epc) Fix it by correcting regs_set_gpr() logic and passing the correct reg offset to it. Reported-by: Mayuresh Chitale <[email protected]> Fixes: 20802d8 ("riscv: extable: add a dedicated uaccess handler") Signed-off-by: Jisheng Zhang <[email protected]> Cc: [email protected] Signed-off-by: Palmer Dabbelt <[email protected]>
1 parent ca0cb9a commit f81393a

File tree

1 file changed

+3
-3
lines changed

1 file changed

+3
-3
lines changed

arch/riscv/mm/extable.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ static inline void regs_set_gpr(struct pt_regs *regs, unsigned int offset,
3333
if (unlikely(offset > MAX_REG_OFFSET))
3434
return;
3535

36-
if (!offset)
36+
if (offset)
3737
*(unsigned long *)((unsigned long)regs + offset) = val;
3838
}
3939

@@ -43,8 +43,8 @@ static bool ex_handler_uaccess_err_zero(const struct exception_table_entry *ex,
4343
int reg_err = FIELD_GET(EX_DATA_REG_ERR, ex->data);
4444
int reg_zero = FIELD_GET(EX_DATA_REG_ZERO, ex->data);
4545

46-
regs_set_gpr(regs, reg_err, -EFAULT);
47-
regs_set_gpr(regs, reg_zero, 0);
46+
regs_set_gpr(regs, reg_err * sizeof(unsigned long), -EFAULT);
47+
regs_set_gpr(regs, reg_zero * sizeof(unsigned long), 0);
4848

4949
regs->epc = get_ex_fixup(ex);
5050
return true;

0 commit comments

Comments
 (0)