Home | History | Annotate | Download | only in sys
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License (the "License").
      6  * You may not use this file except in compliance with the License.
      7  *
      8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9  * or http://www.opensolaris.org/os/licensing.
     10  * See the License for the specific language governing permissions
     11  * and limitations under the License.
     12  *
     13  * When distributing Covered Code, include this CDDL HEADER in each
     14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15  * If applicable, add the following below this CDDL HEADER, with the
     16  * fields enclosed by brackets "[]" replaced with your own identifying
     17  * information: Portions Copyright [yyyy] [name of copyright owner]
     18  *
     19  * CDDL HEADER END
     20  */
     21 
     22 /*
     23  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
     24  * Use is subject to license terms.
     25  */
     26 
     27 	.file	"syscall.s"
     28 
     29 #include "SYS.h"
     30 
     31 	ANSI_PRAGMA_WEAK(syscall,function)
     32 
     33 	ENTRY(syscall)
     34 	pushq	%rbp
     35 	movq	%rsp, %rbp
     36 	/* construct a new call stack frame */
     37 	movl	%edi, %eax	/* sysnum */
     38 	movq	%rsi, %rdi	/* arg0 */
     39 	movq	%rdx, %rsi	/* arg1 */
     40 	movq	%rcx, %rdx	/* arg2 */
     41 	movq	%r8, %rcx	/* arg3 */
     42 	movq	%r9, %r8	/* arg4 */
     43 	movq	16(%rbp), %r9	/* arg5 */
     44 	movq	32(%rbp), %r10
     45 	pushq	%r10		/* arg7 */
     46 	movq	24(%rbp), %r10
     47 	pushq	%r10		/* arg6 */
     48 	movq	8(%rbp), %r10
     49 	pushq	%r10		/* return addr */
     50 	/* issue the system call */
     51 	movq	%rcx, %r10
     52 	syscall
     53 	/* restore the stack frame */
     54 	leave
     55 	SYSCERROR
     56 	ret
     57 	SET_SIZE(syscall)
     58 
     59 /*
     60  * Same as _syscall(), but restricted to 6 syscall arguments
     61  * so it doesn't need to incur the overhead of a new call stack frame.
     62  * Implemented for use only within libc; symbol is not exported.
     63  */
     64 	ENTRY(_syscall6)
     65 	movl	%edi, %eax	/* sysnum */
     66 	movq	%rsi, %rdi	/* arg0 */
     67 	movq	%rdx, %rsi	/* arg1 */
     68 	movq	%rcx, %rdx	/* arg2 */
     69 	movq	%r8, %rcx	/* arg3 */
     70 	movq	%r9, %r8	/* arg4 */
     71 	movq	8(%rsp), %r9	/* arg5 */
     72 	movq	%rcx, %r10
     73 	syscall
     74 	SYSCERROR
     75 	ret
     76 	SET_SIZE(_syscall6)
     77 
     78 	ENTRY(__systemcall)
     79 	pushq	%rbp
     80 	movq	%rsp, %rbp
     81 	/* construct a new call stack frame */
     82 	pushq	%rdi		/* sysret_t pointer */
     83 	movl	%esi, %eax	/* sysnum */
     84 	movq	%rdx, %rdi	/* arg0 */
     85 	movq	%rcx, %rsi	/* arg1 */
     86 	movq	%r8, %rdx	/* arg2 */
     87 	movq	%r9, %rcx	/* arg3 */
     88 	movq	16(%rbp), %r8	/* arg4 */
     89 	movq	24(%rbp), %r9	/* arg5 */
     90 	movq	40(%rbp), %r10
     91 	pushq	%r10		/* arg7 */
     92 	movq	32(%rbp), %r10
     93 	pushq	%r10		/* arg6 */
     94 	movq	8(%rbp), %r10
     95 	pushq	%r10		/* return addr */
     96 	/* issue the system call */
     97 	movq	%rcx, %r10
     98 	syscall
     99 	movq	-8(%rbp), %r10	/* sysret_t pointer */
    100 	jb	1f
    101 	movq	%rax, 0(%r10)	/* no error */
    102 	movq	%rdx, 8(%r10)
    103 	xorq	%rax, %rax
    104 	/* restore the stack frame */
    105 	leave
    106 	ret
    107 1:
    108 	movq	$-1, 0(%r10)	/* error */
    109 	movq	$-1, 8(%r10)
    110 	/* restore the stack frame */
    111 	leave
    112 	ret
    113 	SET_SIZE(__systemcall)
    114 
    115 /*
    116  * Same as __systemcall(), but restricted to 6 syscall arguments
    117  * so it doesn't need to incur the overhead of a new call stack frame.
    118  * Implemented for use only within libc; symbol is not exported.
    119  */
    120 	ENTRY(__systemcall6)
    121 	pushq	%rdi		/* sysret_t pointer */
    122 	movl	%esi, %eax	/* sysnum */
    123 	movq	%rdx, %rdi	/* arg0 */
    124 	movq	%rcx, %rsi	/* arg1 */
    125 	movq	%r8, %rdx	/* arg2 */
    126 	movq	%r9, %rcx	/* arg3 */
    127 	movq	16(%rsp), %r8	/* arg4 */
    128 	movq	24(%rsp), %r9	/* arg5 */
    129 	/* issue the system call */
    130 	movq	%rcx, %r10
    131 	syscall
    132 	popq	%r10		/* sysret_t pointer */
    133 	jb	1f
    134 	movq	%rax, 0(%r10)	/* no error */
    135 	movq	%rdx, 8(%r10)
    136 	xorq	%rax, %rax
    137 	ret
    138 1:
    139 	movq	$-1, 0(%r10)	/* error */
    140 	movq	$-1, 8(%r10)
    141 	ret
    142 	SET_SIZE(__systemcall6)
    143