Author: kib
Date: Sun Aug 20 09:52:25 2017
New Revision: 322720
URL: https://svnweb.freebsd.org/changeset/base/322720

Log:
  Simplify amd64 trap().
  
  - Use more relevant name 'signo' instead of 'i' for the local variable
    which contains a signal number to send for the current exception.
  - Eliminate two labels 'userout' and 'out' which point to the very end
    of the trap() function.  Instead use return directly.
  - Re-indent the prot_fault_translation block by reducing if() nesting.
  - Some more monor style changes.
  
  Requested and reviewed by:    bde
  Tested by:    pho
  Sponsored by: The FreeBSD Foundation
  MFC after:    1 week

Modified:
  head/sys/amd64/amd64/trap.c

Modified: head/sys/amd64/amd64/trap.c
==============================================================================
--- head/sys/amd64/amd64/trap.c Sun Aug 20 09:42:09 2017        (r322719)
+++ head/sys/amd64/amd64/trap.c Sun Aug 20 09:52:25 2017        (r322720)
@@ -172,12 +172,12 @@ trap(struct trapframe *frame)
 #ifdef KDB
        register_t dr6;
 #endif
-       int i, ucode;
+       int signo, ucode;
        u_int type;
 
        td = curthread;
        p = td->td_proc;
-       i = 0;
+       signo = 0;
        ucode = 0;
        addr = 0;
 
@@ -186,22 +186,20 @@ trap(struct trapframe *frame)
 
 #ifdef SMP
        /* Handler for NMI IPIs used for stopping CPUs. */
