diff mbox series

[4/4] parisc: Reduce sigreturn trampoline to 3 instructions

Message ID 20210908204405.127665-4-deller@gmx.de (mailing list archive)
State Accepted, archived
Headers show
Series [1/4] parisc: Drop strnlen_user() in favour of generic version | expand

Commit Message

Helge Deller Sept. 8, 2021, 8:44 p.m. UTC
We can move the INSN_LDI_R20 instruction into the branch delay slot.

Signed-off-by: Helge Deller <deller@gmx.de>
---
 arch/parisc/include/asm/rt_sigframe.h |  2 +-
 arch/parisc/kernel/signal.c           | 13 ++++++-------
 arch/parisc/kernel/signal32.h         |  2 +-
 3 files changed, 8 insertions(+), 9 deletions(-)

--
2.31.1

Comments

John David Anglin Nov. 15, 2021, 10:25 p.m. UTC | #1
This change breaks signal delivery and causes various glibc tests to fail.

commit 3e4a1aff2a97cb4fd7f0268e4b69e8c9d3641277:
dave@atlas:~/gnu/glibc/objdir$ env GCONV_PATH=/home/dave/gnu/glibc/objdir/iconvdata LOCPATH=/home/dave/gnu/glibc/objdir/localedata LC_ALL=C 
/home/dave/gnu/glibc/objdir/elf/ld.so.1 --library-path 
/home/dave/gnu/glibc/objdir:/home/dave/gnu/glibc/objdir/math:/home/dave/gnu/glibc/objdir/elf:/home/dave/gnu/glibc/objdir/dlfcn:/home/dave/gnu/glibc/objdir/nss:/home/dave/gnu/glibc/objdir/nis:/home/dave/gnu/glibc/objdir/rt:/home/dave/gnu/glibc/objdir/resolv:/home/dave/gnu/glibc/objdir/mathvec:/home/dave/gnu/glibc/objdir/support:/home/dave/gnu/glibc/objdir/crypt:/home/dave/gnu/glibc/objdir/nptl 
/home/dave/gnu/glibc/objdir/nptl/tst-cancelx4
got size 4512
in-time cancel test of 'read' successful
in-time cancel test of 'readv' successful
in-time cancel test of 'select' successful
in-time cancel test of 'pselect' successful
in-time cancel test of 'poll' successful
in-time cancel test of 'ppoll' successful
in-time cancel test of 'write' successful
in-time cancel test of 'writev' successful
in-time cancel test of 'sleep' successful
in-time cancel test of 'usleep' successful
in-time cancel test of 'nanosleep' successful
in-time cancel test of 'wait' successful
in-time cancel test of 'waitid' successful
in-time cancel test of 'waitpid' successful
in-time cancel test of 'sigpause' successful
in-time cancel test of 'sigsuspend' successful
in-time cancel test of 'sigwait' successful
in-time cancel test of 'sigwaitinfo' successful
in-time cancel test of 'sigtimedwait' successful
in-time cancel test of 'pause' successful
in-time cancel test of 'accept' successful
got size 4512
in-time cancel test of 'send' successful
in-time cancel test of 'recv' successful
in-time cancel test of 'recvfrom' successful
in-time cancel test of 'recvmsg' successful
in-time cancel test of 'msgrcv' successful
early cancel test of 'read' successful
early cancel test of 'readv' successful
early cancel test of 'select' successful
early cancel test of 'pselect' successful
early cancel test of 'poll' successful
early cancel test of 'ppoll' successful
early cancel test of 'write' successful
early cancel test of 'writev' successful
early cancel test of 'sleep' successful
early cancel test of 'usleep' successful
early cancel test of 'nanosleep' successful
early cancel test of 'wait' successful
early cancel test of 'waitid' successful
early cancel test of 'waitpid' successful
early cancel test of 'sigpause' successful
early cancel test of 'sigsuspend' successful
early cancel test of 'sigwait' successful
early cancel test of 'sigwaitinfo' successful
early cancel test of 'sigtimedwait' successful
early cancel test of 'pause' successful
early cancel test of 'accept' successful
got size 4512
early cancel test of 'send' successful
early cancel test of 'recv' successful
early cancel test of 'recvfrom' successful
early cancel test of 'recvmsg' successful
early cancel test of 'preadv' successful
early cancel test of 'preadv2' successful
early cancel test of 'pwritev' successful
early cancel test of 'pwritev2' successful
early cancel test of 'open' successful
early cancel test of 'close' successful
early cancel test of 'pread' successful
early cancel test of 'pwrite' successful
early cancel test of 'fsync' successful
early cancel test of 'fdatasync' successful
early cancel test of 'msync' successful
got size 4512
early cancel test of 'sendto' successful
early cancel test of 'sendmsg' successful
early cancel test of 'creat' successful
early cancel test of 'connect' successful
early cancel test of 'tcdrain' successful
early cancel test of 'msgrcv' successful
early cancel test of 'msgsnd' successful
dave@atlas:~/gnu/glibc/objdir$ echo $?
0

