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