• V
    ARC: SA_SIGINFO ucontext regs off-by-one · 6914e1e3
    Vineet Gupta 提交于
    The regfile provided to SA_SIGINFO signal handler as ucontext was off by
    one due to pt_regs gutter cleanups in 2013.
    
    Before handling signal, user pt_regs are copied onto user_regs_struct and copied
    back later. Both structs are binary compatible. This was all fine until
    commit 2fa91904 (ARC: pt_regs update #2) which removed the empty stack slot
    at top of pt_regs (corresponding to first pad) and made the corresponding
    fixup in struct user_regs_struct (the pad in there was moved out of
    @scratch - not removed altogether as it is part of ptrace ABI)
    
     struct user_regs_struct {
    +       long pad;
            struct {
    -               long pad;
                    long bta, lp_start, lp_end,....
            } scratch;
     ...
     }
    
    This meant that now user_regs_struct was off by 1 reg w.r.t pt_regs and
    signal code needs to user_regs_struct.scratch to reflect it as pt_regs,
    which is what this commit does.
    
    This problem was hidden for 2 years, because both save/restore, despite
    using wrong location, were using the same location. Only an interim
    inspection (reproducer below) exposed the issue.
    
         void handle_segv(int signo, siginfo_t *info, void *context)
         {
     	ucontext_t *uc = context;
    	struct user_regs_struct *regs = &(uc->uc_mcontext.regs);
    
    	printf("regs %x %x\n",               <=== prints 7 8 (vs. 8 9)
                   regs->scratch.r8, regs->scratch.r9);
         }
    
         int main()
         {
    	struct sigaction sa;
    
    	sa.sa_sigaction = handle_segv;
    	sa.sa_flags = SA_SIGINFO;
    	sigemptyset(&sa.sa_mask);
    	sigaction(SIGSEGV, &sa, NULL);
    
    	asm volatile(
    	"mov	r7, 7	\n"
    	"mov	r8, 8	\n"
    	"mov	r9, 9	\n"
    	"mov	r10, 10	\n"
    	:::"r7","r8","r9","r10");
    
    	*((unsigned int*)0x10) = 0;
         }
    
    Fixes: 2fa91904 "ARC: pt_regs update #2: Remove unused gutter at start of pt_regs"
    CC: <stable@vger.kernel.org>
    Signed-off-by: NVineet Gupta <vgupta@synopsys.com>
    6914e1e3
signal.c 9.4 KB