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