diff options
author | David S. Miller <davem@davemloft.net> | 2008-08-24 23:10:23 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-08-24 23:34:31 -0400 |
commit | fe06ccaad20257e3bd348b2df9e811fd92211a80 (patch) | |
tree | a5bcaa12ada3428e58524cbdedc0f1bf60bb04b7 /arch/sparc64/kernel/ptrace.c | |
parent | 15df0f3302fdecaa97da0b95d72b3a9a59be8692 (diff) |
sparc64: Split syscall_trace() into two functions.
Christoph Hellwig noticed that having both entry and exit
logic in one function no longer makes sense, and having
seperate ones simplifies things a lot.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'arch/sparc64/kernel/ptrace.c')
-rw-r--r-- | arch/sparc64/kernel/ptrace.c | 38 |
1 files changed, 20 insertions, 18 deletions
diff --git a/arch/sparc64/kernel/ptrace.c b/arch/sparc64/kernel/ptrace.c index bd578cc4856d..db2ddf2e829e 100644 --- a/arch/sparc64/kernel/ptrace.c +++ b/arch/sparc64/kernel/ptrace.c | |||
@@ -1050,31 +1050,17 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
1050 | return ret; | 1050 | return ret; |
1051 | } | 1051 | } |
1052 | 1052 | ||
1053 | asmlinkage int syscall_trace(struct pt_regs *regs, int syscall_exit_p) | 1053 | asmlinkage int syscall_trace_enter(struct pt_regs *regs) |
1054 | { | 1054 | { |
1055 | int ret = 0; | 1055 | int ret = 0; |
1056 | 1056 | ||
1057 | /* do the secure computing check first */ | 1057 | /* do the secure computing check first */ |
1058 | secure_computing(regs->u_regs[UREG_G1]); | 1058 | secure_computing(regs->u_regs[UREG_G1]); |
1059 | 1059 | ||
1060 | if (unlikely(current->audit_context) && syscall_exit_p) { | 1060 | if (test_thread_flag(TIF_SYSCALL_TRACE)) |
1061 | unsigned long tstate = regs->tstate; | 1061 | ret = tracehook_report_syscall_entry(regs); |
1062 | int result = AUDITSC_SUCCESS; | ||
1063 | |||
1064 | if (unlikely(tstate & (TSTATE_XCARRY | TSTATE_ICARRY))) | ||
1065 | result = AUDITSC_FAILURE; | ||
1066 | |||
1067 | audit_syscall_exit(result, regs->u_regs[UREG_I0]); | ||
1068 | } | ||
1069 | |||
1070 | if (test_thread_flag(TIF_SYSCALL_TRACE)) { | ||
1071 | if (syscall_exit_p) | ||
1072 | tracehook_report_syscall_exit(regs, 0); | ||
1073 | else | ||
1074 | ret = tracehook_report_syscall_entry(regs); | ||
1075 | } | ||
1076 | 1062 | ||
1077 | if (unlikely(current->audit_context) && !syscall_exit_p && !ret) | 1063 | if (unlikely(current->audit_context) && !ret) |
1078 | audit_syscall_entry((test_thread_flag(TIF_32BIT) ? | 1064 | audit_syscall_entry((test_thread_flag(TIF_32BIT) ? |
1079 | AUDIT_ARCH_SPARC : | 1065 | AUDIT_ARCH_SPARC : |
1080 | AUDIT_ARCH_SPARC64), | 1066 | AUDIT_ARCH_SPARC64), |
@@ -1086,3 +1072,19 @@ asmlinkage int syscall_trace(struct pt_regs *regs, int syscall_exit_p) | |||
1086 | 1072 | ||
1087 | return ret; | 1073 | return ret; |
1088 | } | 1074 | } |
1075 | |||
1076 | asmlinkage void syscall_trace_leave(struct pt_regs *regs) | ||
1077 | { | ||
1078 | if (unlikely(current->audit_context)) { | ||
1079 | unsigned long tstate = regs->tstate; | ||
1080 | int result = AUDITSC_SUCCESS; | ||
1081 | |||
1082 | if (unlikely(tstate & (TSTATE_XCARRY | TSTATE_ICARRY))) | ||
1083 | result = AUDITSC_FAILURE; | ||
1084 | |||
1085 | audit_syscall_exit(result, regs->u_regs[UREG_I0]); | ||
1086 | } | ||
1087 | |||
1088 | if (test_thread_flag(TIF_SYSCALL_TRACE)) | ||
1089 | tracehook_report_syscall_exit(regs, 0); | ||
1090 | } | ||