The generic syscall entry code has the form:

| syscall_trace_enter()
| {
|       ptrace_report_syscall_entry()
| }
|
| syscall_exit_work()
| {
|       ptrace_report_syscall_exit()
| }

In preparation for moving arm64 over to the generic entry code, split
report_syscall() to two separate enter and exit functions to align
the structure of the arm64 code with syscall_trace_enter() and
syscall_exit_work() from the generic entry code.

No functional changes.

Reviewed-by: Kevin Brodsky <[email protected]>
Suggested-by: Mark Rutland <[email protected]>
Signed-off-by: Jinjie Ruan <[email protected]>
---
v8:
- report_syscall_enter() -> report_syscall_entry().
- Add ptrace_save_reg() helper.
---
 arch/arm64/kernel/ptrace.c | 41 +++++++++++++++++++++++++++-----------
 1 file changed, 29 insertions(+), 12 deletions(-)

diff --git a/arch/arm64/kernel/ptrace.c b/arch/arm64/kernel/ptrace.c
index 4b001121c72d..4532e9831856 100644
--- a/arch/arm64/kernel/ptrace.c
+++ b/arch/arm64/kernel/ptrace.c
@@ -2317,9 +2317,10 @@ enum ptrace_syscall_dir {
        PTRACE_SYSCALL_EXIT,
 };
 
-static void report_syscall(struct pt_regs *regs, enum ptrace_syscall_dir dir)
+static __always_inline unsigned long ptrace_save_reg(struct pt_regs *regs,
+                                                    enum ptrace_syscall_dir 
dir,
+                                                    int *regno)
 {
-       int regno;
        unsigned long saved_reg;
 
        /*
@@ -2338,15 +2339,31 @@ static void report_syscall(struct pt_regs *regs, enum 
ptrace_syscall_dir dir)
         * - Syscall stops behave differently to seccomp and pseudo-step traps
         *   (the latter do not nobble any registers).
         */
-       regno = (is_compat_task() ? 12 : 7);
-       saved_reg = regs->regs[regno];
-       regs->regs[regno] = dir;
+       *regno = (is_compat_task() ? 12 : 7);
+       saved_reg = regs->regs[*regno];
+       regs->regs[*regno] = dir;
 
-       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)) {
+       return saved_reg;
+}
+
+static void report_syscall_entry(struct pt_regs *regs)
+{
+       unsigned long saved_reg;
+       int regno;
+
+       saved_reg = ptrace_save_reg(regs, PTRACE_SYSCALL_ENTER, &regno);
+       if (ptrace_report_syscall_entry(regs))
+               forget_syscall(regs);
+       regs->regs[regno] = saved_reg;
+}
+
+static void report_syscall_exit(struct pt_regs *regs)
+{
+       unsigned long saved_reg;
+       int regno;
+
+       saved_reg = ptrace_save_reg(regs, PTRACE_SYSCALL_EXIT, &regno);
+       if (!test_thread_flag(TIF_SINGLESTEP)) {
                ptrace_report_syscall_exit(regs, 0);
                regs->regs[regno] = saved_reg;
        } else {
@@ -2366,7 +2383,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_entry(regs);
                if (flags & _TIF_SYSCALL_EMU)
                        return NO_SYSCALL;
        }
@@ -2394,7 +2411,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


Reply via email to