commit e4f2006f1287e7ea17660490569cff323772dac4:
dave@atlas:~/gnu/glibc/objdir$ env GCONV_PATH=/home/dave/gnu/glibc/objdir/iconvdata LOCPATH=/home/dave/gnu/glibc/objdir/localedata LC_ALL=C 
/home/dave/gnu/glibc/objdir/elf/ld.so.1 --library-path 
/home/dave/gnu/glibc/objdir:/home/dave/gnu/glibc/objdir/math:/home/dave/gnu/glibc/objdir/elf:/home/dave/gnu/glibc/objdir/dlfcn:/home/dave/gnu/glibc/objdir/nss:/home/dave/gnu/glibc/objdir/nis:/home/dave/gnu/glibc/objdir/rt:/home/dave/gnu/glibc/objdir/resolv:/home/dave/gnu/glibc/objdir/mathvec:/home/dave/gnu/glibc/objdir/support:/home/dave/gnu/glibc/objdir/crypt:/home/dave/gnu/glibc/objdir/nptl 
/home/dave/gnu/glibc/objdir/nptl/tst-cancelx4
got size 4512
cleanup handler not called for 'read'
cleanup handler not called for 'readv'
cleanup handler not called for 'select'
cleanup handler not called for 'pselect'
cleanup handler not called for 'poll'
cleanup handler not called for 'ppoll'
cleanup handler not called for 'write'
cleanup handler not called for 'writev'
cleanup handler not called for 'sleep'
cleanup handler not called for 'usleep'
cleanup handler not called for 'nanosleep'
cleanup handler not called for 'wait'
cleanup handler not called for 'waitid'
cleanup handler not called for 'waitpid'
cleanup handler not called for 'sigpause'
cleanup handler not called for 'sigsuspend'
cleanup handler not called for 'sigwait'
cleanup handler not called for 'sigwaitinfo'
cleanup handler not called for 'sigtimedwait'
cleanup handler not called for 'pause'
cleanup handler not called for 'accept'
got size 4512
cleanup handler not called for 'send'
cleanup handler not called for 'recv'
cleanup handler not called for 'recvfrom'
cleanup handler not called for 'recvmsg'
cleanup handler not called for 'msgrcv'
early cancel test of 'read' successful
early cancel test of 'readv' successful
early cancel test of 'select' successful
early cancel test of 'pselect' successful
early cancel test of 'poll' successful
early cancel test of 'ppoll' successful
early cancel test of 'write' successful
early cancel test of 'writev' successful
early cancel test of 'sleep' successful
early cancel test of 'usleep' successful
early cancel test of 'nanosleep' successful
early cancel test of 'wait' successful
early cancel test of 'waitid' successful
early cancel test of 'waitpid' successful
early cancel test of 'sigpause' successful
early cancel test of 'sigsuspend' successful
early cancel test of 'sigwait' successful
early cancel test of 'sigwaitinfo' successful
early cancel test of 'sigtimedwait' successful
early cancel test of 'pause' successful
early cancel test of 'accept' successful
got size 4512
early cancel test of 'send' successful
early cancel test of 'recv' successful
early cancel test of 'recvfrom' successful
early cancel test of 'recvmsg' successful
early cancel test of 'preadv' successful
early cancel test of 'preadv2' successful
early cancel test of 'pwritev' successful
early cancel test of 'pwritev2' successful
early cancel test of 'open' successful
early cancel test of 'close' successful
early cancel test of 'pread' successful
early cancel test of 'pwrite' successful
early cancel test of 'fsync' successful
early cancel test of 'fdatasync' successful
early cancel test of 'msync' successful
got size 4512
early cancel test of 'sendto' successful
early cancel test of 'sendmsg' successful
early cancel test of 'creat' successful
early cancel test of 'connect' successful
early cancel test of 'tcdrain' successful
early cancel test of 'msgrcv' successful
early cancel test of 'msgsnd' successful
dave@atlas:~/gnu/glibc/objdir$ echo $?
1

Dave

On 2021-09-08 4:44 p.m., Helge Deller wrote:
> We can move the INSN_LDI_R20 instruction into the branch delay slot.
>
> Signed-off-by: Helge Deller <deller@gmx.de>
> ---
>   arch/parisc/include/asm/rt_sigframe.h |  2 +-
>   arch/parisc/kernel/signal.c           | 13 ++++++-------
>   arch/parisc/kernel/signal32.h         |  2 +-
>   3 files changed, 8 insertions(+), 9 deletions(-)
>
> diff --git a/arch/parisc/include/asm/rt_sigframe.h b/arch/parisc/include/asm/rt_sigframe.h
> index 2b3010ade00e..4b9e3d707571 100644
> --- a/arch/parisc/include/asm/rt_sigframe.h
> +++ b/arch/parisc/include/asm/rt_sigframe.h
> @@ -2,7 +2,7 @@
>   #ifndef _ASM_PARISC_RT_SIGFRAME_H
>   #define _ASM_PARISC_RT_SIGFRAME_H
>
> -#define SIGRETURN_TRAMP 4
> +#define SIGRETURN_TRAMP 3
>   #define SIGRESTARTBLOCK_TRAMP 5
>   #define TRAMP_SIZE (SIGRETURN_TRAMP + SIGRESTARTBLOCK_TRAMP)
>
> diff --git a/arch/parisc/kernel/signal.c b/arch/parisc/kernel/signal.c
> index 46b1050640b8..bbfe23c40c01 100644
> --- a/arch/parisc/kernel/signal.c
> +++ b/arch/parisc/kernel/signal.c
> @@ -288,22 +288,21 @@ setup_rt_frame(struct ksignal *ksig, sigset_t *set, struct pt_regs *regs,
>   	   already in userspace. The first words of tramp are used to
>   	   save the previous sigrestartblock trampoline that might be
>   	   on the stack. We start the sigreturn trampoline at
> -	   SIGRESTARTBLOCK_TRAMP+X. */
> +	   SIGRESTARTBLOCK_TRAMP. */
>   	err |= __put_user(in_syscall ? INSN_LDI_R25_1 : INSN_LDI_R25_0,
>   			&frame->tramp[SIGRESTARTBLOCK_TRAMP+0]);
> -	err |= __put_user(INSN_LDI_R20,
> -			&frame->tramp[SIGRESTARTBLOCK_TRAMP+1]);
>   	err |= __put_user(INSN_BLE_SR2_R0,
> +			&frame->tramp[SIGRESTARTBLOCK_TRAMP+1]);
> +	err |= __put_user(INSN_LDI_R20,
>   			&frame->tramp[SIGRESTARTBLOCK_TRAMP+2]);
> -	err |= __put_user(INSN_NOP, &frame->tramp[SIGRESTARTBLOCK_TRAMP+3]);
>
> -	start = (unsigned long) &frame->tramp[0];
> -	end = (unsigned long) &frame->tramp[TRAMP_SIZE];
> +	start = (unsigned long) &frame->tramp[SIGRESTARTBLOCK_TRAMP+0];
> +	end = (unsigned long) &frame->tramp[SIGRESTARTBLOCK_TRAMP+3];
>   	flush_user_dcache_range_asm(start, end);
>   	flush_user_icache_range_asm(start, end);
>
>   	/* TRAMP Words 0-4, Length 5 = SIGRESTARTBLOCK_TRAMP
> -	 * TRAMP Words 5-9, Length 4 = SIGRETURN_TRAMP
> +	 * TRAMP Words 5-7, Length 3 = SIGRETURN_TRAMP
>   	 * So the SIGRETURN_TRAMP is at the end of SIGRESTARTBLOCK_TRAMP
>   	 */
>   	rp = (unsigned long) &frame->tramp[SIGRESTARTBLOCK_TRAMP];
> diff --git a/arch/parisc/kernel/signal32.h b/arch/parisc/kernel/signal32.h
> index f166250f2d06..a5bdbb5678b7 100644
> --- a/arch/parisc/kernel/signal32.h
> +++ b/arch/parisc/kernel/signal32.h
> @@ -36,7 +36,7 @@ struct compat_regfile {
>           compat_int_t rf_sar;
>   };
>
> -#define COMPAT_SIGRETURN_TRAMP 4
> +#define COMPAT_SIGRETURN_TRAMP 3
>   #define COMPAT_SIGRESTARTBLOCK_TRAMP 5
>   #define COMPAT_TRAMP_SIZE (COMPAT_SIGRETURN_TRAMP + \
>   				COMPAT_SIGRESTARTBLOCK_TRAMP)
> --
> 2.31.1
>
Helge Deller Nov. 16, 2021, 1:54 p.m. UTC | #2
Dave,

