From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1760629AbbBIJt6 (ORCPT ); Mon, 9 Feb 2015 04:49:58 -0500 Received: from bes.se.axis.com ([195.60.68.10]:46897 "EHLO bes.se.axis.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1759967AbbBIJt4 (ORCPT ); Mon, 9 Feb 2015 04:49:56 -0500 Date: Mon, 9 Feb 2015 10:49:54 +0100 From: Jesper Nilsson To: Rabin Vincent Cc: jespern@axis.com, linux-cris-kernel@axis.com, viro@zeniv.linux.org.uk, linux-kernel@vger.kernel.org Subject: Re: [PATCH 1/3] CRISv32: don't attempt syscall restart on irq exit Message-ID: <20150209094954.GI11399@axis.com> References: <1423428304-26586-1-git-send-email-rabin@rab.in> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1423428304-26586-1-git-send-email-rabin@rab.in> User-Agent: Mutt/1.5.21 (2010-09-15) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Sun, Feb 08, 2015 at 09:45:02PM +0100, Rabin Vincent wrote: > r9 is used to determine whether syscall restarting must be performed or > not. Unfortunately, r9 is never set to zero in the non-syscall path, > and r9 is on top of that a callee-saved register which can be set to > non-zero by the C functions that are called during IRQ handling. > > This means that if r10 (used for the syscall return value) is one of the > -ERESTART* values when a hardware interrupt occurs which leads to a > signal being delivered to the process, the kernel will "restart" a > syscall which never occurred. This will lead to the PC being moved back > by 2 on return to user space. > > Fix the problem by setting r9 to zero in the interrupt path. > > Test case (should loop forever but ends up executing the break 8 trap > instruction): > > #include > #include > #include > > void f(int n) > { > register int r9 asm ("r9") = 1; > register int r10 asm ("r10") = n; > > __asm__ __volatile__( > "ba 1f \n" > "nop \n" > "break 8 \n" > "1: ba . \n" > "nop \n" > : > : "r" (r9), "r" (r10) > : "memory"); > } > > void handler1(int sig) { } > > int main(int argc, char *argv[]) > { > struct itimerval t1 = { .it_value = {1} }; > > signal(SIGALRM, handler1); > setitimer(ITIMER_REAL, &t1, NULL); > > f(-513); /* -ERESTARTNOINTR */ > > return 0; > } > > Signed-off-by: Rabin Vincent Nice, added in the CRIS tree for 3.20. /^JN - Jesper Nilsson -- Jesper Nilsson -- jesper.nilsson@axis.com