x86: Unspaghettize do_general_protection()
authorFrederic Weisbecker <fweisbec@gmail.com>
Mon, 24 Sep 2012 19:05:52 +0000 (21:05 +0200)
committerFrederic Weisbecker <fweisbec@gmail.com>
Wed, 26 Sep 2012 13:47:06 +0000 (15:47 +0200)
There is some unnatural label based layout in this function.
Convert the unnecessary goto to readable conditional blocks.

Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Ingo Molnar <mingo@kernel.org>
arch/x86/kernel/traps.c

index b481341c9369da649908b57c3e8c39b1586b0111..74850e5594498fb288721cb1fe80ff9589e7f260 100644 (file)
@@ -258,13 +258,25 @@ do_general_protection(struct pt_regs *regs, long error_code)
        conditional_sti(regs);
 
 #ifdef CONFIG_X86_32
-       if (regs->flags & X86_VM_MASK)
-               goto gp_in_vm86;
+       if (regs->flags & X86_VM_MASK) {
+               local_irq_enable();
+               handle_vm86_fault((struct kernel_vm86_regs *) regs, error_code);
+               return;
+       }
 #endif
 
        tsk = current;
-       if (!user_mode(regs))
-               goto gp_in_kernel;
+       if (!user_mode(regs)) {
+               if (fixup_exception(regs))
+                       return;
+
+               tsk->thread.error_code = error_code;
+               tsk->thread.trap_nr = X86_TRAP_GP;
+               if (!notify_die(DIE_GPF, "general protection fault", regs, error_code,
+                              X86_TRAP_GP, SIGSEGV) == NOTIFY_STOP)
+                       die("general protection fault", regs, error_code);
+               return;
+       }
 
        tsk->thread.error_code = error_code;
        tsk->thread.trap_nr = X86_TRAP_GP;
@@ -280,24 +292,6 @@ do_general_protection(struct pt_regs *regs, long error_code)
 
        force_sig(SIGSEGV, tsk);
        return;
-
-#ifdef CONFIG_X86_32
-gp_in_vm86:
-       local_irq_enable();
-       handle_vm86_fault((struct kernel_vm86_regs *) regs, error_code);
-       return;
-#endif
-
-gp_in_kernel:
-       if (fixup_exception(regs))
-               return;
-
-       tsk->thread.error_code = error_code;
-       tsk->thread.trap_nr = X86_TRAP_GP;
-       if (notify_die(DIE_GPF, "general protection fault", regs, error_code,
-                       X86_TRAP_GP, SIGSEGV) == NOTIFY_STOP)
-               return;
-       die("general protection fault", regs, error_code);
 }
 
 /* May run on IST stack. */