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 124