-       if (type == T_NMI) {
-                if (ipi_nmi_handler() == 0)
-                          goto out;
-       }
-#endif /* SMP */
+       if (type == T_NMI && ipi_nmi_handler() == 0)
+               return;
+#endif
 
 #ifdef KDB
        if (kdb_active) {
                kdb_reenter();
-               goto out;
+               return;
        }
 #endif
 
        if (type == T_RESERVED) {
                trap_fatal(frame, 0);
-               goto out;
+               return;
        }
 
        if (type == T_NMI) {
@@ -214,18 +212,18 @@ trap(struct trapframe *frame)
                 */
                if (pmc_intr != NULL &&
                    (*pmc_intr)(PCPU_GET(cpuid), frame) != 0)
-                       goto out;
+                       return;
 #endif
 
 #ifdef STACK
                if (stack_nmi_handler(frame) != 0)
-                       goto out;
+                       return;
 #endif
        }
 
        if (type == T_MCHK) {
                mca_intr();
-               goto out;
+               return;
        }
 
        if ((frame->tf_rflags & PSL_I) == 0) {
@@ -269,7 +267,7 @@ trap(struct trapframe *frame)
 
                switch (type) {
                case T_PRIVINFLT:       /* privileged instruction fault */
-                       i = SIGILL;
+                       signo = SIGILL;
                        ucode = ILL_PRVOPC;
                        break;
 
@@ -281,41 +279,41 @@ trap(struct trapframe *frame)
                                fill_frame_regs(frame, &regs);
                                if (dtrace_pid_probe_ptr != NULL &&
                                    dtrace_pid_probe_ptr(&regs) == 0)
-                                       goto out;
+                                       return;
                        }
 #endif
                        frame->tf_rflags &= ~PSL_T;
-                       i = SIGTRAP;
+                       signo = SIGTRAP;
                        ucode = (type == T_TRCTRAP ? TRAP_TRACE : TRAP_BRKPT);
                        break;
 
                case T_ARITHTRAP:       /* arithmetic trap */
                        ucode = fputrap_x87();
                        if (ucode == -1)
-                               goto userout;
-                       i = SIGFPE;
+                               return;
+                       signo = SIGFPE;
                        break;
 
                case T_PROTFLT:         /* general protection fault */
-                       i = SIGBUS;
+                       signo = SIGBUS;
                        ucode = BUS_OBJERR;
                        break;
                case T_STKFLT:          /* stack fault */
                case T_SEGNPFLT:        /* segment not present fault */
-                       i = SIGBUS;
+                       signo = SIGBUS;
                        ucode = BUS_ADRERR;
                        break;
                case T_TSSFLT:          /* invalid TSS fault */
-                       i = SIGBUS;
+                       signo = SIGBUS;
                        ucode = BUS_OBJERR;
                        break;
                case T_ALIGNFLT:
-                       i = SIGBUS;
+                       signo = SIGBUS;
                        ucode = BUS_ADRALN;
                        break;
                case T_DOUBLEFLT:       /* double fault */
                default:
-                       i = SIGBUS;
+                       signo = SIGBUS;
                        ucode = BUS_OBJERR;
                        break;
 
@@ -325,67 +323,64 @@ trap(struct trapframe *frame)
                         */
                        if (*p->p_sysent->sv_trap != NULL &&
                            (*p->p_sysent->sv_trap)(td) == 0)
-                               goto userout;
+                               return;
 
                        addr = frame->tf_addr;
-                       i = trap_pfault(frame, TRUE);
-                       if (i == -1)
-                               goto userout;
-                       if (i == 0)
-                               goto user;
-
-                       if (i == SIGSEGV)
+                       signo = trap_pfault(frame, TRUE);
+                       if (signo == -1)
+                               return;
+                       if (signo == 0)
+                               goto userret;
+                       if (signo == SIGSEGV) {
                                ucode = SEGV_MAPERR;
-                       else {
-                               if (prot_fault_translation == 0) {
-                                       /*
-                                        * Autodetect.
-                                        * This check also covers the images
-                                        * without the ABI-tag ELF note.
-                                        */
-                                       if (SV_CURPROC_ABI() == SV_ABI_FREEBSD
-                                           && p->p_osrel >= P_OSREL_SIGSEGV) {
-                                               i = SIGSEGV;
-                                               ucode = SEGV_ACCERR;
-                                       } else {
-                                               i = SIGBUS;
-                                               ucode = BUS_PAGE_FAULT;
-                                       }
-                               } else if (prot_fault_translation == 1) {
-                                       /*
-                                        * Always compat mode.
-                                        */
-                                       i = SIGBUS;
-                                       ucode = BUS_PAGE_FAULT;
-                               } else {
-                                       /*
-                                        * Always SIGSEGV mode.
-                                        */
-                                       i = SIGSEGV;
+                       } else if (prot_fault_translation == 0) {
+                               /*
+                                * Autodetect.  This check also covers
+                                * the images without the ABI-tag ELF
+                                * note.
+                                */
+                               if (SV_CURPROC_ABI() == SV_ABI_FREEBSD &&
+                                   p->p_osrel >= P_OSREL_SIGSEGV) {
+                                       signo = SIGSEGV;
                                        ucode = SEGV_ACCERR;
+                               } else {
+                                       signo = SIGBUS;
+                                       ucode = BUS_PAGE_FAULT;
                                }
+                       } else if (prot_fault_translation == 1) {
+                               /*
+                                * Always compat mode.
+                                */
+                               signo = SIGBUS;
+                               ucode = BUS_PAGE_FAULT;
+                       } else {
+                               /*
+                                * Always SIGSEGV mode.
+                                */
+                               signo = SIGSEGV;
+                               ucode = SEGV_ACCERR;
                        }
                        break;
 
                case T_DIVIDE:          /* integer divide fault */
                        ucode = FPE_INTDIV;
-                       i = SIGFPE;
+                       signo = SIGFPE;
                        break;
 
 #ifdef DEV_ISA
                case T_NMI:
                        nmi_handle_intr(type, frame);
-                       goto out;
-#endif /* DEV_ISA */
+                       return;
+#endif
 
                case T_OFLOW:           /* integer overflow fault */
                        ucode = FPE_INTOVF;
-                       i = SIGFPE;
+                       signo = SIGFPE;
                        break;
 
                case T_BOUND:           /* bounds check fault */
                        ucode = FPE_FLTSUB;
-                       i = SIGFPE;
+                       signo = SIGFPE;
                        break;
 
                case T_DNA:
@@ -393,18 +388,18 @@ trap(struct trapframe *frame)
                        KASSERT(PCB_USER_FPU(td->td_pcb),
                            ("kernel FPU ctx has leaked"));
                        fpudna();
-                       goto userout;
+                       return;
 
                case T_FPOPFLT:         /* FPU operand fetch fault */
                        ucode = ILL_COPROC;
-                       i = SIGILL;
+                       signo = SIGILL;
                        break;
 
                case T_XMMFLT:          /* SIMD floating-point exception */
                        ucode = fputrap_sse();
                        if (ucode == -1)
-                               goto userout;
-                       i = SIGFPE;
+                               return;
+                       signo = SIGFPE;
                        break;
 #ifdef KDTRACE_HOOKS
                case T_DTRACE_RET:
@@ -412,8 +407,8 @@ trap(struct trapframe *frame)
                        fill_frame_regs(frame, &regs);
                        if (dtrace_return_probe_ptr != NULL &&
                            dtrace_return_probe_ptr(&regs) == 0)
-                               goto out;
-                       goto userout;
+                               return;
+                       return;
 #endif
                }
        } else {
@@ -424,13 +419,13 @@ trap(struct trapframe *frame)
                switch (type) {
                case T_PAGEFLT:                 /* page fault */
                        (void) trap_pfault(frame, FALSE);
-                       goto out;
+                       return;
 
                case T_DNA:
                        if (PCB_USER_FPU(td->td_pcb))
                                panic("Unregistered use of FPU in kernel");
                        fpudna();
-                       goto out;
+                       return;
 
                case T_ARITHTRAP:       /* arithmetic trap */
                case T_XMMFLT:          /* SIMD floating-point exception */
@@ -440,7 +435,7 @@ trap(struct trapframe *frame)
                         * registration for FPU traps is overkill.
                         */
                        trap_fatal(frame, 0);
-                       goto out;
+                       return;
 
                case T_STKFLT:          /* stack fault */
                case T_PROTFLT:         /* general protection fault */
@@ -460,35 +455,35 @@ trap(struct trapframe *frame)
                         */
                        if (frame->tf_rip == (long)doreti_iret) {
                                frame->tf_rip = (long)doreti_iret_fault;
-                               goto out;
+                               return;
                        }
                        if (frame->tf_rip == (long)ld_ds) {
                                frame->tf_rip = (long)ds_load_fault;
-                               goto out;
+                               return;
                        }
                        if (frame->tf_rip == (long)ld_es) {
                                frame->tf_rip = (long)es_load_fault;
-                               goto out;
+                               return;
                        }
                        if (frame->tf_rip == (long)ld_fs) {
                                frame->tf_rip = (long)fs_load_fault;
-                               goto out;
+                               return;
                        }
                        if (frame->tf_rip == (long)ld_gs) {
                                frame->tf_rip = (long)gs_load_fault;
-                               goto out;
+                               return;
                        }
                        if (frame->tf_rip == (long)ld_gsbase) {
                                frame->tf_rip = (long)gsbase_load_fault;
-                               goto out;
+                               return;
                        }
                        if (frame->tf_rip == (long)ld_fsbase) {
                                frame->tf_rip = (long)fsbase_load_fault;
-                               goto out;
+                               return;
                        }
                        if (curpcb->pcb_onfault != NULL) {
                                frame->tf_rip = (long)curpcb->pcb_onfault;
-                               goto out;
+                               return;
                        }
                        break;
 
@@ -504,7 +499,7 @@ trap(struct trapframe *frame)
                         */
                        if (frame->tf_rflags & PSL_NT) {
                                frame->tf_rflags &= ~PSL_NT;
-                               goto out;
+                               return;
                        }
                        break;
 
@@ -525,7 +520,7 @@ trap(struct trapframe *frame)
                                 * processor doesn't
                                 */
                                load_dr6(rdr6() & ~0xf);
-                               goto out;
+                               return;
                        }
                        /*
                         * FALLTHROUGH (TRCTRAP kernel mode, kernel address)
@@ -540,27 +535,27 @@ trap(struct trapframe *frame)
                        dr6 = rdr6();
                        load_dr6(dr6 & ~0x4000);
                        if (kdb_trap(type, dr6, frame))
-                               goto out;
+                               return;
 #endif
                        break;
 
 #ifdef DEV_ISA
                case T_NMI:
                        nmi_handle_intr(type, frame);
-                       goto out;
-#endif /* DEV_ISA */
+                       return;
+#endif
                }
 
                trap_fatal(frame, 0);
-               goto out;
+               return;
        }
 
        /* Translate fault for emulators (e.g. Linux) */
