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