Thanks for tracking this down!

I wonder what's wrong with it.
Based on the outcome I should either completely revert that patch or fix it.

Helge

On 11/15/21 23:25, John David Anglin wrote:
> This change breaks signal delivery and causes various glibc tests to fail.
>
> commit 3e4a1aff2a97cb4fd7f0268e4b69e8c9d3641277:
> dave@atlas:~/gnu/glibc/objdir$ env GCONV_PATH=/home/dave/gnu/glibc/objdir/iconvdata LOCPATH=/home/dave/gnu/glibc/objdir/localedata LC_ALL=C /home/dave/gnu/glibc/objdir/elf/ld.so.1 --library-path /home/dave/gnu/glibc/objdir:/home/dave/gnu/glibc/objdir/math:/home/dave/gnu/glibc/objdir/elf:/home/dave/gnu/glibc/objdir/dlfcn:/home/dave/gnu/glibc/objdir/nss:/home/dave/gnu/glibc/objdir/nis:/home/dave/gnu/glibc/objdir/rt:/home/dave/gnu/glibc/objdir/resolv:/home/dave/gnu/glibc/objdir/mathvec:/home/dave/gnu/glibc/objdir/support:/home/dave/gnu/glibc/objdir/crypt:/home/dave/gnu/glibc/objdir/nptl /home/dave/gnu/glibc/objdir/nptl/tst-cancelx4
> got size 4512
> in-time cancel test of 'read' successful
> in-time cancel test of 'readv' successful
> in-time cancel test of 'select' successful
> in-time cancel test of 'pselect' successful
> in-time cancel test of 'poll' successful
> in-time cancel test of 'ppoll' successful
> in-time cancel test of 'write' successful
> in-time cancel test of 'writev' successful
> in-time cancel test of 'sleep' successful
> in-time cancel test of 'usleep' successful
> in-time cancel test of 'nanosleep' successful
> in-time cancel test of 'wait' successful
> in-time cancel test of 'waitid' successful
> in-time cancel test of 'waitpid' successful
> in-time cancel test of 'sigpause' successful
> in-time cancel test of 'sigsuspend' successful
> in-time cancel test of 'sigwait' successful
> in-time cancel test of 'sigwaitinfo' successful
> in-time cancel test of 'sigtimedwait' successful
> in-time cancel test of 'pause' successful
> in-time cancel test of 'accept' successful
> got size 4512
> in-time cancel test of 'send' successful
> in-time cancel test of 'recv' successful
> in-time cancel test of 'recvfrom' successful
> in-time cancel test of 'recvmsg' successful
> in-time cancel test of 'msgrcv' successful
> early cancel test of 'read' successful
> early cancel test of 'readv' successful
> early cancel test of 'select' successful
> early cancel test of 'pselect' successful
> early cancel test of 'poll' successful
> early cancel test of 'ppoll' successful
> early cancel test of 'write' successful
> early cancel test of 'writev' successful
> early cancel test of 'sleep' successful
> early cancel test of 'usleep' successful
> early cancel test of 'nanosleep' successful
> early cancel test of 'wait' successful
> early cancel test of 'waitid' successful
> early cancel test of 'waitpid' successful
> early cancel test of 'sigpause' successful
> early cancel test of 'sigsuspend' successful
> early cancel test of 'sigwait' successful
> early cancel test of 'sigwaitinfo' successful
> early cancel test of 'sigtimedwait' successful
> early cancel test of 'pause' successful
> early cancel test of 'accept' successful
> got size 4512
> early cancel test of 'send' successful
> early cancel test of 'recv' successful
> early cancel test of 'recvfrom' successful
> early cancel test of 'recvmsg' successful
> early cancel test of 'preadv' successful
> early cancel test of 'preadv2' successful
> early cancel test of 'pwritev' successful
> early cancel test of 'pwritev2' successful
> early cancel test of 'open' successful
> early cancel test of 'close' successful
> early cancel test of 'pread' successful
> early cancel test of 'pwrite' successful
> early cancel test of 'fsync' successful
> early cancel test of 'fdatasync' successful
> early cancel test of 'msync' successful
> got size 4512
> early cancel test of 'sendto' successful
> early cancel test of 'sendmsg' successful
> early cancel test of 'creat' successful
> early cancel test of 'connect' successful
> early cancel test of 'tcdrain' successful
> early cancel test of 'msgrcv' successful
> early cancel test of 'msgsnd' successful
> dave@atlas:~/gnu/glibc/objdir$ echo $?
> 0
>
> commit e4f2006f1287e7ea17660490569cff323772dac4:
> dave@atlas:~/gnu/glibc/objdir$ env GCONV_PATH=/home/dave/gnu/glibc/objdir/iconvdata LOCPATH=/home/dave/gnu/glibc/objdir/localedata LC_ALL=C /home/dave/gnu/glibc/objdir/elf/ld.so.1 --library-path /home/dave/gnu/glibc/objdir:/home/dave/gnu/glibc/objdir/math:/home/dave/gnu/glibc/objdir/elf:/home/dave/gnu/glibc/objdir/dlfcn:/home/dave/gnu/glibc/objdir/nss:/home/dave/gnu/glibc/objdir/nis:/home/dave/gnu/glibc/objdir/rt:/home/dave/gnu/glibc/objdir/resolv:/home/dave/gnu/glibc/objdir/mathvec:/home/dave/gnu/glibc/objdir/support:/home/dave/gnu/glibc/objdir/crypt:/home/dave/gnu/glibc/objdir/nptl /home/dave/gnu/glibc/objdir/nptl/tst-cancelx4
> got size 4512
> cleanup handler not called for 'read'
> cleanup handler not called for 'readv'
> cleanup handler not called for 'select'
> cleanup handler not called for 'pselect'
> cleanup handler not called for 'poll'
> cleanup handler not called for 'ppoll'
> cleanup handler not called for 'write'
> cleanup handler not called for 'writev'
> cleanup handler not called for 'sleep'
> cleanup handler not called for 'usleep'
> cleanup handler not called for 'nanosleep'
> cleanup handler not called for 'wait'
> cleanup handler not called for 'waitid'
> cleanup handler not called for 'waitpid'
> cleanup handler not called for 'sigpause'
> cleanup handler not called for 'sigsuspend'
> cleanup handler not called for 'sigwait'
> cleanup handler not called for 'sigwaitinfo'
> cleanup handler not called for 'sigtimedwait'
> cleanup handler not called for 'pause'
> cleanup handler not called for 'accept'
> got size 4512
> cleanup handler not called for 'send'
> cleanup handler not called for 'recv'
> cleanup handler not called for 'recvfrom'
> cleanup handler not called for 'recvmsg'
> cleanup handler not called for 'msgrcv'
> early cancel test of 'read' successful
> early cancel test of 'readv' successful
> early cancel test of 'select' successful
> early cancel test of 'pselect' successful
> early cancel test of 'poll' successful
> early cancel test of 'ppoll' successful
> early cancel test of 'write' successful
> early cancel test of 'writev' successful
> early cancel test of 'sleep' successful
> early cancel test of 'usleep' successful
> early cancel test of 'nanosleep' successful
> early cancel test of 'wait' successful
> early cancel test of 'waitid' successful
> early cancel test of 'waitpid' successful
> early cancel test of 'sigpause' successful
> early cancel test of 'sigsuspend' successful
> early cancel test of 'sigwait' successful
> early cancel test of 'sigwaitinfo' successful
> early cancel test of 'sigtimedwait' successful
> early cancel test of 'pause' successful
> early cancel test of 'accept' successful
> got size 4512
> early cancel test of 'send' successful
> early cancel test of 'recv' successful
> early cancel test of 'recvfrom' successful
> early cancel test of 'recvmsg' successful
> early cancel test of 'preadv' successful
> early cancel test of 'preadv2' successful
> early cancel test of 'pwritev' successful
> early cancel test of 'pwritev2' successful
> early cancel test of 'open' successful
> early cancel test of 'close' successful
> early cancel test of 'pread' successful
> early cancel test of 'pwrite' successful
> early cancel test of 'fsync' successful
> early cancel test of 'fdatasync' successful
> early cancel test of 'msync' successful
> got size 4512
> early cancel test of 'sendto' successful
> early cancel test of 'sendmsg' successful
> early cancel test of 'creat' successful
> early cancel test of 'connect' successful
> early cancel test of 'tcdrain' successful
> early cancel test of 'msgrcv' successful
> early cancel test of 'msgsnd' successful
> dave@atlas:~/gnu/glibc/objdir$ echo $?
> 1
>
> Dave
>
> On 2021-09-08 4:44 p.m., Helge Deller wrote:
>> We can move the INSN_LDI_R20 instruction into the branch delay slot.
>>
>> Signed-off-by: Helge Deller <deller@gmx.de>
>> ---
>>   arch/parisc/include/asm/rt_sigframe.h |  2 +-
>>   arch/parisc/kernel/signal.c           | 13 ++++++-------
>>   arch/parisc/kernel/signal32.h         |  2 +-
>>   3 files changed, 8 insertions(+), 9 deletions(-)
>>
>> diff --git a/arch/parisc/include/asm/rt_sigframe.h b/arch/parisc/include/asm/rt_sigframe.h
>> index 2b3010ade00e..4b9e3d707571 100644
>> --- a/arch/parisc/include/asm/rt_sigframe.h
>> +++ b/arch/parisc/include/asm/rt_sigframe.h
>> @@ -2,7 +2,7 @@
>>   #ifndef _ASM_PARISC_RT_SIGFRAME_H
>>   #define _ASM_PARISC_RT_SIGFRAME_H
>>
>> -#define SIGRETURN_TRAMP 4
>> +#define SIGRETURN_TRAMP 3
>>   #define SIGRESTARTBLOCK_TRAMP 5
>>   #define TRAMP_SIZE (SIGRETURN_TRAMP + SIGRESTARTBLOCK_TRAMP)
>>
>> diff --git a/arch/parisc/kernel/signal.c b/arch/parisc/kernel/signal.c
>> index 46b1050640b8..bbfe23c40c01 100644
>> --- a/arch/parisc/kernel/signal.c
>> +++ b/arch/parisc/kernel/signal.c
>> @@ -288,22 +288,21 @@ setup_rt_frame(struct ksignal *ksig, sigset_t *set, struct pt_regs *regs,
>>          already in userspace. The first words of tramp are used to
>>          save the previous sigrestartblock trampoline that might be
>>          on the stack. We start the sigreturn trampoline at
>> -       SIGRESTARTBLOCK_TRAMP+X. */
>> +       SIGRESTARTBLOCK_TRAMP. */
>>       err |= __put_user(in_syscall ? INSN_LDI_R25_1 : INSN_LDI_R25_0,
>>               &frame->tramp[SIGRESTARTBLOCK_TRAMP+0]);
>> -    err |= __put_user(INSN_LDI_R20,
>> -            &frame->tramp[SIGRESTARTBLOCK_TRAMP+1]);
>>       err |= __put_user(INSN_BLE_SR2_R0,
>> +            &frame->tramp[SIGRESTARTBLOCK_TRAMP+1]);
>> +    err |= __put_user(INSN_LDI_R20,
>>               &frame->tramp[SIGRESTARTBLOCK_TRAMP+2]);
>> -    err |= __put_user(INSN_NOP, &frame->tramp[SIGRESTARTBLOCK_TRAMP+3]);
>>
>> -    start = (unsigned long) &frame->tramp[0];
>> -    end = (unsigned long) &frame->tramp[TRAMP_SIZE];
>> +    start = (unsigned long) &frame->tramp[SIGRESTARTBLOCK_TRAMP+0];
>> +    end = (unsigned long) &frame->tramp[SIGRESTARTBLOCK_TRAMP+3];
>>       flush_user_dcache_range_asm(start, end);
>>       flush_user_icache_range_asm(start, end);
>>
>>       /* TRAMP Words 0-4, Length 5 = SIGRESTARTBLOCK_TRAMP
>> -     * TRAMP Words 5-9, Length 4 = SIGRETURN_TRAMP
>> +     * TRAMP Words 5-7, Length 3 = SIGRETURN_TRAMP
>>        * So the SIGRETURN_TRAMP is at the end of SIGRESTARTBLOCK_TRAMP
>>        */
>>       rp = (unsigned long) &frame->tramp[SIGRESTARTBLOCK_TRAMP];
>> diff --git a/arch/parisc/kernel/signal32.h b/arch/parisc/kernel/signal32.h
>> index f166250f2d06..a5bdbb5678b7 100644
>> --- a/arch/parisc/kernel/signal32.h
>> +++ b/arch/parisc/kernel/signal32.h
>> @@ -36,7 +36,7 @@ struct compat_regfile {
>>           compat_int_t rf_sar;
>>   };
>>
>> -#define COMPAT_SIGRETURN_TRAMP 4
>> +#define COMPAT_SIGRETURN_TRAMP 3
>>   #define COMPAT_SIGRESTARTBLOCK_TRAMP 5
>>   #define COMPAT_TRAMP_SIZE (COMPAT_SIGRETURN_TRAMP + \
>>                   COMPAT_SIGRESTARTBLOCK_TRAMP)
>> --
>> 2.31.1
>>
>
>
John David Anglin Nov. 16, 2021, 3:31 p.m. UTC | #3
I found the change with a regression search.