-       if (*p->p_sysent->sv_transtrap)
-               i = (*p->p_sysent->sv_transtrap)(i, type);
+       if (*p->p_sysent->sv_transtrap != NULL)
+               signo = (*p->p_sysent->sv_transtrap)(signo, type);
 
        ksiginfo_init_trap(&ksi);
-       ksi.ksi_signo = i;
+       ksi.ksi_signo = signo;
        ksi.ksi_code = ucode;
        ksi.ksi_trapno = type;
        ksi.ksi_addr = (void *)addr;
@@ -568,8 +563,8 @@ trap(struct trapframe *frame)
                uprintf("pid %d comm %s: signal %d err %lx code %d type %d "
                    "addr 0x%lx rsp 0x%lx rip 0x%lx "
                    "<%02x %02x %02x %02x %02x %02x %02x %02x>\n",
-                   p->p_pid, p->p_comm, i, frame->tf_err, ucode, type, addr,
-                   frame->tf_rsp, frame->tf_rip,
+                   p->p_pid, p->p_comm, signo, frame->tf_err, ucode, type,
+                   addr, frame->tf_rsp, frame->tf_rip,
                    fubyte((void *)(frame->tf_rip + 0)),
                    fubyte((void *)(frame->tf_rip + 1)),
                    fubyte((void *)(frame->tf_rip + 2)),
@@ -581,14 +576,10 @@ trap(struct trapframe *frame)
        }
        KASSERT((read_rflags() & PSL_I) != 0, ("interrupts disabled"));
        trapsignal(td, &ksi);
-
-user:
+userret:
        userret(td, frame);
        KASSERT(PCB_USER_FPU(td->td_pcb),
            ("Return from trap with kernel FPU ctx leaked"));
-userout:
-out:
-       return;
 }
 
 /*
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to