github.com/code-reading/golang@v0.0.0-20220303082512-ba5bc0e589a3/go/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 #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 Syscall(trap uintptr, a1, a2, a3 uintptr) (r1, r2, err uintptr); 17 // Trap # in AX, args in BX CX DX SI DI, return in AX 18 TEXT ·Syscall(SB),NOSPLIT,$0-28 19 CALL runtime·entersyscall(SB) 20 MOVL trap+0(FP), AX // syscall entry 21 MOVL a1+4(FP), BX 22 MOVL a2+8(FP), CX 23 MOVL a3+12(FP), DX 24 MOVL $0, SI 25 MOVL $0, DI 26 INVOKE_SYSCALL 27 CMPL AX, $0xfffff001 28 JLS ok 29 MOVL $-1, r1+16(FP) 30 MOVL $0, r2+20(FP) 31 NEGL AX 32 MOVL AX, err+24(FP) 33 CALL runtime·exitsyscall(SB) 34 RET 35 ok: 36 MOVL AX, r1+16(FP) 37 MOVL DX, r2+20(FP) 38 MOVL $0, err+24(FP) 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 trap+0(FP), AX // syscall entry 46 MOVL a1+4(FP), BX 47 MOVL a2+8(FP), CX 48 MOVL a3+12(FP), DX 49 MOVL a4+16(FP), SI 50 MOVL a5+20(FP), DI 51 MOVL a6+24(FP), BP 52 INVOKE_SYSCALL 53 CMPL AX, $0xfffff001 54 JLS ok6 55 MOVL $-1, r1+28(FP) 56 MOVL $0, r2+32(FP) 57 NEGL AX 58 MOVL AX, err+36(FP) 59 CALL runtime·exitsyscall(SB) 60 RET 61 ok6: 62 MOVL AX, r1+28(FP) 63 MOVL DX, r2+32(FP) 64 MOVL $0, err+36(FP) 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 trap+0(FP), AX // syscall entry 71 MOVL a1+4(FP), BX 72 MOVL a2+8(FP), CX 73 MOVL a3+12(FP), DX 74 MOVL $0, SI 75 MOVL $0, DI 76 INVOKE_SYSCALL 77 CMPL AX, $0xfffff001 78 JLS ok1 79 MOVL $-1, r1+16(FP) 80 MOVL $0, r2+20(FP) 81 NEGL AX 82 MOVL AX, err+24(FP) 83 RET 84 ok1: 85 MOVL AX, r1+16(FP) 86 MOVL DX, r2+20(FP) 87 MOVL $0, err+24(FP) 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 trap+0(FP), AX // syscall entry 93 MOVL a1+4(FP), BX 94 MOVL a2+8(FP), CX 95 MOVL a3+12(FP), DX 96 MOVL a4+16(FP), SI 97 MOVL a5+20(FP), DI 98 MOVL a6+24(FP), BP 99 INVOKE_SYSCALL 100 CMPL AX, $0xfffff001 101 JLS ok2 102 MOVL $-1, r1+28(FP) 103 MOVL $0, r2+32(FP) 104 NEGL AX 105 MOVL AX, err+36(FP) 106 RET 107 ok2: 108 MOVL AX, r1+28(FP) 109 MOVL DX, r2+32(FP) 110 MOVL $0, err+36(FP) 111 RET 112 113 // func rawVforkSyscall(trap, a1 uintptr) (r1, err uintptr) 114 TEXT ·rawVforkSyscall(SB),NOSPLIT|NOFRAME,$0-16 115 MOVL trap+0(FP), AX // syscall entry 116 MOVL a1+4(FP), BX 117 MOVL $0, CX 118 MOVL $0, DX 119 POPL SI // preserve return address 120 INVOKE_SYSCALL 121 PUSHL SI 122 CMPL AX, $0xfffff001 123 JLS ok 124 MOVL $-1, r1+8(FP) 125 NEGL AX 126 MOVL AX, err+12(FP) 127 RET 128 ok: 129 MOVL AX, r1+8(FP) 130 MOVL $0, err+12(FP) 131 RET 132 133 // func rawSyscallNoError(trap uintptr, a1, a2, a3 uintptr) (r1, r2 uintptr); 134 TEXT ·rawSyscallNoError(SB),NOSPLIT,$0-24 135 MOVL trap+0(FP), AX // syscall entry 136 MOVL a1+4(FP), BX 137 MOVL a2+8(FP), CX 138 MOVL a3+12(FP), DX 139 MOVL $0, SI 140 MOVL $0, DI 141 INVOKE_SYSCALL 142 MOVL AX, r1+16(FP) 143 MOVL DX, r2+20(FP) 144 RET 145 146 #define SYS_SOCKETCALL 102 /* from zsysnum_linux_386.go */ 147 148 // func socketcall(call int, a0, a1, a2, a3, a4, a5 uintptr) (n int, err int) 149 // Kernel interface gets call sub-number and pointer to a0. 150 TEXT ·socketcall(SB),NOSPLIT,$0-36 151 CALL runtime·entersyscall(SB) 152 MOVL $SYS_SOCKETCALL, AX // syscall entry 153 MOVL call+0(FP), BX // socket call number 154 LEAL a0+4(FP), CX // pointer to call arguments 155 MOVL $0, DX 156 MOVL $0, SI 157 MOVL $0, DI 158 INVOKE_SYSCALL 159 CMPL AX, $0xfffff001 160 JLS oksock 161 MOVL $-1, n+28(FP) 162 NEGL AX 163 MOVL AX, err+32(FP) 164 CALL runtime·exitsyscall(SB) 165 RET 166 oksock: 167 MOVL AX, n+28(FP) 168 MOVL $0, err+32(FP) 169 CALL runtime·exitsyscall(SB) 170 RET 171 172 // func rawsocketcall(call int, a0, a1, a2, a3, a4, a5 uintptr) (n int, err int) 173 // Kernel interface gets call sub-number and pointer to a0. 174 TEXT ·rawsocketcall(SB),NOSPLIT,$0-36 175 MOVL $SYS_SOCKETCALL, AX // syscall entry 176 MOVL call+0(FP), BX // socket call number 177 LEAL a0+4(FP), CX // pointer to call arguments 178 MOVL $0, DX 179 MOVL $0, SI 180 MOVL $0, DI 181 INVOKE_SYSCALL 182 CMPL AX, $0xfffff001 183 JLS oksock1 184 MOVL $-1, n+28(FP) 185 NEGL AX 186 MOVL AX, err+32(FP) 187 RET 188 oksock1: 189 MOVL AX, n+28(FP) 190 MOVL $0, err+32(FP) 191 RET 192 193 #define SYS__LLSEEK 140 /* from zsysnum_linux_386.go */ 194 // func Seek(fd int, offset int64, whence int) (newoffset int64, err int) 195 // Implemented in assembly to avoid allocation when 196 // taking the address of the return value newoffset. 197 // Underlying system call is 198 // llseek(int fd, int offhi, int offlo, int64 *result, int whence) 199 TEXT ·seek(SB),NOSPLIT,$0-28 200 CALL runtime·entersyscall(SB) 201 MOVL $SYS__LLSEEK, AX // syscall entry 202 MOVL fd+0(FP), BX 203 MOVL offset_hi+8(FP), CX 204 MOVL offset_lo+4(FP), DX 205 LEAL newoffset_lo+16(FP), SI // result pointer 206 MOVL whence+12(FP), DI 207 INVOKE_SYSCALL 208 CMPL AX, $0xfffff001 209 JLS okseek 210 MOVL $-1, newoffset_lo+16(FP) 211 MOVL $-1, newoffset_hi+20(FP) 212 NEGL AX 213 MOVL AX, err+24(FP) 214 CALL runtime·exitsyscall(SB) 215 RET 216 okseek: 217 // system call filled in newoffset already 218 MOVL $0, err+24(FP) 219 CALL runtime·exitsyscall(SB) 220 RET