I don't know what's wrong with it.  I have reverted it for now.

Here are test results with 5.16.0-rc1+ #1 SMP Mon Nov 15 17:56:32 EST 2021 parisc64:
XPASS: conform/UNIX98/ndbm.h/linknamespace
XPASS: conform/XOPEN2K/ndbm.h/linknamespace
XPASS: conform/XOPEN2K8/ndbm.h/linknamespace
XPASS: conform/XPG42/ndbm.h/linknamespace
FAIL: dirent/tst-readdir64-compat
FAIL: elf/tst-audit2
UNSUPPORTED: io/tst-fallocate
UNSUPPORTED: io/tst-fallocate64
UNSUPPORTED: misc/tst-adjtimex
UNSUPPORTED: misc/tst-adjtimex-time64
UNSUPPORTED: misc/tst-clock_adjtime
UNSUPPORTED: misc/tst-clock_adjtime-time64
UNSUPPORTED: misc/tst-ntp_adjtime
UNSUPPORTED: misc/tst-ntp_adjtime-time64
UNSUPPORTED: misc/tst-pkey
UNSUPPORTED: nptl/test-cond-printers
UNSUPPORTED: nptl/test-condattr-printers
UNSUPPORTED: nptl/test-mutex-printers
UNSUPPORTED: nptl/test-mutexattr-printers
UNSUPPORTED: nptl/test-rwlock-printers
UNSUPPORTED: nptl/test-rwlockattr-printers
FAIL: nptl/tst-cleanupx4
FAIL: nptl/tst-cond25
FAIL: signal/tst-minsigstksz-5
UNSUPPORTED: stdlib/test-bz22786
FAIL: stdlib/tst-setcontext2
FAIL: stdlib/tst-setcontext7
UNSUPPORTED: stdlib/tst-strtod-overflow
UNSUPPORTED: string/tst-memmove-overflow
UNSUPPORTED: time/tst-clock_settime
UNSUPPORTED: time/tst-clock_settime-time64
UNSUPPORTED: time/tst-settimeofday
UNSUPPORTED: time/tst-settimeofday-time64
UNSUPPORTED: time/tst-y2039
Summary of test results:
       7 FAIL
    4173 PASS
      23 UNSUPPORTED
      16 XFAIL
       4 XPASS

