/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
.file "syscall.s"
#include "SYS.h"
ANSI_PRAGMA_WEAK(syscall,function)
ENTRY(syscall)
pushq %rbp
movq %rsp, %rbp
/* construct a new call stack frame */
movl %edi, %eax /* sysnum */
movq %rsi, %rdi /* arg0 */
movq %rdx, %rsi /* arg1 */
movq %rcx, %rdx /* arg2 */
movq %r8, %rcx /* arg3 */
movq %r9, %r8 /* arg4 */
movq 16(%rbp), %r9 /* arg5 */
movq 32(%rbp), %r10
pushq %r10 /* arg7 */
movq 24(%rbp), %r10
pushq %r10 /* arg6 */
movq 8(%rbp), %r10
pushq %r10 /* return addr */
/* issue the system call */
movq %rcx, %r10
syscall
/* restore the stack frame */
leave
SYSCERROR
ret
SET_SIZE(syscall)
/*
* Same as _syscall(), but restricted to 6 syscall arguments
* so it doesn't need to incur the overhead of a new call stack frame.
* Implemented for use only within libc; symbol is not exported.
*/
ENTRY(_syscall6)
movl %edi, %eax /* sysnum */
movq %rsi, %rdi /* arg0 */
movq %rdx, %rsi /* arg1 */
movq %rcx, %rdx /* arg2 */
movq %r8, %rcx /* arg3 */
movq %r9, %r8 /* arg4 */
movq 8(%rsp), %r9 /* arg5 */
movq %rcx, %r10
syscall
SYSCERROR
ret
SET_SIZE(_syscall6)
ENTRY(__systemcall)
pushq %rbp
movq %rsp, %rbp
/* construct a new call stack frame */
pushq %rdi /* sysret_t pointer */
movl %esi, %eax /* sysnum */
movq %rdx, %rdi /* arg0 */
movq %rcx, %rsi /* arg1 */
movq %r8, %rdx /* arg2 */
movq %r9, %rcx /* arg3 */
movq 16(%rbp), %r8 /* arg4 */
movq 24(%rbp), %r9 /* arg5 */
movq 40(%rbp), %r10
pushq %r10 /* arg7 */
movq 32(%rbp), %r10
pushq %r10 /* arg6 */
movq 8(%rbp), %r10
pushq %r10 /* return addr */
/* issue the system call */
movq %rcx, %r10
syscall
movq -8(%rbp), %r10 /* sysret_t pointer */
jb 1f
movq %rax, 0(%r10) /* no error */
movq %rdx, 8(%r10)
xorq %rax, %rax
/* restore the stack frame */
leave
ret
1:
movq $-1, 0(%r10) /* error */
movq $-1, 8(%r10)
/* restore the stack frame */
leave
ret
SET_SIZE(__systemcall)
/*
* Same as __systemcall(), but restricted to 6 syscall arguments
* so it doesn't need to incur the overhead of a new call stack frame.
* Implemented for use only within libc; symbol is not exported.
*/
ENTRY(__systemcall6)
pushq %rdi /* sysret_t pointer */
movl %esi, %eax /* sysnum */
movq %rdx, %rdi /* arg0 */
movq %rcx, %rsi /* arg1 */
movq %r8, %rdx /* arg2 */
movq %r9, %rcx /* arg3 */
movq 16(%rsp), %r8 /* arg4 */
movq 24(%rsp), %r9 /* arg5 */
/* issue the system call */
movq %rcx, %r10
syscall
popq %r10 /* sysret_t pointer */
jb 1f
movq %rax, 0(%r10) /* no error */
movq %rdx, 8(%r10)
xorq %rax, %rax
ret
1:
movq $-1, 0(%r10) /* error */
movq $-1, 8(%r10)
ret
SET_SIZE(__systemcall6)