[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH -next v4 18/19] arm64/ptrace: Split report_syscall() into separate enter and exit functions



Split report_syscall() to two separate enter and exit
functions. So it will be more clear when arm64 switch to
generic entry.

No functional changes.

Suggested-by: Mark Rutland <mark.rutland@xxxxxxx>
Signed-off-by: Jinjie Ruan <ruanjinjie@xxxxxxxxxx>
---
 arch/arm64/kernel/ptrace.c | 29 ++++++++++++++++++++---------
 1 file changed, 20 insertions(+), 9 deletions(-)

diff --git a/arch/arm64/kernel/ptrace.c b/arch/arm64/kernel/ptrace.c
index 6c1dcfe6d25a..6ea303ab9e22 100644
--- a/arch/arm64/kernel/ptrace.c
+++ b/arch/arm64/kernel/ptrace.c
@@ -2290,7 +2290,7 @@ enum ptrace_syscall_dir {
        PTRACE_SYSCALL_EXIT,
 };
 
-static void report_syscall(struct pt_regs *regs, enum ptrace_syscall_dir dir)
+static void report_syscall_enter(struct pt_regs *regs)
 {
        int regno;
        unsigned long saved_reg;
@@ -2313,13 +2313,24 @@ static void report_syscall(struct pt_regs *regs, enum 
ptrace_syscall_dir dir)
         */
        regno = (is_compat_task() ? 12 : 7);
        saved_reg = regs->regs[regno];
-       regs->regs[regno] = dir;
+       regs->regs[regno] = PTRACE_SYSCALL_ENTER;
 
-       if (dir == PTRACE_SYSCALL_ENTER) {
-               if (ptrace_report_syscall_entry(regs))
-                       forget_syscall(regs);
-               regs->regs[regno] = saved_reg;
-       } else if (!test_thread_flag(TIF_SINGLESTEP)) {
+       if (ptrace_report_syscall_entry(regs))
+               forget_syscall(regs);
+       regs->regs[regno] = saved_reg;
+}
+
+static void report_syscall_exit(struct pt_regs *regs)
+{
+       int regno;
+       unsigned long saved_reg;
+
+       /* See comment for report_syscall_enter() */
+       regno = (is_compat_task() ? 12 : 7);
+       saved_reg = regs->regs[regno];
+       regs->regs[regno] = PTRACE_SYSCALL_EXIT;
+
+       if (!test_thread_flag(TIF_SINGLESTEP)) {
                ptrace_report_syscall_exit(regs, 0);
                regs->regs[regno] = saved_reg;
        } else {
@@ -2339,7 +2350,7 @@ int syscall_trace_enter(struct pt_regs *regs)
        unsigned long flags = read_thread_flags();
 
        if (flags & (_TIF_SYSCALL_EMU | _TIF_SYSCALL_TRACE)) {
-               report_syscall(regs, PTRACE_SYSCALL_ENTER);
+               report_syscall_enter(regs);
                if (flags & _TIF_SYSCALL_EMU)
                        return NO_SYSCALL;
        }
@@ -2367,7 +2378,7 @@ void syscall_trace_exit(struct pt_regs *regs)
                trace_sys_exit(regs, syscall_get_return_value(current, regs));
 
        if (flags & (_TIF_SYSCALL_TRACE | _TIF_SINGLESTEP))
-               report_syscall(regs, PTRACE_SYSCALL_EXIT);
+               report_syscall_exit(regs);
 
        rseq_syscall(regs);
 }
-- 
2.34.1




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.