diff options
Diffstat (limited to 'arch/arm/kernel/ptrace.c')
| -rw-r--r-- | arch/arm/kernel/ptrace.c | 17 | 
1 files changed, 13 insertions, 4 deletions
diff --git a/arch/arm/kernel/ptrace.c b/arch/arm/kernel/ptrace.c index e1d5e1929fb..ede6443c34d 100644 --- a/arch/arm/kernel/ptrace.c +++ b/arch/arm/kernel/ptrace.c @@ -23,6 +23,7 @@  #include <linux/perf_event.h>  #include <linux/hw_breakpoint.h>  #include <linux/regset.h> +#include <linux/audit.h>  #include <asm/pgtable.h>  #include <asm/system.h> @@ -699,10 +700,13 @@ static int vfp_set(struct task_struct *target,  {  	int ret;  	struct thread_info *thread = task_thread_info(target); -	struct vfp_hard_struct new_vfp = thread->vfpstate.hard; +	struct vfp_hard_struct new_vfp;  	const size_t user_fpregs_offset = offsetof(struct user_vfp, fpregs);  	const size_t user_fpscr_offset = offsetof(struct user_vfp, fpscr); +	vfp_sync_hwstate(thread); +	new_vfp = thread->vfpstate.hard; +  	ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,  				  &new_vfp.fpregs,  				  user_fpregs_offset, @@ -723,9 +727,8 @@ static int vfp_set(struct task_struct *target,  	if (ret)  		return ret; -	vfp_sync_hwstate(thread); -	thread->vfpstate.hard = new_vfp;  	vfp_flush_hwstate(thread); +	thread->vfpstate.hard = new_vfp;  	return 0;  } @@ -902,6 +905,12 @@ long arch_ptrace(struct task_struct *child, long request,  	return ret;  } +#ifdef __ARMEB__ +#define AUDIT_ARCH_NR AUDIT_ARCH_ARMEB +#else +#define AUDIT_ARCH_NR AUDIT_ARCH_ARM +#endif +  asmlinkage int syscall_trace(int why, struct pt_regs *regs, int scno)  {  	unsigned long ip; @@ -916,7 +925,7 @@ asmlinkage int syscall_trace(int why, struct pt_regs *regs, int scno)  	if (!ip)  		audit_syscall_exit(regs);  	else -		audit_syscall_entry(AUDIT_ARCH_ARMEB, scno, regs->ARM_r0, +		audit_syscall_entry(AUDIT_ARCH_NR, scno, regs->ARM_r0,  				    regs->ARM_r1, regs->ARM_r2, regs->ARM_r3);  	if (!test_thread_flag(TIF_SYSCALL_TRACE))  |