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