github.com/flyinox/gosm@v0.0.0-20171117061539-16768cb62077/src/runtime/sys_plan9_amd64.s (about) 1 // Copyright 2010 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 "go_asm.h" 6 #include "go_tls.h" 7 #include "textflag.h" 8 9 // setldt(int entry, int address, int limit) 10 TEXT runtime·setldt(SB),NOSPLIT,$0 11 RET 12 13 TEXT runtime·open(SB),NOSPLIT,$0 14 MOVQ $14, BP 15 SYSCALL 16 MOVL AX, ret+16(FP) 17 RET 18 19 TEXT runtime·pread(SB),NOSPLIT,$0 20 MOVQ $50, BP 21 SYSCALL 22 MOVL AX, ret+32(FP) 23 RET 24 25 TEXT runtime·pwrite(SB),NOSPLIT,$0 26 MOVQ $51, BP 27 SYSCALL 28 MOVL AX, ret+32(FP) 29 RET 30 31 // int32 _seek(int64*, int32, int64, int32) 32 TEXT _seek<>(SB),NOSPLIT,$0 33 MOVQ $39, BP 34 SYSCALL 35 RET 36 37 // int64 seek(int32, int64, int32) 38 // Convenience wrapper around _seek, the actual system call. 39 TEXT runtime·seek(SB),NOSPLIT,$32 40 LEAQ ret+24(FP), AX 41 MOVL fd+0(FP), BX 42 MOVQ offset+8(FP), CX 43 MOVL whence+16(FP), DX 44 MOVQ AX, 0(SP) 45 MOVL BX, 8(SP) 46 MOVQ CX, 16(SP) 47 MOVL DX, 24(SP) 48 CALL _seek<>(SB) 49 CMPL AX, $0 50 JGE 2(PC) 51 MOVQ $-1, ret+24(FP) 52 RET 53 54 TEXT runtime·closefd(SB),NOSPLIT,$0 55 MOVQ $4, BP 56 SYSCALL 57 MOVL AX, ret+8(FP) 58 RET 59 60 TEXT runtime·exits(SB),NOSPLIT,$0 61 MOVQ $8, BP 62 SYSCALL 63 RET 64 65 TEXT runtime·brk_(SB),NOSPLIT,$0 66 MOVQ $24, BP 67 SYSCALL 68 MOVL AX, ret+8(FP) 69 RET 70 71 TEXT runtime·sleep(SB),NOSPLIT,$0 72 MOVQ $17, BP 73 SYSCALL 74 MOVL AX, ret+8(FP) 75 RET 76 77 TEXT runtime·plan9_semacquire(SB),NOSPLIT,$0 78 MOVQ $37, BP 79 SYSCALL 80 MOVL AX, ret+16(FP) 81 RET 82 83 TEXT runtime·plan9_tsemacquire(SB),NOSPLIT,$0 84 MOVQ $52, BP 85 SYSCALL 86 MOVL AX, ret+16(FP) 87 RET 88 89 TEXT runtime·nsec(SB),NOSPLIT,$0 90 MOVQ $53, BP 91 SYSCALL 92 MOVQ AX, ret+8(FP) 93 RET 94 95 // func walltime() (sec int64, nsec int32) 96 TEXT runtime·walltime(SB),NOSPLIT,$8-12 97 CALL runtime·nanotime(SB) 98 MOVQ 0(SP), AX 99 100 // generated code for 101 // func f(x uint64) (uint64, uint64) { return x/1000000000, x%100000000 } 102 // adapted to reduce duplication 103 MOVQ AX, CX 104 MOVQ $1360296554856532783, AX 105 MULQ CX 106 ADDQ CX, DX 107 RCRQ $1, DX 108 SHRQ $29, DX 109 MOVQ DX, sec+0(FP) 110 IMULQ $1000000000, DX 111 SUBQ DX, CX 112 MOVL CX, nsec+8(FP) 113 RET 114 115 TEXT runtime·notify(SB),NOSPLIT,$0 116 MOVQ $28, BP 117 SYSCALL 118 MOVL AX, ret+8(FP) 119 RET 120 121 TEXT runtime·noted(SB),NOSPLIT,$0 122 MOVQ $29, BP 123 SYSCALL 124 MOVL AX, ret+8(FP) 125 RET 126 127 TEXT runtime·plan9_semrelease(SB),NOSPLIT,$0 128 MOVQ $38, BP 129 SYSCALL 130 MOVL AX, ret+16(FP) 131 RET 132 133 TEXT runtime·rfork(SB),NOSPLIT,$0 134 MOVQ $19, BP 135 SYSCALL 136 MOVL AX, ret+8(FP) 137 RET 138 139 TEXT runtime·tstart_plan9(SB),NOSPLIT,$0 140 MOVQ newm+0(FP), CX 141 MOVQ m_g0(CX), DX 142 143 // Layout new m scheduler stack on os stack. 144 MOVQ SP, AX 145 MOVQ AX, (g_stack+stack_hi)(DX) 146 SUBQ $(64*1024), AX // stack size 147 MOVQ AX, (g_stack+stack_lo)(DX) 148 MOVQ AX, g_stackguard0(DX) 149 MOVQ AX, g_stackguard1(DX) 150 151 // Initialize procid from TOS struct. 152 MOVQ _tos(SB), AX 153 MOVL 64(AX), AX 154 MOVQ AX, m_procid(CX) // save pid as m->procid 155 156 // Finally, initialize g. 157 get_tls(BX) 158 MOVQ DX, g(BX) 159 160 CALL runtime·stackcheck(SB) // smashes AX, CX 161 CALL runtime·mstart(SB) 162 163 MOVQ $0x1234, 0x1234 // not reached 164 RET 165 166 // This is needed by asm_amd64.s 167 TEXT runtime·settls(SB),NOSPLIT,$0 168 RET 169 170 // void sigtramp(void *ureg, int8 *note) 171 TEXT runtime·sigtramp(SB),NOSPLIT,$0 172 get_tls(AX) 173 174 // check that g exists 175 MOVQ g(AX), BX 176 CMPQ BX, $0 177 JNE 3(PC) 178 CALL runtime·badsignal2(SB) // will exit 179 RET 180 181 // save args 182 MOVQ ureg+0(FP), CX 183 MOVQ note+8(FP), DX 184 185 // change stack 186 MOVQ g_m(BX), BX 187 MOVQ m_gsignal(BX), R10 188 MOVQ (g_stack+stack_hi)(R10), BP 189 MOVQ BP, SP 190 191 // make room for args and g 192 SUBQ $128, SP 193 194 // save g 195 MOVQ g(AX), BP 196 MOVQ BP, 32(SP) 197 198 // g = m->gsignal 199 MOVQ R10, g(AX) 200 201 // load args and call sighandler 202 MOVQ CX, 0(SP) 203 MOVQ DX, 8(SP) 204 MOVQ BP, 16(SP) 205 206 CALL runtime·sighandler(SB) 207 MOVL 24(SP), AX 208 209 // restore g 210 get_tls(BX) 211 MOVQ 32(SP), R10 212 MOVQ R10, g(BX) 213 214 // call noted(AX) 215 MOVQ AX, 0(SP) 216 CALL runtime·noted(SB) 217 RET 218 219 TEXT runtime·setfpmasks(SB),NOSPLIT,$8 220 STMXCSR 0(SP) 221 MOVL 0(SP), AX 222 ANDL $~0x3F, AX 223 ORL $(0x3F<<7), AX 224 MOVL AX, 0(SP) 225 LDMXCSR 0(SP) 226 RET 227 228 #define ERRMAX 128 /* from os_plan9.h */ 229 230 // void errstr(int8 *buf, int32 len) 231 TEXT errstr<>(SB),NOSPLIT,$0 232 MOVQ $41, BP 233 SYSCALL 234 RET 235 236 // func errstr() string 237 // Only used by package syscall. 238 // Grab error string due to a syscall made 239 // in entersyscall mode, without going 240 // through the allocator (issue 4994). 241 // See ../syscall/asm_plan9_amd64.s:/·Syscall/ 242 TEXT runtime·errstr(SB),NOSPLIT,$16-16 243 get_tls(AX) 244 MOVQ g(AX), BX 245 MOVQ g_m(BX), BX 246 MOVQ (m_mOS+mOS_errstr)(BX), CX 247 MOVQ CX, 0(SP) 248 MOVQ $ERRMAX, 8(SP) 249 CALL errstr<>(SB) 250 CALL runtime·findnull(SB) 251 MOVQ 8(SP), AX 252 MOVQ AX, ret_len+8(FP) 253 MOVQ 0(SP), AX 254 MOVQ AX, ret_base+0(FP) 255 RET