x86: introduce force_sig_info_fault helper to X86_64
PATCH 1/1 x86: introduce force_sig_info_fault helper to X86_64
Use the force_sig_info_fault helper from X86_32 in X86_64.
Signed-off-by Harvey Harrison <[email protected]>
--- arch/x86/mm/fault_32.c | 2 +- arch/x86/mm/fault_64.c | 31 ++++++++++++++++++------------- 2 files changed, 19 insertions(+), 14 deletions(-)
arch/x86/mm/fault_32.c +1 -1
@@ -249,7 +249,7 @@ static int is_prefetch(struct pt_regs *regs, unsigned long addr,return prefetch; } -static noinline void force_sig_info_fault(int si_signo, int si_code, +static void force_sig_info_fault (int si_signo,int si_code,unsigned long address,struct task_struct *tsk) {siginfo_t info;
arch/x86/mm/fault_64.c +18 -13
@@ -252,6 +252,18 @@ static int is_prefetch(struct pt_regs *regs, unsigned long addr,return prefetch; } +static void force_sig_info_fault (int si_signo,int si_code, +unsigned long address,struct task_struct *tsk) +{ +siginfo_t info; + + info.si_signo = si_signo; + info.si_errno =0 ; + info.si_code = si_code; + info.si_addr = (void __user *)address; +force_sig_info (si_signo, &info, tsk); +} +static int bad_address (void *p) {unsigned long dummy;
@@ -415,7 +427,7 @@ asmlinkage void __kprobes do_page_fault(struct pt_regs *regs,unsigned long address;int write, fault;unsigned long flags; -siginfo_t info; +int si_code;/* * We can fault from pretty much anywhere, with unknown IRQ state.
@@ -429,7 +441,7 @@ asmlinkage void __kprobes do_page_fault(struct pt_regs *regs,/* get the address */ address =read_cr2 (); - info.si_code =SEGV_MAPERR ; + si_code =SEGV_MAPERR ;/*
@@ -532,7 +544,7 @@ asmlinkage void __kprobes do_page_fault(struct pt_regs *regs,* we can handle it.. */ good_area: - info.si_code =SEGV_ACCERR ; + si_code =SEGV_ACCERR ; write =0 ;switch (error_code & (PF_PROT |PF_WRITE )) {default :/* 3: write, present */
@@ -611,11 +623,8 @@ bad_area_nosemaphore:/* Kernel addresses are always protection faults */ tsk->thread.error_code = error_code | (address >=TASK_SIZE ); tsk->thread.trap_no =14 ; - info.si_signo =SIGSEGV ; - info.si_errno =0 ; -/* info.si_code has been set above */ - info.si_addr = (void __user *)address; -force_sig_info (SIGSEGV , &info, tsk); + +force_sig_info_fault (SIGSEGV , si_code, address, tsk);return ; }
@@ -682,11 +691,7 @@ do_sigbus: tsk->thread.cr2 = address; tsk->thread.error_code = error_code; tsk->thread.trap_no =14 ; - info.si_signo =SIGBUS ; - info.si_errno =0 ; - info.si_code =BUS_ADRERR ; - info.si_addr = (void __user *)address; -force_sig_info (SIGBUS , &info, tsk); +force_sig_info_fault (SIGBUS ,BUS_ADRERR , address, tsk);return ; }
Signature · 1 line
1.5.4.rc2.1097.gb6e0d
Ingo Molnar
AppliedQuoted 1 line · Harvey Harrison
Use the
force_sig_info_faulthelper fromX86_32inX86_64.
thanks, applied.
Ingo