From patchwork Tue Jul 21 10:04:45 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kyle Huey X-Patchwork-Id: 6834311 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id C060C9F380 for ; Tue, 21 Jul 2015 10:07:58 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id B96CA2044B for ; Tue, 21 Jul 2015 10:07:57 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id BF4AE20435 for ; Tue, 21 Jul 2015 10:07:56 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZHUQh-0004MV-30; Tue, 21 Jul 2015 10:05:43 +0000 Received: from mail-pd0-f180.google.com ([209.85.192.180]) by bombadil.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZHUQe-0004HG-Ag for linux-arm-kernel@lists.infradead.org; Tue, 21 Jul 2015 10:05:41 +0000 Received: by pdbnt7 with SMTP id nt7so47385367pdb.0 for ; Tue, 21 Jul 2015 03:05:15 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=G3jHZDbEJI6gJcSb7MNtM3+aJOpZXZAYyZmNCY6quaA=; b=TMejJOsj66IWkHh9KPPEETBnLusnP2INrhdt9i8Wn0GWNWD2mlxGdlaUnZ5Xi6jsaf 16tNIEmtlwxeL5sx+5gAp6gTLIqWWSR+NeQMtj8fY3+rgA9e7ISuuFh3WAMpv15yk0ws wuW8S9GXsrmuFjPkzo9JLJV7R+STZQzXPMoWOt7m3BsUJncVg5+rffsjdHXTWkZ4LnLM OzSNcSqfIj+2KA9x99aL50UD2y6etEJSaGHT+cjccLlbSYtAslx4VHYuKfR8TerHV5/t 7FDs3MUtuYDkPyngMuGUR8+htj/X5xb+8wPx5A31XSAP6iZaEFWHDYmCLbLT9bIkMZE/ +ewQ== X-Gm-Message-State: ALoCoQnODht5+zgzNcP3U3w4JGTUTJ/DQBSrduG1OrCtYdGmzwKg37+wJvTKkFSItIFGc1EYtL8b X-Received: by 10.66.160.1 with SMTP id xg1mr71005881pab.27.1437473115221; Tue, 21 Jul 2015 03:05:15 -0700 (PDT) Received: from minbar.corp.sfo1.mozilla.com (corp-nat.p2p.sfo1.mozilla.com. [63.245.219.53]) by smtp.gmail.com with ESMTPSA id kw5sm26650206pab.29.2015.07.21.03.05.13 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 21 Jul 2015 03:05:14 -0700 (PDT) From: Kyle Huey X-Google-Original-From: Kyle Huey To: Russell King , Will Deacon , Richard Weinberger , Mark Charlebois , =?UTF-8?q?Jan-Simon=20M=C3=B6ller?= , Behan Webster , Vladimir Murzin , Kyle Huey , Andy Lutomirski , Eric Paris , Kees Cook , linux-arm-kernel@lists.infradead.org (moderated list:ARM PORT), linux-kernel@vger.kernel.org (open list) Subject: [PATCH] ARM: ptrace: Implement PTRACE_SYSEMU Date: Tue, 21 Jul 2015 03:04:45 -0700 Message-Id: <1437473089-28654-1-git-send-email-khuey@kylehuey.com> X-Mailer: git-send-email 1.9.1 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20150721_030540_425539_5B8912CE X-CRM114-Status: GOOD ( 18.18 ) X-Spam-Score: -2.6 (--) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: linux-api@vger.kernel.org MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Spam-Status: No, score=-5.4 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Implement PTRACE_SYSEMU support on ARM. Currently this ptrace call is supported only on x86. This copies the x86 semantics for invoking ptrace hooks (the syscall entry hook is invoked, the exit hook is not). This patch also defines PTRACE_SYSEMU_SINGLESTEP because kernel/ptrace.c expects it to be present if PTRACE_SYSEMU is present. Attempting to use PTRACE_SYSEMU_SINGLESTEP will fail at runtime on ARM with EIO since there is no single stepping on ARM. Signed-off-by: Kyle Huey --- arch/arm/include/asm/thread_info.h | 8 ++++++-- arch/arm/include/uapi/asm/ptrace.h | 32 +++++++++++++++++--------------- arch/arm/kernel/ptrace.c | 9 +++++++-- 3 files changed, 30 insertions(+), 19 deletions(-) diff --git a/arch/arm/include/asm/thread_info.h b/arch/arm/include/asm/thread_info.h index bd32ede..0e3ee19 100644 --- a/arch/arm/include/asm/thread_info.h +++ b/arch/arm/include/asm/thread_info.h @@ -137,7 +137,8 @@ extern int vfp_restore_user_hwstate(struct user_vfp __user *, /* * thread information flags: * TIF_SYSCALL_TRACE - syscall trace active - * TIF_SYSCAL_AUDIT - syscall auditing active + * TIF_SYSCALL_AUDIT - syscall auditing active + * TIF_SYSCALL_EMU - syscall emulation active * TIF_SIGPENDING - signal pending * TIF_NEED_RESCHED - rescheduling necessary * TIF_NOTIFY_RESUME - callback before returning to user @@ -153,6 +154,7 @@ extern int vfp_restore_user_hwstate(struct user_vfp __user *, #define TIF_SYSCALL_TRACEPOINT 10 #define TIF_SECCOMP 11 /* seccomp syscall filtering active */ #define TIF_NOHZ 12 /* in adaptive nohz mode */ +#define TIF_SYSCALL_EMU 13 #define TIF_USING_IWMMXT 17 #define TIF_MEMDIE 18 /* is terminating due to OOM killer */ #define TIF_RESTORE_SIGMASK 20 @@ -165,11 +167,13 @@ extern int vfp_restore_user_hwstate(struct user_vfp __user *, #define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT) #define _TIF_SYSCALL_TRACEPOINT (1 << TIF_SYSCALL_TRACEPOINT) #define _TIF_SECCOMP (1 << TIF_SECCOMP) +#define _TIF_SYSCALL_EMU (1 << TIF_SYSCALL_EMU) #define _TIF_USING_IWMMXT (1 << TIF_USING_IWMMXT) /* Checks for any syscall work in entry-common.S */ #define _TIF_SYSCALL_WORK (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | \ - _TIF_SYSCALL_TRACEPOINT | _TIF_SECCOMP) + _TIF_SYSCALL_TRACEPOINT | _TIF_SECCOMP | \ + _TIF_SYSCALL_EMU) /* * Change these and you break ASM code in entry-common.S diff --git a/arch/arm/include/uapi/asm/ptrace.h b/arch/arm/include/uapi/asm/ptrace.h index 5af0ed1..2c5e4d7 100644 --- a/arch/arm/include/uapi/asm/ptrace.h +++ b/arch/arm/include/uapi/asm/ptrace.h @@ -12,25 +12,27 @@ #include -#define PTRACE_GETREGS 12 -#define PTRACE_SETREGS 13 -#define PTRACE_GETFPREGS 14 -#define PTRACE_SETFPREGS 15 +#define PTRACE_GETREGS 12 +#define PTRACE_SETREGS 13 +#define PTRACE_GETFPREGS 14 +#define PTRACE_SETFPREGS 15 /* PTRACE_ATTACH is 16 */ /* PTRACE_DETACH is 17 */ -#define PTRACE_GETWMMXREGS 18 -#define PTRACE_SETWMMXREGS 19 +#define PTRACE_GETWMMXREGS 18 +#define PTRACE_SETWMMXREGS 19 /* 20 is unused */ -#define PTRACE_OLDSETOPTIONS 21 -#define PTRACE_GET_THREAD_AREA 22 -#define PTRACE_SET_SYSCALL 23 +#define PTRACE_OLDSETOPTIONS 21 +#define PTRACE_GET_THREAD_AREA 22 +#define PTRACE_SET_SYSCALL 23 /* PTRACE_SYSCALL is 24 */ -#define PTRACE_GETCRUNCHREGS 25 -#define PTRACE_SETCRUNCHREGS 26 -#define PTRACE_GETVFPREGS 27 -#define PTRACE_SETVFPREGS 28 -#define PTRACE_GETHBPREGS 29 -#define PTRACE_SETHBPREGS 30 +#define PTRACE_GETCRUNCHREGS 25 +#define PTRACE_SETCRUNCHREGS 26 +#define PTRACE_GETVFPREGS 27 +#define PTRACE_SETVFPREGS 28 +#define PTRACE_GETHBPREGS 29 +#define PTRACE_SETHBPREGS 30 +#define PTRACE_SYSEMU 31 +#define PTRACE_SYSEMU_SINGLESTEP 32 /* * PSR bits diff --git a/arch/arm/kernel/ptrace.c b/arch/arm/kernel/ptrace.c index ef9119f..c84058c 100644 --- a/arch/arm/kernel/ptrace.c +++ b/arch/arm/kernel/ptrace.c @@ -930,6 +930,8 @@ static void tracehook_report_syscall(struct pt_regs *regs, asmlinkage int syscall_trace_enter(struct pt_regs *regs, int scno) { + int ret = 0; + current_thread_info()->syscall = scno; /* Do the secure computing check first; failures should be fast. */ @@ -941,7 +943,10 @@ asmlinkage int syscall_trace_enter(struct pt_regs *regs, int scno) secure_computing_strict(scno); #endif - if (test_thread_flag(TIF_SYSCALL_TRACE)) + if (test_thread_flag(TIF_SYSCALL_EMU)) + ret = -1; + + if (ret || test_thread_flag(TIF_SYSCALL_TRACE)) tracehook_report_syscall(regs, PTRACE_SYSCALL_ENTER); scno = current_thread_info()->syscall; @@ -952,7 +957,7 @@ asmlinkage int syscall_trace_enter(struct pt_regs *regs, int scno) audit_syscall_entry(scno, regs->ARM_r0, regs->ARM_r1, regs->ARM_r2, regs->ARM_r3); - return scno; + return ret ?: scno; } asmlinkage void syscall_trace_exit(struct pt_regs *regs)