github.com/hbdrawn/golang@v0.0.0-20141214014649-6b835209aba2/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