Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756008AbbLQU1j (ORCPT ); Thu, 17 Dec 2015 15:27:39 -0500 Received: from mail-oi0-f50.google.com ([209.85.218.50]:34379 "EHLO mail-oi0-f50.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755912AbbLQU1g (ORCPT ); Thu, 17 Dec 2015 15:27:36 -0500 MIME-Version: 1.0 In-Reply-To: <20151213034437.GA2392@altlinux.org> References: <20151213034437.GA2392@altlinux.org> From: Andy Lutomirski Date: Thu, 17 Dec 2015 12:27:16 -0800 Message-ID: Subject: Re: [PATCH] x86/signal: fix restart_syscall number for x32 tasks To: "Dmitry V. Levin" Cc: X86 ML , "linux-kernel@vger.kernel.org" , Elvira Khabirova Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1976 Lines: 55 On Sat, Dec 12, 2015 at 7:44 PM, Dmitry V. Levin wrote: > On Mon, Dec 07, 2015 at 03:22:06PM -0800, Andy Lutomirski wrote: >> [not real reply because I'm using a bad internet connection right now >> and I'm not set up with my usual Gmane reply hack right now] >> >> The new code is (whitespace-damaged): >> >> static inline unsigned long get_nr_restart_syscall(const struct pt_regs *regs) >> { >> #if defined(CONFIG_X86_32) || !defined(CONFIG_X86_64) >> return __NR_restart_syscall; >> #else /* !CONFIG_X86_32 && CONFIG_X86_64 */ >> return test_thread_flag(TIF_IA32) ? __NR_ia32_restart_syscall : >> __NR_restart_syscall | (regs->orig_ax & __X32_SYSCALL_BIT); >> #endif /* CONFIG_X86_32 || !CONFIG_X86_64 */ >> } >> >> This is IMO awful. This use of TIF_IA32 is wrong, and this is >> otherwise gross. Can we do it for real: >> >> if (is_ia32_task()) >> return __NR_ia32_restart_syscall; >> else >> return __NR_restart_syscall | (regs->orig_ax & __X32_SYSCALL_BIT); >> /* preserve x32 bit */ >> >> I'd send the patch myself, but you apparently have a good test case >> for this, and I don't. > > Unfortunately, this won't compile on CONFIG_X86_32 because > __NR_ia32_restart_syscall is defined for CONFIG_X86_64 only. > > Something like this should work: > > static inline unsigned long get_nr_restart_syscall(const struct pt_regs *regs) > { > #ifdef CONFIG_X86_64 > if (is_ia32_task()) > return __NR_ia32_restart_syscall; > # ifdef CONFIG_X86_X32_ABI > if (regs->orig_ax & __X32_SYSCALL_BIT) > return __NR_restart_syscall | __X32_SYSCALL_BIT; > # endif > #endif > return __NR_restart_syscall; > } Looks good to me. Want to send a patch? --Andy -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/