Probably, Iecho $? should investigate why nptl/tst-cleanupx4 fails.  Might be another issue with signal delivery.

Dave
On 2021-11-16 8:54 a.m., Helge Deller wrote:
> Dave,
>
> Thanks for tracking this down!
>
> I wonder what's wrong with it.
> Based on the outcome I should either completely revert that patch or fix it.
>
> Helge
>
> On 11/15/21 23:25, John David Anglin wrote:
>> This change breaks signal delivery and causes various glibc tests to fail.
>>
>> commit 3e4a1aff2a97cb4fd7f0268e4b69e8c9d3641277:
>> dave@atlas:~/gnu/glibc/objdir$ env GCONV_PATH=/home/dave/gnu/glibc/objdir/iconvdata LOCPATH=/home/dave/gnu/glibc/objdir/localedata LC_ALL=C /home/dave/gnu/glibc/objdir/elf/ld.so.1 --library-path /home/dave/gnu/glibc/objdir:/home/dave/gnu/glibc/objdir/math:/home/dave/gnu/glibc/objdir/elf:/home/dave/gnu/glibc/objdir/dlfcn:/home/dave/gnu/glibc/objdir/nss:/home/dave/gnu/glibc/objdir/nis:/home/dave/gnu/glibc/objdir/rt:/home/dave/gnu/glibc/objdir/resolv:/home/dave/gnu/glibc/objdir/mathvec:/home/dave/gnu/glibc/objdir/support:/home/dave/gnu/glibc/objdir/crypt:/home/dave/gnu/glibc/objdir/nptl /home/dave/gnu/glibc/objdir/nptl/tst-cancelx4
>> got size 4512
>> in-time cancel test of 'read' successful
>> in-time cancel test of 'readv' successful
>> in-time cancel test of 'select' successful
>> in-time cancel test of 'pselect' successful
>> in-time cancel test of 'poll' successful
>> in-time cancel test of 'ppoll' successful
>> in-time cancel test of 'write' successful
>> in-time cancel test of 'writev' successful
>> in-time cancel test of 'sleep' successful
>> in-time cancel test of 'usleep' successful
>> in-time cancel test of 'nanosleep' successful
>> in-time cancel test of 'wait' successful
>> in-time cancel test of 'waitid' successful
>> in-time cancel test of 'waitpid' successful
>> in-time cancel test of 'sigpause' successful
>> in-time cancel test of 'sigsuspend' successful
>> in-time cancel test of 'sigwait' successful
>> in-time cancel test of 'sigwaitinfo' successful
>> in-time cancel test of 'sigtimedwait' successful
>> in-time cancel test of 'pause' successful
>> in-time cancel test of 'accept' successful
>> got size 4512
>> in-time cancel test of 'send' successful
>> in-time cancel test of 'recv' successful
>> in-time cancel test of 'recvfrom' successful
>> in-time cancel test of 'recvmsg' successful
>> in-time cancel test of 'msgrcv' successful
>> early cancel test of 'read' successful
>> early cancel test of 'readv' successful
>> early cancel test of 'select' successful
>> early cancel test of 'pselect' successful
>> early cancel test of 'poll' successful
>> early cancel test of 'ppoll' successful
>> early cancel test of 'write' successful
>> early cancel test of 'writev' successful
>> early cancel test of 'sleep' successful
>> early cancel test of 'usleep' successful
>> early cancel test of 'nanosleep' successful
>> early cancel test of 'wait' successful
>> early cancel test of 'waitid' successful
>> early cancel test of 'waitpid' successful
>> early cancel test of 'sigpause' successful
>> early cancel test of 'sigsuspend' successful
>> early cancel test of 'sigwait' successful
>> early cancel test of 'sigwaitinfo' successful
>> early cancel test of 'sigtimedwait' successful
>> early cancel test of 'pause' successful
>> early cancel test of 'accept' successful
>> got size 4512
>> early cancel test of 'send' successful
>> early cancel test of 'recv' successful
>> early cancel test of 'recvfrom' successful
>> early cancel test of 'recvmsg' successful
>> early cancel test of 'preadv' successful
>> early cancel test of 'preadv2' successful
>> early cancel test of 'pwritev' successful
>> early cancel test of 'pwritev2' successful
>> early cancel test of 'open' successful
>> early cancel test of 'close' successful
>> early cancel test of 'pread' successful
>> early cancel test of 'pwrite' successful
>> early cancel test of 'fsync' successful
>> early cancel test of 'fdatasync' successful
>> early cancel test of 'msync' successful
>> got size 4512
>> early cancel test of 'sendto' successful
>> early cancel test of 'sendmsg' successful
>> early cancel test of 'creat' successful
>> early cancel test of 'connect' successful
>> early cancel test of 'tcdrain' successful
>> early cancel test of 'msgrcv' successful
>> early cancel test of 'msgsnd' successful
>> dave@atlas:~/gnu/glibc/objdir$ echo $?
>> 0
>>
>> commit e4f2006f1287e7ea17660490569cff323772dac4:
>> dave@atlas:~/gnu/glibc/objdir$ env GCONV_PATH=/home/dave/gnu/glibc/objdir/iconvdata LOCPATH=/home/dave/gnu/glibc/objdir/localedata LC_ALL=C /home/dave/gnu/glibc/objdir/elf/ld.so.1 --library-path /home/dave/gnu/glibc/objdir:/home/dave/gnu/glibc/objdir/math:/home/dave/gnu/glibc/objdir/elf:/home/dave/gnu/glibc/objdir/dlfcn:/home/dave/gnu/glibc/objdir/nss:/home/dave/gnu/glibc/objdir/nis:/home/dave/gnu/glibc/objdir/rt:/home/dave/gnu/glibc/objdir/resolv:/home/dave/gnu/glibc/objdir/mathvec:/home/dave/gnu/glibc/objdir/support:/home/dave/gnu/glibc/objdir/crypt:/home/dave/gnu/glibc/objdir/nptl /home/dave/gnu/glibc/objdir/nptl/tst-cancelx4
>> got size 4512
>> cleanup handler not called for 'read'
>> cleanup handler not called for 'readv'
>> cleanup handler not called for 'select'
>> cleanup handler not called for 'pselect'
>> cleanup handler not called for 'poll'
>> cleanup handler not called for 'ppoll'
>> cleanup handler not called for 'write'
>> cleanup handler not called for 'writev'
>> cleanup handler not called for 'sleep'
>> cleanup handler not called for 'usleep'
>> cleanup handler not called for 'nanosleep'
>> cleanup handler not called for 'wait'
>> cleanup handler not called for 'waitid'
>> cleanup handler not called for 'waitpid'
>> cleanup handler not called for 'sigpause'
>> cleanup handler not called for 'sigsuspend'
>> cleanup handler not called for 'sigwait'
>> cleanup handler not called for 'sigwaitinfo'
>> cleanup handler not called for 'sigtimedwait'
>> cleanup handler not called for 'pause'
>> cleanup handler not called for 'accept'
>> got size 4512
>> cleanup handler not called for 'send'
>> cleanup handler not called for 'recv'
>> cleanup handler not called for 'recvfrom'
>> cleanup handler not called for 'recvmsg'
>> cleanup handler not called for 'msgrcv'
>> early cancel test of 'read' successful
>> early cancel test of 'readv' successful
>> early cancel test of 'select' successful
>> early cancel test of 'pselect' successful
>> early cancel test of 'poll' successful
>> early cancel test of 'ppoll' successful
>> early cancel test of 'write' successful
>> early cancel test of 'writev' successful
>> early cancel test of 'sleep' successful
>> early cancel test of 'usleep' successful
>> early cancel test of 'nanosleep' successful
>> early cancel test of 'wait' successful
>> early cancel test of 'waitid' successful
>> early cancel test of 'waitpid' successful
>> early cancel test of 'sigpause' successful
>> early cancel test of 'sigsuspend' successful
>> early cancel test of 'sigwait' successful
>> early cancel test of 'sigwaitinfo' successful
>> early cancel test of 'sigtimedwait' successful
>> early cancel test of 'pause' successful
>> early cancel test of 'accept' successful
>> got size 4512
>> early cancel test of 'send' successful
>> early cancel test of 'recv' successful
>> early cancel test of 'recvfrom' successful
>> early cancel test of 'recvmsg' successful
>> early cancel test of 'preadv' successful
>> early cancel test of 'preadv2' successful
>> early cancel test of 'pwritev' successful
>> early cancel test of 'pwritev2' successful
>> early cancel test of 'open' successful
>> early cancel test of 'close' successful
>> early cancel test of 'pread' successful
>> early cancel test of 'pwrite' successful
>> early cancel test of 'fsync' successful
>> early cancel test of 'fdatasync' successful
>> early cancel test of 'msync' successful
>> got size 4512
>> early cancel test of 'sendto' successful
>> early cancel test of 'sendmsg' successful
>> early cancel test of 'creat' successful
>> early cancel test of 'connect' successful
>> early cancel test of 'tcdrain' successful
>> early cancel test of 'msgrcv' successful
>> early cancel test of 'msgsnd' successful
>> dave@atlas:~/gnu/glibc/objdir$ echo $?
>> 1
>>
>> Dave
>>
>> On 2021-09-08 4:44 p.m., Helge Deller wrote:
>>> We can move the INSN_LDI_R20 instruction into the branch delay slot.
>>>
>>> Signed-off-by: Helge Deller <deller@gmx.de>
>>> ---
>>>    arch/parisc/include/asm/rt_sigframe.h |  2 +-
>>>    arch/parisc/kernel/signal.c           | 13 ++++++-------
>>>    arch/parisc/kernel/signal32.h         |  2 +-
>>>    3 files changed, 8 insertions(+), 9 deletions(-)
>>>
>>> diff --git a/arch/parisc/include/asm/rt_sigframe.h b/arch/parisc/include/asm/rt_sigframe.h
>>> index 2b3010ade00e..4b9e3d707571 100644
>>> --- a/arch/parisc/include/asm/rt_sigframe.h
>>> +++ b/arch/parisc/include/asm/rt_sigframe.h
>>> @@ -2,7 +2,7 @@
>>>    #ifndef _ASM_PARISC_RT_SIGFRAME_H
>>>    #define _ASM_PARISC_RT_SIGFRAME_H
>>>
>>> -#define SIGRETURN_TRAMP 4
>>> +#define SIGRETURN_TRAMP 3
>>>    #define SIGRESTARTBLOCK_TRAMP 5
>>>    #define TRAMP_SIZE (SIGRETURN_TRAMP + SIGRESTARTBLOCK_TRAMP)
>>>
>>> diff --git a/arch/parisc/kernel/signal.c b/arch/parisc/kernel/signal.c
>>> index 46b1050640b8..bbfe23c40c01 100644
>>> --- a/arch/parisc/kernel/signal.c
>>> +++ b/arch/parisc/kernel/signal.c
>>> @@ -288,22 +288,21 @@ setup_rt_frame(struct ksignal *ksig, sigset_t *set, struct pt_regs *regs,
>>>           already in userspace. The first words of tramp are used to
>>>           save the previous sigrestartblock trampoline that might be
>>>           on the stack. We start the sigreturn trampoline at
>>> -       SIGRESTARTBLOCK_TRAMP+X. */
>>> +       SIGRESTARTBLOCK_TRAMP. */
>>>        err |= __put_user(in_syscall ? INSN_LDI_R25_1 : INSN_LDI_R25_0,
>>>                &frame->tramp[SIGRESTARTBLOCK_TRAMP+0]);
>>> -    err |= __put_user(INSN_LDI_R20,
>>> -            &frame->tramp[SIGRESTARTBLOCK_TRAMP+1]);
>>>        err |= __put_user(INSN_BLE_SR2_R0,
>>> +            &frame->tramp[SIGRESTARTBLOCK_TRAMP+1]);
>>> +    err |= __put_user(INSN_LDI_R20,
>>>                &frame->tramp[SIGRESTARTBLOCK_TRAMP+2]);
>>> -    err |= __put_user(INSN_NOP, &frame->tramp[SIGRESTARTBLOCK_TRAMP+3]);
>>>
>>> -    start = (unsigned long) &frame->tramp[0];
>>> -    end = (unsigned long) &frame->tramp[TRAMP_SIZE];
>>> +    start = (unsigned long) &frame->tramp[SIGRESTARTBLOCK_TRAMP+0];
>>> +    end = (unsigned long) &frame->tramp[SIGRESTARTBLOCK_TRAMP+3];
>>>        flush_user_dcache_range_asm(start, end);
>>>        flush_user_icache_range_asm(start, end);
>>>
>>>        /* TRAMP Words 0-4, Length 5 = SIGRESTARTBLOCK_TRAMP
>>> -     * TRAMP Words 5-9, Length 4 = SIGRETURN_TRAMP
>>> +     * TRAMP Words 5-7, Length 3 = SIGRETURN_TRAMP
>>>         * So the SIGRETURN_TRAMP is at the end of SIGRESTARTBLOCK_TRAMP
>>>         */
>>>        rp = (unsigned long) &frame->tramp[SIGRESTARTBLOCK_TRAMP];
>>> diff --git a/arch/parisc/kernel/signal32.h b/arch/parisc/kernel/signal32.h
>>> index f166250f2d06..a5bdbb5678b7 100644
>>> --- a/arch/parisc/kernel/signal32.h
>>> +++ b/arch/parisc/kernel/signal32.h
>>> @@ -36,7 +36,7 @@ struct compat_regfile {
>>>            compat_int_t rf_sar;
>>>    };
>>>
>>> -#define COMPAT_SIGRETURN_TRAMP 4
>>> +#define COMPAT_SIGRETURN_TRAMP 3
>>>    #define COMPAT_SIGRESTARTBLOCK_TRAMP 5
>>>    #define COMPAT_TRAMP_SIZE (COMPAT_SIGRETURN_TRAMP + \
>>>                    COMPAT_SIGRESTARTBLOCK_TRAMP)
>>> --
>>> 2.31.1
>>>
>>
John David Anglin Nov. 16, 2021, 5:08 p.m. UTC | #4
On 2021-11-16 10:31 a.m., John David Anglin wrote:
> I don't know what's wrong with it.  I have reverted it for now.
I think problem must be with cache flush range.

