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

Commit 2b4daaed authored by Al Viro's avatar Al Viro Committed by Greg Kroah-Hartman
Browse files

nios2: add force_successful_syscall_return()



commit fd0c153daad135d0ec1a53c5dbe6936a724d6ae1 upstream.

If we use the ancient SysV syscall ABI, we'd better have tell the
kernel how to claim that a negative return value is a success.
Use ->orig_r2 for that - it's inaccessible via ptrace, so it's
a fair game for changes and it's normally[*] non-negative on return
from syscall.  Set to -1; syscall is not going to be restart-worthy
by definition, so we won't interfere with that use either.

[*] the only exception is rt_sigreturn(), where we skip the entire
messing with r1/r2 anyway.

Fixes: 82ed08dd ("nios2: Exception handling")
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
Signed-off-by: default avatarDinh Nguyen <dinguyen@kernel.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent d6d9dd2c
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -74,6 +74,8 @@ extern void show_regs(struct pt_regs *);
	((struct pt_regs *)((unsigned long)current_thread_info() + THREAD_SIZE)\
		- 1)

#define force_successful_syscall_return() (current_pt_regs()->orig_r2 = -1)

int do_syscall_trace_enter(void);
void do_syscall_trace_exit(void);
#endif /* __ASSEMBLY__ */
+6 −0
Original line number Diff line number Diff line
@@ -213,6 +213,9 @@ local_restart:
translate_rc_and_ret:
	movi	r1, 0
	bge	r2, zero, 3f
	ldw	r1, PT_ORIG_R2(sp)
	addi	r1, r1, 1
	beq	r1, zero, 3f
	sub	r2, zero, r2
	movi	r1, 1
3:
@@ -276,6 +279,9 @@ traced_system_call:
translate_rc_and_ret2:
	movi	r1, 0
	bge	r2, zero, 4f
	ldw	r1, PT_ORIG_R2(sp)
	addi	r1, r1, 1
	beq	r1, zero, 4f
	sub	r2, zero, r2
	movi	r1, 1
4: