mirror of
https://github.com/adulau/aha.git
synced 2025-01-04 07:03:38 +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(17, SIGBUS, "alignment check", alignment_check, BUS_ADRALN, 0, 0)
|
||||||
DO_ERROR_INFO(32, SIGILL, "iret exception", iret_error, ILL_BADSTK, 0, 1)
|
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 thread_struct *thread;
|
||||||
struct tss_struct *tss;
|
struct tss_struct *tss;
|
||||||
int cpu;
|
int cpu;
|
||||||
|
@ -640,23 +642,24 @@ void __kprobes do_general_protection(struct pt_regs *regs, long error_code)
|
||||||
if (regs->flags & X86_VM_MASK)
|
if (regs->flags & X86_VM_MASK)
|
||||||
goto gp_in_vm86;
|
goto gp_in_vm86;
|
||||||
|
|
||||||
|
tsk = current;
|
||||||
if (!user_mode(regs))
|
if (!user_mode(regs))
|
||||||
goto gp_in_kernel;
|
goto gp_in_kernel;
|
||||||
|
|
||||||
current->thread.error_code = error_code;
|
tsk->thread.error_code = error_code;
|
||||||
current->thread.trap_no = 13;
|
tsk->thread.trap_no = 13;
|
||||||
|
|
||||||
if (show_unhandled_signals && unhandled_signal(current, SIGSEGV) &&
|
if (show_unhandled_signals && unhandled_signal(tsk, SIGSEGV) &&
|
||||||
printk_ratelimit()) {
|
printk_ratelimit()) {
|
||||||
printk(KERN_INFO
|
printk(KERN_INFO
|
||||||
"%s[%d] general protection ip:%lx sp:%lx error:%lx",
|
"%s[%d] general protection ip:%lx sp:%lx error:%lx",
|
||||||
current->comm, task_pid_nr(current),
|
tsk->comm, task_pid_nr(tsk),
|
||||||
regs->ip, regs->sp, error_code);
|
regs->ip, regs->sp, error_code);
|
||||||
print_vma_addr(" in ", regs->ip);
|
print_vma_addr(" in ", regs->ip);
|
||||||
printk("\n");
|
printk("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
force_sig(SIGSEGV, current);
|
force_sig(SIGSEGV, tsk);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
gp_in_vm86:
|
gp_in_vm86:
|
||||||
|
@ -665,14 +668,15 @@ gp_in_vm86:
|
||||||
return;
|
return;
|
||||||
|
|
||||||
gp_in_kernel:
|
gp_in_kernel:
|
||||||
if (!fixup_exception(regs)) {
|
if (fixup_exception(regs))
|
||||||
current->thread.error_code = error_code;
|
return;
|
||||||
current->thread.trap_no = 13;
|
|
||||||
if (notify_die(DIE_GPF, "general protection fault", regs,
|
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)
|
error_code, 13, SIGSEGV) == NOTIFY_STOP)
|
||||||
return;
|
return;
|
||||||
die("general protection fault", regs, error_code);
|
die("general protection fault", regs, error_code);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static notrace __kprobes void
|
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);
|
die(str, regs, error_code);
|
||||||
}
|
}
|
||||||
|
|
||||||
asmlinkage void __kprobes do_general_protection(struct pt_regs * regs,
|
asmlinkage void __kprobes
|
||||||
long error_code)
|
do_general_protection(struct pt_regs *regs, long error_code)
|
||||||
{
|
{
|
||||||
struct task_struct *tsk = current;
|
struct task_struct *tsk;
|
||||||
|
|
||||||
conditional_sti(regs);
|
conditional_sti(regs);
|
||||||
|
|
||||||
if (user_mode(regs)) {
|
tsk = current;
|
||||||
tsk->thread.error_code = error_code;
|
if (!user_mode(regs))
|
||||||
tsk->thread.trap_no = 13;
|
goto gp_in_kernel;
|
||||||
|
|
||||||
if (show_unhandled_signals && unhandled_signal(tsk, SIGSEGV) &&
|
tsk->thread.error_code = error_code;
|
||||||
printk_ratelimit()) {
|
tsk->thread.trap_no = 13;
|
||||||
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);
|
if (show_unhandled_signals && unhandled_signal(tsk, SIGSEGV) &&
|
||||||
return;
|
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))
|
if (fixup_exception(regs))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue