...

Text file src/syscall/asm_linux_386.s

Documentation: syscall

     1// Copyright 2009 The Go Authors. All rights reserved.
     2// Use of this source code is governed by a BSD-style
     3// license that can be found in the LICENSE file.
     4
     5#include "textflag.h"
     6#include "funcdata.h"
     7
     8//
     9// System calls for 386, Linux
    10//
    11
    12// See ../runtime/sys_linux_386.s for the reason why we always use int 0x80
    13// instead of the glibc-specific "CALL 0x10(GS)".
    14#define INVOKE_SYSCALL	INT	$0x80
    15
    16// func rawVforkSyscall(trap, a1, a2, a3 uintptr) (r1, err uintptr)
    17TEXT ·rawVforkSyscall(SB),NOSPLIT|NOFRAME,$0-24
    18	MOVL	trap+0(FP), AX	// syscall entry
    19	MOVL	a1+4(FP), BX
    20	MOVL	a2+8(FP), CX
    21	MOVL	a3+12(FP), DX
    22	POPL	SI // preserve return address
    23	INVOKE_SYSCALL
    24	PUSHL	SI
    25	CMPL	AX, $0xfffff001
    26	JLS	ok
    27	MOVL	$-1, r1+16(FP)
    28	NEGL	AX
    29	MOVL	AX, err+20(FP)
    30	RET
    31ok:
    32	MOVL	AX, r1+16(FP)
    33	MOVL	$0, err+20(FP)
    34	RET
    35
    36// func rawSyscallNoError(trap uintptr, a1, a2, a3 uintptr) (r1, r2 uintptr);
    37TEXT ·rawSyscallNoError(SB),NOSPLIT,$0-24
    38	MOVL	trap+0(FP), AX	// syscall entry
    39	MOVL	a1+4(FP), BX
    40	MOVL	a2+8(FP), CX
    41	MOVL	a3+12(FP), DX
    42	MOVL	$0, SI
    43	MOVL	$0, DI
    44	INVOKE_SYSCALL
    45	MOVL	AX, r1+16(FP)
    46	MOVL	DX, r2+20(FP)
    47	RET
    48
    49#define SYS_SOCKETCALL 102	/* from zsysnum_linux_386.go */
    50
    51// func socketcall(call int, a0, a1, a2, a3, a4, a5 uintptr) (n int, err int)
    52// Kernel interface gets call sub-number and pointer to a0.
    53TEXT ·socketcall(SB),NOSPLIT,$0-36
    54	CALL	runtime·entersyscall(SB)
    55	MOVL	$SYS_SOCKETCALL, AX	// syscall entry
    56	MOVL	call+0(FP), BX	// socket call number
    57	LEAL	a0+4(FP), CX	// pointer to call arguments
    58	MOVL	$0, DX
    59	MOVL	$0, SI
    60	MOVL	$0, DI
    61	INVOKE_SYSCALL
    62	CMPL	AX, $0xfffff001
    63	JLS	oksock
    64	MOVL	$-1, n+28(FP)
    65	NEGL	AX
    66	MOVL	AX, err+32(FP)
    67	CALL	runtime·exitsyscall(SB)
    68	RET
    69oksock:
    70	MOVL	AX, n+28(FP)
    71	MOVL	$0, err+32(FP)
    72	CALL	runtime·exitsyscall(SB)
    73	RET
    74
    75// func rawsocketcall(call int, a0, a1, a2, a3, a4, a5 uintptr) (n int, err int)
    76// Kernel interface gets call sub-number and pointer to a0.
    77TEXT ·rawsocketcall(SB),NOSPLIT,$0-36
    78	MOVL	$SYS_SOCKETCALL, AX	// syscall entry
    79	MOVL	call+0(FP), BX	// socket call number
    80	LEAL		a0+4(FP), CX	// pointer to call arguments
    81	MOVL	$0, DX
    82	MOVL	$0, SI
    83	MOVL	$0, DI
    84	INVOKE_SYSCALL
    85	CMPL	AX, $0xfffff001
    86	JLS	oksock1
    87	MOVL	$-1, n+28(FP)
    88	NEGL	AX
    89	MOVL	AX, err+32(FP)
    90	RET
    91oksock1:
    92	MOVL	AX, n+28(FP)
    93	MOVL	$0, err+32(FP)
    94	RET
    95
    96#define SYS__LLSEEK 140	/* from zsysnum_linux_386.go */
    97// func Seek(fd int, offset int64, whence int) (newoffset int64, err int)
    98// Implemented in assembly to avoid allocation when
    99// taking the address of the return value newoffset.
   100// Underlying system call is
   101//	llseek(int fd, int offhi, int offlo, int64 *result, int whence)
   102TEXT ·seek(SB),NOSPLIT,$0-28
   103	CALL	runtime·entersyscall(SB)
   104	MOVL	$SYS__LLSEEK, AX	// syscall entry
   105	MOVL	fd+0(FP), BX
   106	MOVL	offset_hi+8(FP), CX
   107	MOVL	offset_lo+4(FP), DX
   108	LEAL	newoffset_lo+16(FP), SI	// result pointer
   109	MOVL	whence+12(FP), DI
   110	INVOKE_SYSCALL
   111	CMPL	AX, $0xfffff001
   112	JLS	okseek
   113	MOVL	$-1, newoffset_lo+16(FP)
   114	MOVL	$-1, newoffset_hi+20(FP)
   115	NEGL	AX
   116	MOVL	AX, err+24(FP)
   117	CALL	runtime·exitsyscall(SB)
   118	RET
   119okseek:
   120	// system call filled in newoffset already
   121	MOVL	$0, err+24(FP)
   122	CALL	runtime·exitsyscall(SB)
   123	RET

View as plain text