github.com/ice-blockchain/go/src@v0.0.0-20240403114104-1564d284e521/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 "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