Print this page

        

*** 26,45 **** #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/segments.h> #include <sys/pcb.h> #include <sys/trap.h> #include <sys/ftrace.h> #include <sys/traptrace.h> --- 26,45 ---- #include <sys/asm_linkage.h> #include <sys/asm_misc.h> #include <sys/regset.h> #include <sys/privregs.h> #include <sys/psw.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,554 **** 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. */ testl %eax, %eax popq %rax ! jnz _syscall_no_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 --- 529,545 ---- subq $8, %rsp /* align stack for call to C */ call *%rdi addq $8, %rsp /* ! * 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 ! jz _syscall_after_brand _syscall_no_brand: movw %ax, T_SYSNUM(%r15) movzbl T_PRE_SYS(%r15), %ebx ORL_SYSCALLTRACE(%ebx) testl %ebx, %ebx
*** 838,862 **** movb $LWP_SYS, LWP_STATE(%r14) call *%rax /* ! * If the alternate handler returns non-zero, the normal system call ! * processing is resumed. */ testl %eax, %eax ! jnz _syscall32_no_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: --- 829,844 ---- movb $LWP_SYS, LWP_STATE(%r14) call *%rax /* ! * If the alternate handler returns 0, we skip straight to the return ! * to usermode. Otherwise, we resume regular system call processing. */ testl %eax, %eax ! jz _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,1263 **** #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 --- 1235,1244 ----
*** 1292,1302 **** * 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 --- 1273,1282 ----