Dave
Helge Deller Nov. 16, 2021, 7:02 p.m. UTC | #5
On 11/16/21 18:08, John David Anglin wrote:
> On 2021-11-16 10:31 a.m., John David Anglin wrote:
>> I don't know what's wrong with it.  I have reverted it for now.
> I think problem must be with cache flush range.

Not sure. Seems like reverting SIGRETURN_TRAMP back to 4 fixes it.

Anyway, I'll revert the whole patch for now.
Maybe we can fix it in v5.17.

Helge
John David Anglin Nov. 16, 2021, 7:12 p.m. UTC | #6
On 2021-11-16 2:02 p.m., Helge Deller wrote:
> On 11/16/21 18:08, John David Anglin wrote:
>> On 2021-11-16 10:31 a.m., John David Anglin wrote:
>>> I don't know what's wrong with it.  I have reverted it for now.
>> I think problem must be with cache flush range.
Didn't work 
diff mbox series

Patch

diff --git a/arch/parisc/include/asm/rt_sigframe.h b/arch/parisc/include/asm/rt_sigframe.h
index 2b3010ade00e..4b9e3d707571 100644
--- a/arch/parisc/include/asm/rt_sigframe.h
+++ b/arch/parisc/include/asm/rt_sigframe.h
@@ -2,7 +2,7 @@ 
 #ifndef _ASM_PARISC_RT_SIGFRAME_H
 #define _ASM_PARISC_RT_SIGFRAME_H

