Text file src/syscall/asm_linux_386.s

     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)
    17  TEXT ·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
    31  ok:
    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);
    37  TEXT ·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.
    53  TEXT ·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
    69  oksock:
    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.
    77  TEXT ·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
    91  oksock1:
    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)
   102  TEXT ·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
   119  okseek:
   120  	// system call filled in newoffset already
   121  	MOVL	$0, err+24(FP)
   122  	CALL	runtime·exitsyscall(SB)
   123  	RET
   124  

View as plain text