Print this page

        

@@ -26,20 +26,20 @@
 #include <sys/asm_linkage.h>
 #include <sys/asm_misc.h>
 #include <sys/regset.h>
 #include <sys/privregs.h>
 #include <sys/psw.h>
-#include <sys/machbrand.h>
 
 #if defined(__lint)
 
 #include <sys/types.h>
 #include <sys/thread.h>
 #include <sys/systm.h>
 
 #else   /* __lint */
 
+#include <sys/machbrand.h>
 #include <sys/segments.h>
 #include <sys/pcb.h>
 #include <sys/trap.h>
 #include <sys/ftrace.h>
 #include <sys/traptrace.h>

@@ -529,26 +529,17 @@
         subq    $8, %rsp        /* align stack for call to C */
         call    *%rdi
         addq    $8, %rsp
 
         /*
-         * If the alternate handler returns non-zero, the normal system call
-         * processing is resumed.
+         * If the alternate handler returns 0, we skip straight to the return to
+         * usermode.  Otherwise, we resume regular system call processing.
          */
         testl   %eax, %eax
         popq    %rax
-        jnz     _syscall_no_brand
+        jz      _syscall_after_brand
 
-        /*
-         * For branded syscalls which were handled in-kernel, shuffle the
-         * register state as would be done by the native handler before jumping
-         * to the post-syscall logic.
-         */
-        movq    REGOFF_RAX(%rsp), %r12
-        movq    REGOFF_RDX(%rsp), %r13
-        jmp     _syscall_after_brand
-
 _syscall_no_brand:
         movw    %ax, T_SYSNUM(%r15)
         movzbl  T_PRE_SYS(%r15), %ebx
         ORL_SYSCALLTRACE(%ebx)
         testl   %ebx, %ebx

@@ -838,25 +829,16 @@
 
         movb    $LWP_SYS, LWP_STATE(%r14)
         call    *%rax
 
         /*
-         * If the alternate handler returns non-zero, the normal system call
-         * processing is resumed.
+         * If the alternate handler returns 0, we skip straight to the return
+         * to usermode.  Otherwise, we resume regular system call processing.
          */
         testl   %eax, %eax
-        jnz     _syscall32_no_brand
+        jz      _syscall32_after_brand
 
-        /*
-         * For branded syscalls which were handled in-kernel, shuffle the
-         * register state as would be done by the native handler before jumping
-         * to the post-syscall logic.
-         */
-        movl    REGOFF_RAX(%rsp), %r12d
-        movl    REGOFF_RDX(%rsp), %r13d
-        jmp     _syscall32_after_brand
-
 _syscall32_no_brand:
         /*
          * Make some space for MAXSYSARGS (currently 8) 32-bit args placed
          * into 64-bit (long) arg slots, maintaining 16 byte alignment.  Or
          * more succinctly:

@@ -1253,11 +1235,10 @@
 #else   /* __lint */
 
         ENTRY_NP(brand_sys_int80)
         SWAPGS                          /* kernel gsbase */
         XPV_TRAP_POP
-        call    smap_enable
 
         /*
          * We first attempt to call the "b_int80" handler from the "struct
          * brand_mach_ops" for this brand.  If no handler function is installed
          * for this brand, the BRAND_CALLBACK() macro returns here and we

@@ -1292,11 +1273,10 @@
          * code and fake a GP fault. Note on 64-bit hypervisor we need
          * to undo the XPV_TRAP_POP and push rcx and r11 back on the stack
          * because gptrap will pop them again with its own XPV_TRAP_POP.
          */
         XPV_TRAP_POP
-        call    smap_enable
 nopop_int80:
         subq    $2, (%rsp)      /* int insn 2-bytes */
         pushq   $_CONST(_MUL(T_INT80, GATE_DESC_SIZE) + 2)
 #if defined(__xpv)
         push    %r11