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@xxxxxx> >> --- >> 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 >> > >