提交 aefab2b4 编写于 作者: E Eric W. Biederman

signal/arm64: For clarity separate the 3 signal sending cases in do_page_fault

It gets easy to confuse what is going on when some code is shared and some not
so stop sharing the trivial bits of signal generation to make future updates
easier to understand.
Reviewed-by: NCatalin Marinas <catalin.marinas@arm.com>
Tested-by: NCatalin Marinas <catalin.marinas@arm.com>
Signed-off-by: N"Eric W. Biederman" <ebiederm@xmission.com>
上级 9ea3a974
...@@ -567,16 +567,16 @@ static int __kprobes do_page_fault(unsigned long addr, unsigned int esr, ...@@ -567,16 +567,16 @@ static int __kprobes do_page_fault(unsigned long addr, unsigned int esr,
return 0; return 0;
} }
clear_siginfo(&si);
si.si_addr = (void __user *)addr;
if (fault & VM_FAULT_SIGBUS) { if (fault & VM_FAULT_SIGBUS) {
/* /*
* We had some memory, but were unable to successfully fix up * We had some memory, but were unable to successfully fix up
* this page fault. * this page fault.
*/ */
clear_siginfo(&si);
si.si_signo = SIGBUS; si.si_signo = SIGBUS;
si.si_code = BUS_ADRERR; si.si_code = BUS_ADRERR;
si.si_addr = (void __user *)addr;
__do_user_fault(&si, esr);
} else if (fault & (VM_FAULT_HWPOISON_LARGE | VM_FAULT_HWPOISON)) { } else if (fault & (VM_FAULT_HWPOISON_LARGE | VM_FAULT_HWPOISON)) {
unsigned int lsb; unsigned int lsb;
...@@ -584,20 +584,25 @@ static int __kprobes do_page_fault(unsigned long addr, unsigned int esr, ...@@ -584,20 +584,25 @@ static int __kprobes do_page_fault(unsigned long addr, unsigned int esr,
if (fault & VM_FAULT_HWPOISON_LARGE) if (fault & VM_FAULT_HWPOISON_LARGE)
lsb = hstate_index_to_shift(VM_FAULT_GET_HINDEX(fault)); lsb = hstate_index_to_shift(VM_FAULT_GET_HINDEX(fault));
clear_siginfo(&si);
si.si_signo = SIGBUS; si.si_signo = SIGBUS;
si.si_code = BUS_MCEERR_AR; si.si_code = BUS_MCEERR_AR;
si.si_addr = (void __user *)addr;
si.si_addr_lsb = lsb; si.si_addr_lsb = lsb;
__do_user_fault(&si, esr);
} else { } else {
/* /*
* Something tried to access memory that isn't in our memory * Something tried to access memory that isn't in our memory
* map. * map.
*/ */
clear_siginfo(&si);
si.si_signo = SIGSEGV; si.si_signo = SIGSEGV;
si.si_code = fault == VM_FAULT_BADACCESS ? si.si_code = fault == VM_FAULT_BADACCESS ?
SEGV_ACCERR : SEGV_MAPERR; SEGV_ACCERR : SEGV_MAPERR;
si.si_addr = (void __user *)addr;
__do_user_fault(&si, esr);
} }
__do_user_fault(&si, esr);
return 0; return 0;
no_context: no_context:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册