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