On Mon, Jan 13, 2025 at 06:34:44PM +0100, Christophe Leroy wrote:
Le 13/01/2025 à 18:10, Dmitry V. Levin a écrit :
Bring syscall_set_return_value() in sync with syscall_get_error(),
and let upcoming ptrace/set_syscall_info selftest pass on powerpc.
This reverts commit 1b1a3702a65c ("powerpc: Don't negate error in
syscall_set_return_value()").
There is a clear detailed explanation in that commit of why it needs to
be done.
If you think that commit is wrong you have to explain why with at least
the same level of details.
OK, please have a look whether this explanation is clear and detailed enough:
=======
powerpc: properly negate error in syscall_set_return_value()
When syscall_set_return_value() is used to set an error code, the caller
specifies it as a negative value in -ERRORCODE form.
In !trap_is_scv case the error code is traditionally stored as follows:
gpr[3] contains a positive ERRORCODE, and ccr has 0x10000000 flag set.
Here are a few examples to illustrate this convention. The first one
is from syscall_get_error():
/*
* If the system call failed,
* regs->gpr[3] contains a positive ERRORCODE.
*/
return (regs->ccr & 0x10000000UL) ? -regs->gpr[3] : 0;
The second example is from regs_return_value():
if (is_syscall_success(regs))
return regs->gpr[3];
else
return -regs->gpr[3];
The third example is from check_syscall_restart():
regs->result = -EINTR;
regs->gpr[3] = EINTR;
regs->ccr |= 0x10000000;
Compared with these examples, the failure of syscall_set_return_value()
to assign a positive ERRORCODE into regs->gpr[3] is clearly visible:
/*
* In the general case it's not obvious that we must deal with
* CCR here, as the syscall exit path will also do that for us.
* However there are some places, eg. the signal code, which
* check ccr to decide if the value in r3 is actually an error.
*/
if (error) {
regs->ccr |= 0x10000000L;
regs->gpr[3] = error;
} else {
regs->ccr &= ~0x10000000L;
regs->gpr[3] = val;
}
This fix brings syscall_set_return_value() in sync with syscall_get_error()
and lets upcoming ptrace/set_syscall_info selftest pass on powerpc.
Fixes: 1b1a3702a65c ("powerpc: Don't negate error in syscall_set_return_value()").
=======