diff options
Diffstat (limited to 'arch/mips/kernel/ptrace.c')
| -rw-r--r-- | arch/mips/kernel/ptrace.c | 38 |
1 files changed, 28 insertions, 10 deletions
diff --git a/arch/mips/kernel/ptrace.c b/arch/mips/kernel/ptrace.c index a2f899c2f4d4..92e70ca3bff9 100644 --- a/arch/mips/kernel/ptrace.c +++ b/arch/mips/kernel/ptrace.c | |||
| @@ -301,25 +301,38 @@ out: | |||
| 301 | return ret; | 301 | return ret; |
| 302 | } | 302 | } |
| 303 | 303 | ||
| 304 | static inline int audit_arch(void) | ||
| 305 | { | ||
| 306 | #ifdef CONFIG_CPU_LITTLE_ENDIAN | ||
| 307 | #ifdef CONFIG_MIPS64 | ||
| 308 | if (!(current->thread.mflags & MF_32BIT_REGS)) | ||
| 309 | return AUDIT_ARCH_MIPSEL64; | ||
| 310 | #endif /* MIPS64 */ | ||
| 311 | return AUDIT_ARCH_MIPSEL; | ||
| 312 | |||
| 313 | #else /* big endian... */ | ||
| 314 | #ifdef CONFIG_MIPS64 | ||
| 315 | if (!(current->thread.mflags & MF_32BIT_REGS)) | ||
| 316 | return AUDIT_ARCH_MIPS64; | ||
| 317 | #endif /* MIPS64 */ | ||
| 318 | return AUDIT_ARCH_MIPS; | ||
| 319 | |||
| 320 | #endif /* endian */ | ||
| 321 | } | ||
| 322 | |||
| 304 | /* | 323 | /* |
| 305 | * Notification of system call entry/exit | 324 | * Notification of system call entry/exit |
| 306 | * - triggered by current->work.syscall_trace | 325 | * - triggered by current->work.syscall_trace |
| 307 | */ | 326 | */ |
| 308 | asmlinkage void do_syscall_trace(struct pt_regs *regs, int entryexit) | 327 | asmlinkage void do_syscall_trace(struct pt_regs *regs, int entryexit) |
| 309 | { | 328 | { |
| 310 | if (unlikely(current->audit_context)) { | 329 | if (unlikely(current->audit_context) && entryexit) |
| 311 | if (!entryexit) | 330 | audit_syscall_exit(current, AUDITSC_RESULT(regs->regs[2]), regs->regs[2]); |
| 312 | audit_syscall_entry(current, regs->regs[2], | ||
| 313 | regs->regs[4], regs->regs[5], | ||
| 314 | regs->regs[6], regs->regs[7]); | ||
| 315 | else | ||
| 316 | audit_syscall_exit(current, regs->regs[2]); | ||
| 317 | } | ||
| 318 | 331 | ||
| 319 | if (!test_thread_flag(TIF_SYSCALL_TRACE)) | 332 | if (!test_thread_flag(TIF_SYSCALL_TRACE)) |
| 320 | return; | 333 | goto out; |
| 321 | if (!(current->ptrace & PT_PTRACED)) | 334 | if (!(current->ptrace & PT_PTRACED)) |
| 322 | return; | 335 | goto out; |
| 323 | 336 | ||
| 324 | /* The 0x80 provides a way for the tracing parent to distinguish | 337 | /* The 0x80 provides a way for the tracing parent to distinguish |
| 325 | between a syscall stop and SIGTRAP delivery */ | 338 | between a syscall stop and SIGTRAP delivery */ |
| @@ -335,4 +348,9 @@ asmlinkage void do_syscall_trace(struct pt_regs *regs, int entryexit) | |||
| 335 | send_sig(current->exit_code, current, 1); | 348 | send_sig(current->exit_code, current, 1); |
| 336 | current->exit_code = 0; | 349 | current->exit_code = 0; |
| 337 | } | 350 | } |
| 351 | out: | ||
| 352 | if (unlikely(current->audit_context) && !entryexit) | ||
| 353 | audit_syscall_entry(current, audit_arch(), regs->regs[2], | ||
| 354 | regs->regs[4], regs->regs[5], | ||
| 355 | regs->regs[6], regs->regs[7]); | ||
| 338 | } | 356 | } |
