From patchwork Thu Mar 13 10:11:30 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: AKASHI Takahiro X-Patchwork-Id: 26183 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-pb0-f70.google.com (mail-pb0-f70.google.com [209.85.160.70]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id 6AF71206A0 for ; Thu, 13 Mar 2014 10:13:14 +0000 (UTC) Received: by mail-pb0-f70.google.com with SMTP id rp16sf1914367pbb.5 for ; Thu, 13 Mar 2014 03:13:13 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:delivered-to:from:to:cc:subject :date:message-id:in-reply-to:references:sender:precedence:list-id :x-original-sender:x-original-authentication-results:mailing-list :list-post:list-help:list-archive:list-unsubscribe; bh=GoUpBnzUlvTSaN6YNuB0EDhp2rAxcyHy6sBuVGNXzDo=; b=fd/a9JetaWUBtkDNrbxBl7Fo74A5itsxepJVwRJBEU8MiioT85SYSjO9wa484SWt5O YRsQBw4R9RoNyVupd13Z/wCB0mzGYJgQxbJchv31nYRFDptdvpU+yIw/pruO6BR4YE/g 7Jco4beRdEREIq0KE7k8BL4SlkxIsA/16LqKIJJ045Tl4etFv+4d1NdYHbb1tsMaVy1M jYjZTDRl07eTWgF/ToB8HIh4RTciQ92/SEZ9E4uB+d/YiLpZaBG2ZD4QTme/E3TJjCJR upT5xpdagpVuF3BttzKat9f3C7ePGCel9vYK1A3xJrNLiLCbFHxW9wSZWbpqHiata/cW EWZQ== X-Gm-Message-State: ALoCoQkY6M/Kl00JZ633VbR1e1dUvlCCwzCXeYH0hHhQiZFApJq9iM6cLES1QlugpLWgm60475Wd X-Received: by 10.66.142.131 with SMTP id rw3mr404310pab.18.1394705593628; Thu, 13 Mar 2014 03:13:13 -0700 (PDT) MIME-Version: 1.0 X-BeenThere: patchwork-forward@linaro.org Received: by 10.140.36.45 with SMTP id o42ls254267qgo.7.gmail; Thu, 13 Mar 2014 03:13:13 -0700 (PDT) X-Received: by 10.58.31.136 with SMTP id a8mr747626vei.20.1394705593416; Thu, 13 Mar 2014 03:13:13 -0700 (PDT) Received: from mail-vc0-f177.google.com (mail-vc0-f177.google.com [209.85.220.177]) by mx.google.com with ESMTPS id eb8si634255vdb.86.2014.03.13.03.13.13 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Thu, 13 Mar 2014 03:13:13 -0700 (PDT) Received-SPF: neutral (google.com: 209.85.220.177 is neither permitted nor denied by best guess record for domain of patch+caf_=patchwork-forward=linaro.org@linaro.org) client-ip=209.85.220.177; Received: by mail-vc0-f177.google.com with SMTP id if17so810251vcb.22 for ; Thu, 13 Mar 2014 03:13:13 -0700 (PDT) X-Received: by 10.221.37.1 with SMTP id tc1mr117739vcb.32.1394705593322; Thu, 13 Mar 2014 03:13:13 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.220.78.9 with SMTP id i9csp355826vck; Thu, 13 Mar 2014 03:13:12 -0700 (PDT) X-Received: by 10.66.141.165 with SMTP id rp5mr1291953pab.90.1394705591984; Thu, 13 Mar 2014 03:13:11 -0700 (PDT) Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id bq3si1774476pbd.356.2014.03.13.03.13.11; Thu, 13 Mar 2014 03:13:11 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753897AbaCMKNG (ORCPT + 26 others); Thu, 13 Mar 2014 06:13:06 -0400 Received: from mail-pb0-f49.google.com ([209.85.160.49]:48254 "EHLO mail-pb0-f49.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753861AbaCMKNB (ORCPT ); Thu, 13 Mar 2014 06:13:01 -0400 Received: by mail-pb0-f49.google.com with SMTP id jt11so888106pbb.36 for ; Thu, 13 Mar 2014 03:13:00 -0700 (PDT) X-Received: by 10.67.14.231 with SMTP id fj7mr1123901pad.115.1394705580544; Thu, 13 Mar 2014 03:13:00 -0700 (PDT) Received: from localhost.localdomain (KD182249091179.au-net.ne.jp. [182.249.91.179]) by mx.google.com with ESMTPSA id fn2sm7487532pab.38.2014.03.13.03.12.55 for (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Thu, 13 Mar 2014 03:12:59 -0700 (PDT) From: AKASHI Takahiro To: will.deacon@arm.com Cc: viro@zeniv.linux.org.uk, eparis@redhat.com, rgb@redhat.com, catalin.marinas@arm.com, dsaxena@linaro.org, arndb@arndb.de, linux-arm-kernel@lists.infradead.org, linaro-kernel@lists.linaro.org, linux-kernel@vger.kernel.org, linux-audit@redhat.com, AKASHI Takahiro Subject: [PATCH v4 2/3] arm64: split syscall_trace() into separate functions for enter/exit Date: Thu, 13 Mar 2014 19:11:30 +0900 Message-Id: <1394705491-12343-3-git-send-email-takahiro.akashi@linaro.org> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1394705491-12343-1-git-send-email-takahiro.akashi@linaro.org> References: <1393564465-3862-1-git-send-email-takahiro.akashi@linaro.org> <1394705491-12343-1-git-send-email-takahiro.akashi@linaro.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: list List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: takahiro.akashi@linaro.org X-Original-Authentication-Results: mx.google.com; spf=neutral (google.com: 209.85.220.177 is neither permitted nor denied by best guess record for domain of patch+caf_=patchwork-forward=linaro.org@linaro.org) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org X-Google-Group-Id: 836684582541 List-Post: , List-Help: , List-Archive: List-Unsubscribe: , As done in arm, this change makes it easy to confirm we invoke syscall related hooks, including syscall tracepoint, audit and seccomp which would be implemented later, in correct order. That is, undoing operations in the opposite order on exit that they were done on entry. Signed-off-by: AKASHI Takahiro --- arch/arm64/kernel/entry.S | 10 ++++----- arch/arm64/kernel/ptrace.c | 48 ++++++++++++++++++++++++++++++++++---------- 2 files changed, 41 insertions(+), 17 deletions(-) diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S index f9f2cae..00d6eb9 100644 --- a/arch/arm64/kernel/entry.S +++ b/arch/arm64/kernel/entry.S @@ -649,9 +649,8 @@ ENDPROC(el0_svc) * switches, and waiting for our parent to respond. */ __sys_trace: - mov x1, sp - mov w0, #0 // trace entry - bl syscall_trace + mov x0, sp + bl syscall_trace_enter adr lr, __sys_trace_return // return address uxtw scno, w0 // syscall number (possibly new) mov x1, sp // pointer to regs @@ -666,9 +665,8 @@ __sys_trace: __sys_trace_return: str x0, [sp] // save returned x0 - mov x1, sp - mov w0, #1 // trace exit - bl syscall_trace + mov x0, sp + bl syscall_trace_exit b ret_to_user /* diff --git a/arch/arm64/kernel/ptrace.c b/arch/arm64/kernel/ptrace.c index 6a8928b..9993a8f 100644 --- a/arch/arm64/kernel/ptrace.c +++ b/arch/arm64/kernel/ptrace.c @@ -1058,29 +1058,27 @@ long arch_ptrace(struct task_struct *child, long request, return ptrace_request(child, request, addr, data); } -asmlinkage int syscall_trace(int dir, struct pt_regs *regs) +asmlinkage int syscall_trace_enter(struct pt_regs *regs) { unsigned long saved_reg; if (!test_thread_flag(TIF_SYSCALL_TRACE)) return regs->syscallno; + /* + * A scrach register (ip(r12) on AArch32, x7 on AArch64) is + * used to denote syscall entry/exit: + * 0 -> entry + */ if (is_compat_task()) { - /* AArch32 uses ip (r12) for scratch */ saved_reg = regs->regs[12]; - regs->regs[12] = dir; + regs->regs[12] = 0; } else { - /* - * Save X7. X7 is used to denote syscall entry/exit: - * X7 = 0 -> entry, = 1 -> exit - */ saved_reg = regs->regs[7]; - regs->regs[7] = dir; + regs->regs[7] = 0; } - if (dir) - tracehook_report_syscall_exit(regs, 0); - else if (tracehook_report_syscall_entry(regs)) + if (tracehook_report_syscall_entry(regs)) regs->syscallno = ~0UL; if (is_compat_task()) @@ -1090,3 +1088,31 @@ asmlinkage int syscall_trace(int dir, struct pt_regs *regs) return regs->syscallno; } + +asmlinkage void syscall_trace_exit(struct pt_regs *regs) +{ + unsigned long saved_reg; + + if (!test_thread_flag(TIF_SYSCALL_TRACE)) + return; + + /* + * A scrach register (ip(r12) on AArch32, x7 on AArch64) is + * used to denote syscall entry/exit: + * 1 -> exit + */ + if (is_compat_task()) { + saved_reg = regs->regs[12]; + regs->regs[12] = 1; + } else { + saved_reg = regs->regs[7]; + regs->regs[7] = 1; + } + + tracehook_report_syscall_exit(regs, 0); + + if (is_compat_task()) + regs->regs[12] = saved_reg; + else + regs->regs[7] = saved_reg; +}