github.com/ader1990/go@v0.0.0-20140630135419-8c24447fa791/src/pkg/syscall/asm_linux_386.s (about)

     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  // TODO(rsc): Rewrite all nn(SP) references into name+(nn-8)(FP)
     6  // so that go vet can check that they are correct.
     7  
     8  #include "../../cmd/ld/textflag.h"
     9  
    10  //
    11  // System calls for 386, Linux
    12  //
    13  
    14  // func Syscall(trap uintptr, a1, a2, a3 uintptr) (r1, r2, err uintptr);
    15  // Trap # in AX, args in BX CX DX SI DI, return in AX
    16  
    17  TEXT	·Syscall(SB),NOSPLIT,$0-28
    18  	CALL	runtime·entersyscall(SB)
    19  	MOVL	4(SP), AX	// syscall entry
    20  	MOVL	8(SP), BX
    21  	MOVL	12(SP), CX
    22  	MOVL	16(SP), DX
    23  	MOVL	$0, SI
    24  	MOVL	$0,  DI
    25  	CALL	*runtime·_vdso(SB)
    26  	CMPL	AX, $0xfffff001
    27  	JLS	ok
    28  	MOVL	$-1, 20(SP)	// r1
    29  	MOVL	$0, 24(SP)	// r2
    30  	NEGL	AX
    31  	MOVL	AX, 28(SP)  // errno
    32  	CALL	runtime·exitsyscall(SB)
    33  	RET
    34  ok:
    35  	MOVL	AX, 20(SP)	// r1
    36  	MOVL	DX, 24(SP)	// r2
    37  	MOVL	$0, 28(SP)	// errno
    38  	CALL	runtime·exitsyscall(SB)
    39  	RET
    40  
    41  // func Syscall6(trap uintptr, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr);
    42  TEXT	·Syscall6(SB),NOSPLIT,$0-40
    43  	CALL	runtime·entersyscall(SB)
    44  	MOVL	4(SP), AX	// syscall entry
    45  	MOVL	8(SP), BX
    46  	MOVL	12(SP), CX
    47  	MOVL	16(SP), DX
    48  	MOVL	20(SP), SI
    49  	MOVL	24(SP), DI
    50  	MOVL	28(SP), BP
    51  	CALL	*runtime·_vdso(SB)
    52  	CMPL	AX, $0xfffff001
    53  	JLS	ok6
    54  	MOVL	$-1, 32(SP)	// r1
    55  	MOVL	$0, 36(SP)	// r2
    56  	NEGL	AX
    57  	MOVL	AX, 40(SP)  // errno
    58  	CALL	runtime·exitsyscall(SB)
    59  	RET
    60  ok6:
    61  	MOVL	AX, 32(SP)	// r1
    62  	MOVL	DX, 36(SP)	// r2
    63  	MOVL	$0, 40(SP)	// errno
    64  	CALL	runtime·exitsyscall(SB)
    65  	RET
    66  
    67  // func RawSyscall(trap uintptr, a1, a2, a3 uintptr) (r1, r2, err uintptr);
    68  TEXT ·RawSyscall(SB),NOSPLIT,$0-28
    69  	MOVL	4(SP), AX	// syscall entry
    70  	MOVL	8(SP), BX
    71  	MOVL	12(SP), CX
    72  	MOVL	16(SP), DX
    73  	MOVL	$0, SI
    74  	MOVL	$0,  DI
    75  	CALL	*runtime·_vdso(SB)
    76  	CMPL	AX, $0xfffff001
    77  	JLS	ok1
    78  	MOVL	$-1, 20(SP)	// r1
    79  	MOVL	$0, 24(SP)	// r2
    80  	NEGL	AX
    81  	MOVL	AX, 28(SP)  // errno
    82  	RET
    83  ok1:
    84  	MOVL	AX, 20(SP)	// r1
    85  	MOVL	DX, 24(SP)	// r2
    86  	MOVL	$0, 28(SP)	// errno
    87  	RET
    88  
    89  // func RawSyscall6(trap uintptr, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr);
    90  TEXT	·RawSyscall6(SB),NOSPLIT,$0-40
    91  	MOVL	4(SP), AX	// syscall entry
    92  	MOVL	8(SP), BX
    93  	MOVL	12(SP), CX
    94  	MOVL	16(SP), DX
    95  	MOVL	20(SP), SI
    96  	MOVL	24(SP), DI
    97  	MOVL	28(SP), BP
    98  	CALL	*runtime·_vdso(SB)
    99  	CMPL	AX, $0xfffff001
   100  	JLS	ok2
   101  	MOVL	$-1, 32(SP)	// r1
   102  	MOVL	$0, 36(SP)	// r2
   103  	NEGL	AX
   104  	MOVL	AX, 40(SP)  // errno
   105  	RET
   106  ok2:
   107  	MOVL	AX, 32(SP)	// r1
   108  	MOVL	DX, 36(SP)	// r2
   109  	MOVL	$0, 40(SP)	// errno
   110  	RET
   111  
   112  #define SYS_SOCKETCALL 102	/* from zsysnum_linux_386.go */
   113  
   114  // func socketcall(call int, a0, a1, a2, a3, a4, a5 uintptr) (n int, errno int)
   115  // Kernel interface gets call sub-number and pointer to a0.
   116  TEXT ·socketcall(SB),NOSPLIT,$0-36
   117  	CALL	runtime·entersyscall(SB)
   118  	MOVL	$SYS_SOCKETCALL, AX	// syscall entry
   119  	MOVL	4(SP), BX	// socket call number
   120  	LEAL		8(SP), CX	// pointer to call arguments
   121  	MOVL	$0, DX
   122  	MOVL	$0, SI
   123  	MOVL	$0,  DI
   124  	CALL	*runtime·_vdso(SB)
   125  	CMPL	AX, $0xfffff001
   126  	JLS	oksock
   127  	MOVL	$-1, 32(SP)	// n
   128  	NEGL	AX
   129  	MOVL	AX, 36(SP)  // errno
   130  	CALL	runtime·exitsyscall(SB)
   131  	RET
   132  oksock:
   133  	MOVL	AX, 32(SP)	// n
   134  	MOVL	$0, 36(SP)	// errno
   135  	CALL	runtime·exitsyscall(SB)
   136  	RET
   137  
   138  // func rawsocketcall(call int, a0, a1, a2, a3, a4, a5 uintptr) (n int, errno int)
   139  // Kernel interface gets call sub-number and pointer to a0.
   140  TEXT ·rawsocketcall(SB),NOSPLIT,$0-36
   141  	MOVL	$SYS_SOCKETCALL, AX	// syscall entry
   142  	MOVL	4(SP), BX	// socket call number
   143  	LEAL		8(SP), CX	// pointer to call arguments
   144  	MOVL	$0, DX
   145  	MOVL	$0, SI
   146  	MOVL	$0,  DI
   147  	CALL	*runtime·_vdso(SB)
   148  	CMPL	AX, $0xfffff001
   149  	JLS	oksock1
   150  	MOVL	$-1, 32(SP)	// n
   151  	NEGL	AX
   152  	MOVL	AX, 36(SP)  // errno
   153  	RET
   154  oksock1:
   155  	MOVL	AX, 32(SP)	// n
   156  	MOVL	$0, 36(SP)	// errno
   157  	RET
   158  
   159  #define SYS__LLSEEK 140	/* from zsysnum_linux_386.go */
   160  // func Seek(fd int, offset int64, whence int) (newoffset int64, errno int)
   161  // Implemented in assembly to avoid allocation when
   162  // taking the address of the return value newoffset.
   163  // Underlying system call is
   164  //	llseek(int fd, int offhi, int offlo, int64 *result, int whence)
   165  TEXT ·seek(SB),NOSPLIT,$0-28
   166  	CALL	runtime·entersyscall(SB)
   167  	MOVL	$SYS__LLSEEK, AX	// syscall entry
   168  	MOVL	4(SP), BX	// fd
   169  	MOVL	12(SP), CX	// offset-high
   170  	MOVL	8(SP), DX	// offset-low
   171  	LEAL	20(SP), SI	// result pointer
   172  	MOVL	16(SP),  DI	// whence
   173  	CALL	*runtime·_vdso(SB)
   174  	CMPL	AX, $0xfffff001
   175  	JLS	okseek
   176  	MOVL	$-1, 20(SP)	// newoffset low
   177  	MOVL	$-1, 24(SP)	// newoffset high
   178  	NEGL	AX
   179  	MOVL	AX, 28(SP)  // errno
   180  	CALL	runtime·exitsyscall(SB)
   181  	RET
   182  okseek:
   183  	// system call filled in newoffset already
   184  	MOVL	$0, 28(SP)	// errno
   185  	CALL	runtime·exitsyscall(SB)
   186  	RET