-#define SIGRETURN_TRAMP 4
+#define SIGRETURN_TRAMP 3
 #define SIGRESTARTBLOCK_TRAMP 5
 #define TRAMP_SIZE (SIGRETURN_TRAMP + SIGRESTARTBLOCK_TRAMP)

diff --git a/arch/parisc/kernel/signal.c b/arch/parisc/kernel/signal.c
index 46b1050640b8..bbfe23c40c01 100644
--- a/arch/parisc/kernel/signal.c
+++ b/arch/parisc/kernel/signal.c
@@ -288,22 +288,21 @@  setup_rt_frame(struct ksignal *ksig, sigset_t *set, struct pt_regs *regs,
 	   already in userspace. The first words of tramp are used to
 	   save the previous sigrestartblock trampoline that might be
 	   on the stack. We start the sigreturn trampoline at
-	   SIGRESTARTBLOCK_TRAMP+X. */
+	   SIGRESTARTBLOCK_TRAMP. */
 	err |= __put_user(in_syscall ? INSN_LDI_R25_1 : INSN_LDI_R25_0,
 			&frame->tramp[SIGRESTARTBLOCK_TRAMP+0]);
-	err |= __put_user(INSN_LDI_R20,
-			&frame->tramp[SIGRESTARTBLOCK_TRAMP+1]);
 	err |= __put_user(INSN_BLE_SR2_R0,
+			&frame->tramp[SIGRESTARTBLOCK_TRAMP+1]);
+	err |= __put_user(INSN_LDI_R20,
 			&frame->tramp[SIGRESTARTBLOCK_TRAMP+2]);
-	err |= __put_user(INSN_NOP, &frame->tramp[SIGRESTARTBLOCK_TRAMP+3]);

-	start = (unsigned long) &frame->tramp[0];
-	end = (unsigned long) &frame->tramp[TRAMP_SIZE];
+	start = (unsigned long) &frame->tramp[SIGRESTARTBLOCK_TRAMP+0];
+	end = (unsigned long) &frame->tramp[SIGRESTARTBLOCK_TRAMP+3];
 	flush_user_dcache_range_asm(start, end);
 	flush_user_icache_range_asm(start, end);

 	/* TRAMP Words 0-4, Length 5 = SIGRESTARTBLOCK_TRAMP
-	 * TRAMP Words 5-9, Length 4 = SIGRETURN_TRAMP
+	 * TRAMP Words 5-7, Length 3 = SIGRETURN_TRAMP
 	 * So the SIGRETURN_TRAMP is at the end of SIGRESTARTBLOCK_TRAMP
 	 */
 	rp = (unsigned long) &frame->tramp[SIGRESTARTBLOCK_TRAMP];
diff --git a/arch/parisc/kernel/signal32.h b/arch/parisc/kernel/signal32.h
index f166250f2d06..a5bdbb5678b7 100644
--- a/arch/parisc/kernel/signal32.h
+++ b/arch/parisc/kernel/signal32.h
@@ -36,7 +36,7 @@  struct compat_regfile {
         compat_int_t rf_sar;
 };

-#define COMPAT_SIGRETURN_TRAMP 4
+#define COMPAT_SIGRETURN_TRAMP 3
 #define COMPAT_SIGRESTARTBLOCK_TRAMP 5
 #define COMPAT_TRAMP_SIZE (COMPAT_SIGRETURN_TRAMP + \
 				COMPAT_SIGRESTARTBLOCK_TRAMP)