mirror of
https://github.com/adulau/aha.git
synced 2025-01-01 21:53:18 +00:00
x86: traps_xx: restructure do_general_protection()
- if (cond) block -> if (!cond) goto end_of_block - local caching of current Signed-off-by: Alexander van Heukelum <heukelum@fastmail.fm> Acked-by: Cyrill Gorcunov <gorcunov@gmail.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
a7bbb0ce1d
commit
13485ab55b
2 changed files with 41 additions and 34 deletions
|
@ -598,8 +598,10 @@ DO_ERROR(12, SIGBUS, "stack segment", stack_segment)
|
|||
DO_ERROR_INFO(17, SIGBUS, "alignment check", alignment_check, BUS_ADRALN, 0, 0)
|
||||
DO_ERROR_INFO(32, SIGILL, "iret exception", iret_error, ILL_BADSTK, 0, 1)
|
||||
|
||||
void __kprobes do_general_protection(struct pt_regs *regs, long error_code)
|
||||
void __kprobes
|
||||
do_general_protection(struct pt_regs *regs, long error_code)
|
||||
{
|
||||
struct task_struct *tsk;
|
||||
struct thread_struct *thread;
|
||||
struct tss_struct *tss;
|
||||
int cpu;
|
||||
|
@ -640,23 +642,24 @@ void __kprobes do_general_protection(struct pt_regs *regs, long error_code)
|
|||
if (regs->flags & X86_VM_MASK)
|
||||
goto gp_in_vm86;
|
||||
|
||||
tsk = current;
|
||||
if (!user_mode(regs))
|
||||
goto gp_in_kernel;
|
||||
|
||||
current->thread.error_code = error_code;
|
||||
current->thread.trap_no = 13;
|
||||
tsk->thread.error_code = error_code;
|
||||
tsk->thread.trap_no = 13;
|
||||
|
||||
if (show_unhandled_signals && unhandled_signal(current, SIGSEGV) &&
|
||||
printk_ratelimit()) {
|
||||
if (show_unhandled_signals && unhandled_signal(tsk, SIGSEGV) &&
|
||||
printk_ratelimit()) {
|
||||
printk(KERN_INFO
|
||||
"%s[%d] general protection ip:%lx sp:%lx error:%lx",
|
||||
current->comm, task_pid_nr(current),
|
||||
regs->ip, regs->sp, error_code);
|
||||
"%s[%d] general protection ip:%lx sp:%lx error:%lx",
|
||||
tsk->comm, task_pid_nr(tsk),
|
||||
regs->ip, regs->sp, error_code);
|
||||
print_vma_addr(" in ", regs->ip);
|
||||
printk("\n");
|
||||
}
|
||||
|
||||
force_sig(SIGSEGV, current);
|
||||
force_sig(SIGSEGV, tsk);
|
||||
return;
|
||||
|
||||
gp_in_vm86:
|
||||
|
@ -665,14 +668,15 @@ gp_in_vm86:
|
|||
return;
|
||||
|
||||
gp_in_kernel:
|
||||
if (!fixup_exception(regs)) {
|
||||
current->thread.error_code = error_code;
|
||||
current->thread.trap_no = 13;
|
||||
if (notify_die(DIE_GPF, "general protection fault", regs,
|
||||
if (fixup_exception(regs))
|
||||
return;
|
||||
|
||||
tsk->thread.error_code = error_code;
|
||||
tsk->thread.trap_no = 13;
|
||||
if (notify_die(DIE_GPF, "general protection fault", regs,
|
||||
error_code, 13, SIGSEGV) == NOTIFY_STOP)
|
||||
return;
|
||||
die("general protection fault", regs, error_code);
|
||||
}
|
||||
return;
|
||||
die("general protection fault", regs, error_code);
|
||||
}
|
||||
|
||||
static notrace __kprobes void
|
||||
|
|
|
@ -733,31 +733,34 @@ asmlinkage void do_double_fault(struct pt_regs * regs, long error_code)
|
|||
die(str, regs, error_code);
|
||||
}
|
||||
|
||||
asmlinkage void __kprobes do_general_protection(struct pt_regs * regs,
|
||||
long error_code)
|
||||
asmlinkage void __kprobes
|
||||
do_general_protection(struct pt_regs *regs, long error_code)
|
||||
{
|
||||
struct task_struct *tsk = current;
|
||||
struct task_struct *tsk;
|
||||
|
||||
conditional_sti(regs);
|
||||
|
||||
if (user_mode(regs)) {
|
||||
tsk->thread.error_code = error_code;
|
||||
tsk->thread.trap_no = 13;
|
||||
tsk = current;
|
||||
if (!user_mode(regs))
|
||||
goto gp_in_kernel;
|
||||
|
||||
if (show_unhandled_signals && unhandled_signal(tsk, SIGSEGV) &&
|
||||
printk_ratelimit()) {
|
||||
printk(KERN_INFO
|
||||
"%s[%d] general protection ip:%lx sp:%lx error:%lx",
|
||||
tsk->comm, tsk->pid,
|
||||
regs->ip, regs->sp, error_code);
|
||||
print_vma_addr(" in ", regs->ip);
|
||||
printk("\n");
|
||||
}
|
||||
tsk->thread.error_code = error_code;
|
||||
tsk->thread.trap_no = 13;
|
||||
|
||||
force_sig(SIGSEGV, tsk);
|
||||
return;
|
||||
}
|
||||
if (show_unhandled_signals && unhandled_signal(tsk, SIGSEGV) &&
|
||||
printk_ratelimit()) {
|
||||
printk(KERN_INFO
|
||||
"%s[%d] general protection ip:%lx sp:%lx error:%lx",
|
||||
tsk->comm, tsk->pid,
|
||||
regs->ip, regs->sp, error_code);
|
||||
print_vma_addr(" in ", regs->ip);
|
||||
printk("\n");
|
||||
}
|
||||
|
||||
force_sig(SIGSEGV, tsk);
|
||||
return;
|
||||
|
||||
gp_in_kernel:
|
||||
if (fixup_exception(regs))
|
||||
return;
|
||||
|
||||
|
|
Loading…
Reference in a new issue