Akshat Kumar | a72bebf | 2012-08-31 13:21:13 -0400 | [diff] [blame] | 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 | |
Russ Cox | 15ced2d | 2014-11-11 17:06:22 -0500 | [diff] [blame] | 5 | #include "go_asm.h" |
| 6 | #include "go_tls.h" |
Russ Cox | cb040d5 | 2014-09-04 23:05:18 -0400 | [diff] [blame] | 7 | #include "textflag.h" |
Akshat Kumar | a72bebf | 2012-08-31 13:21:13 -0400 | [diff] [blame] | 8 | |
| 9 | // setldt(int entry, int address, int limit) |
Keith Randall | 0273dc1 | 2013-08-07 12:20:05 -0700 | [diff] [blame] | 10 | TEXT runtime·setldt(SB),NOSPLIT,$0 |
Akshat Kumar | a72bebf | 2012-08-31 13:21:13 -0400 | [diff] [blame] | 11 | RET |
| 12 | |
Keith Randall | 0273dc1 | 2013-08-07 12:20:05 -0700 | [diff] [blame] | 13 | TEXT runtime·open(SB),NOSPLIT,$0 |
Akshat Kumar | a72bebf | 2012-08-31 13:21:13 -0400 | [diff] [blame] | 14 | MOVQ $14, BP |
| 15 | SYSCALL |
Russ Cox | 25f6b02 | 2014-08-27 11:32:17 -0400 | [diff] [blame] | 16 | MOVL AX, ret+16(FP) |
Akshat Kumar | a72bebf | 2012-08-31 13:21:13 -0400 | [diff] [blame] | 17 | RET |
| 18 | |
Keith Randall | 0273dc1 | 2013-08-07 12:20:05 -0700 | [diff] [blame] | 19 | TEXT runtime·pread(SB),NOSPLIT,$0 |
Akshat Kumar | a72bebf | 2012-08-31 13:21:13 -0400 | [diff] [blame] | 20 | MOVQ $50, BP |
| 21 | SYSCALL |
Russ Cox | 25f6b02 | 2014-08-27 11:32:17 -0400 | [diff] [blame] | 22 | MOVL AX, ret+32(FP) |
Akshat Kumar | a72bebf | 2012-08-31 13:21:13 -0400 | [diff] [blame] | 23 | RET |
| 24 | |
Keith Randall | 0273dc1 | 2013-08-07 12:20:05 -0700 | [diff] [blame] | 25 | TEXT runtime·pwrite(SB),NOSPLIT,$0 |
Akshat Kumar | a72bebf | 2012-08-31 13:21:13 -0400 | [diff] [blame] | 26 | MOVQ $51, BP |
| 27 | SYSCALL |
Russ Cox | 25f6b02 | 2014-08-27 11:32:17 -0400 | [diff] [blame] | 28 | MOVL AX, ret+32(FP) |
Akshat Kumar | a72bebf | 2012-08-31 13:21:13 -0400 | [diff] [blame] | 29 | RET |
| 30 | |
Anthony Martin | 432f182 | 2012-12-17 11:07:40 -0500 | [diff] [blame] | 31 | // int32 _seek(int64*, int32, int64, int32) |
Keith Randall | 0273dc1 | 2013-08-07 12:20:05 -0700 | [diff] [blame] | 32 | TEXT _seek<>(SB),NOSPLIT,$0 |
Anthony Martin | 432f182 | 2012-12-17 11:07:40 -0500 | [diff] [blame] | 33 | MOVQ $39, BP |
| 34 | SYSCALL |
| 35 | RET |
| 36 | |
| 37 | // int64 seek(int32, int64, int32) |
Russ Cox | 25f6b02 | 2014-08-27 11:32:17 -0400 | [diff] [blame] | 38 | // Convenience wrapper around _seek, the actual system call. |
| 39 | TEXT runtime·seek(SB),NOSPLIT,$32 |
Russ Cox | 50199d7 | 2014-08-30 14:53:47 -0400 | [diff] [blame] | 40 | LEAQ ret+24(FP), AX |
Russ Cox | 25f6b02 | 2014-08-27 11:32:17 -0400 | [diff] [blame] | 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) |
Anthony Martin | 432f182 | 2012-12-17 11:07:40 -0500 | [diff] [blame] | 46 | MOVQ CX, 16(SP) |
Russ Cox | 25f6b02 | 2014-08-27 11:32:17 -0400 | [diff] [blame] | 47 | MOVL DX, 24(SP) |
Anthony Martin | 432f182 | 2012-12-17 11:07:40 -0500 | [diff] [blame] | 48 | CALL _seek<>(SB) |
| 49 | CMPL AX, $0 |
| 50 | JGE 2(PC) |
Russ Cox | 25f6b02 | 2014-08-27 11:32:17 -0400 | [diff] [blame] | 51 | MOVQ $-1, ret+24(FP) |
Anthony Martin | 432f182 | 2012-12-17 11:07:40 -0500 | [diff] [blame] | 52 | RET |
| 53 | |
David Crawshaw | cea272d | 2015-04-13 19:37:04 -0400 | [diff] [blame] | 54 | TEXT runtime·closefd(SB),NOSPLIT,$0 |
Akshat Kumar | a72bebf | 2012-08-31 13:21:13 -0400 | [diff] [blame] | 55 | MOVQ $4, BP |
| 56 | SYSCALL |
Russ Cox | 25f6b02 | 2014-08-27 11:32:17 -0400 | [diff] [blame] | 57 | MOVL AX, ret+8(FP) |
Akshat Kumar | a72bebf | 2012-08-31 13:21:13 -0400 | [diff] [blame] | 58 | RET |
| 59 | |
Keith Randall | 0273dc1 | 2013-08-07 12:20:05 -0700 | [diff] [blame] | 60 | TEXT runtime·exits(SB),NOSPLIT,$0 |
Akshat Kumar | a72bebf | 2012-08-31 13:21:13 -0400 | [diff] [blame] | 61 | MOVQ $8, BP |
| 62 | SYSCALL |
| 63 | RET |
| 64 | |
Keith Randall | 0273dc1 | 2013-08-07 12:20:05 -0700 | [diff] [blame] | 65 | TEXT runtime·brk_(SB),NOSPLIT,$0 |
Akshat Kumar | a72bebf | 2012-08-31 13:21:13 -0400 | [diff] [blame] | 66 | MOVQ $24, BP |
| 67 | SYSCALL |
Russ Cox | 25f6b02 | 2014-08-27 11:32:17 -0400 | [diff] [blame] | 68 | MOVQ AX, ret+8(FP) |
Akshat Kumar | a72bebf | 2012-08-31 13:21:13 -0400 | [diff] [blame] | 69 | RET |
| 70 | |
Keith Randall | 0273dc1 | 2013-08-07 12:20:05 -0700 | [diff] [blame] | 71 | TEXT runtime·sleep(SB),NOSPLIT,$0 |
Akshat Kumar | a72bebf | 2012-08-31 13:21:13 -0400 | [diff] [blame] | 72 | MOVQ $17, BP |
| 73 | SYSCALL |
Russ Cox | 25f6b02 | 2014-08-27 11:32:17 -0400 | [diff] [blame] | 74 | MOVL AX, ret+8(FP) |
Akshat Kumar | a72bebf | 2012-08-31 13:21:13 -0400 | [diff] [blame] | 75 | RET |
| 76 | |
Keith Randall | 0273dc1 | 2013-08-07 12:20:05 -0700 | [diff] [blame] | 77 | TEXT runtime·plan9_semacquire(SB),NOSPLIT,$0 |
Akshat Kumar | a72bebf | 2012-08-31 13:21:13 -0400 | [diff] [blame] | 78 | MOVQ $37, BP |
| 79 | SYSCALL |
Russ Cox | 25f6b02 | 2014-08-27 11:32:17 -0400 | [diff] [blame] | 80 | MOVL AX, ret+16(FP) |
Akshat Kumar | a72bebf | 2012-08-31 13:21:13 -0400 | [diff] [blame] | 81 | RET |
| 82 | |
Keith Randall | 0273dc1 | 2013-08-07 12:20:05 -0700 | [diff] [blame] | 83 | TEXT runtime·plan9_tsemacquire(SB),NOSPLIT,$0 |
Akshat Kumar | a72bebf | 2012-08-31 13:21:13 -0400 | [diff] [blame] | 84 | MOVQ $52, BP |
| 85 | SYSCALL |
Russ Cox | 25f6b02 | 2014-08-27 11:32:17 -0400 | [diff] [blame] | 86 | MOVL AX, ret+16(FP) |
Akshat Kumar | a72bebf | 2012-08-31 13:21:13 -0400 | [diff] [blame] | 87 | RET |
| 88 | |
Aram Hăvărneanu | a84e3ad | 2014-07-09 12:33:42 +0200 | [diff] [blame] | 89 | TEXT runtime·nsec(SB),NOSPLIT,$0 |
| 90 | MOVQ $53, BP |
| 91 | SYSCALL |
Russ Cox | 25f6b02 | 2014-08-27 11:32:17 -0400 | [diff] [blame] | 92 | MOVQ AX, ret+8(FP) |
Aram Hăvărneanu | a84e3ad | 2014-07-09 12:33:42 +0200 | [diff] [blame] | 93 | RET |
| 94 | |
Russ Cox | 13d0b82 | 2014-09-07 23:40:59 -0400 | [diff] [blame] | 95 | // func now() (sec int64, nsec int32) |
| 96 | TEXT time·now(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 | |
Keith Randall | 0273dc1 | 2013-08-07 12:20:05 -0700 | [diff] [blame] | 115 | TEXT runtime·notify(SB),NOSPLIT,$0 |
Akshat Kumar | a72bebf | 2012-08-31 13:21:13 -0400 | [diff] [blame] | 116 | MOVQ $28, BP |
| 117 | SYSCALL |
Russ Cox | 25f6b02 | 2014-08-27 11:32:17 -0400 | [diff] [blame] | 118 | MOVL AX, ret+8(FP) |
Akshat Kumar | a72bebf | 2012-08-31 13:21:13 -0400 | [diff] [blame] | 119 | RET |
| 120 | |
Keith Randall | 0273dc1 | 2013-08-07 12:20:05 -0700 | [diff] [blame] | 121 | TEXT runtime·noted(SB),NOSPLIT,$0 |
Akshat Kumar | a72bebf | 2012-08-31 13:21:13 -0400 | [diff] [blame] | 122 | MOVQ $29, BP |
| 123 | SYSCALL |
Russ Cox | 25f6b02 | 2014-08-27 11:32:17 -0400 | [diff] [blame] | 124 | MOVL AX, ret+8(FP) |
Akshat Kumar | a72bebf | 2012-08-31 13:21:13 -0400 | [diff] [blame] | 125 | RET |
| 126 | |
Keith Randall | 0273dc1 | 2013-08-07 12:20:05 -0700 | [diff] [blame] | 127 | TEXT runtime·plan9_semrelease(SB),NOSPLIT,$0 |
Akshat Kumar | a72bebf | 2012-08-31 13:21:13 -0400 | [diff] [blame] | 128 | MOVQ $38, BP |
| 129 | SYSCALL |
Russ Cox | 25f6b02 | 2014-08-27 11:32:17 -0400 | [diff] [blame] | 130 | MOVL AX, ret+16(FP) |
Akshat Kumar | a72bebf | 2012-08-31 13:21:13 -0400 | [diff] [blame] | 131 | RET |
Akshat Kumar | c74f3c4 | 2013-01-30 02:53:56 -0800 | [diff] [blame] | 132 | |
Keith Randall | 0273dc1 | 2013-08-07 12:20:05 -0700 | [diff] [blame] | 133 | TEXT runtime·rfork(SB),NOSPLIT,$0 |
Anthony Martin | 9f012e1 | 2014-09-09 17:19:01 -0700 | [diff] [blame] | 134 | MOVQ $19, BP |
Akshat Kumar | a72bebf | 2012-08-31 13:21:13 -0400 | [diff] [blame] | 135 | SYSCALL |
Anthony Martin | 9f012e1 | 2014-09-09 17:19:01 -0700 | [diff] [blame] | 136 | MOVL AX, ret+8(FP) |
Akshat Kumar | a72bebf | 2012-08-31 13:21:13 -0400 | [diff] [blame] | 137 | RET |
| 138 | |
Anthony Martin | 9f012e1 | 2014-09-09 17:19:01 -0700 | [diff] [blame] | 139 | TEXT runtime·tstart_plan9(SB),NOSPLIT,$0 |
| 140 | MOVQ newm+0(FP), CX |
| 141 | MOVQ m_g0(CX), DX |
Akshat Kumar | a72bebf | 2012-08-31 13:21:13 -0400 | [diff] [blame] | 142 | |
Anthony Martin | 9f012e1 | 2014-09-09 17:19:01 -0700 | [diff] [blame] | 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) |
Russ Cox | e6d3511 | 2015-01-05 16:29:21 +0000 | [diff] [blame] | 148 | MOVQ AX, g_stackguard0(DX) |
| 149 | MOVQ AX, g_stackguard1(DX) |
Akshat Kumar | a72bebf | 2012-08-31 13:21:13 -0400 | [diff] [blame] | 150 | |
Aram Hăvărneanu | decd810 | 2014-07-02 21:04:10 +1000 | [diff] [blame] | 151 | // Initialize procid from TOS struct. |
| 152 | MOVQ _tos(SB), AX |
Anthony Martin | 70f9286 | 2014-09-12 01:21:51 -0700 | [diff] [blame] | 153 | MOVL 64(AX), AX |
Anthony Martin | 9f012e1 | 2014-09-09 17:19:01 -0700 | [diff] [blame] | 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 | |
Akshat Kumar | a72bebf | 2012-08-31 13:21:13 -0400 | [diff] [blame] | 160 | CALL runtime·stackcheck(SB) // smashes AX, CX |
Anthony Martin | 9f012e1 | 2014-09-09 17:19:01 -0700 | [diff] [blame] | 161 | CALL runtime·mstart(SB) |
| 162 | |
| 163 | MOVQ $0x1234, 0x1234 // not reached |
Akshat Kumar | a72bebf | 2012-08-31 13:21:13 -0400 | [diff] [blame] | 164 | RET |
| 165 | |
| 166 | // This is needed by asm_amd64.s |
Keith Randall | 0273dc1 | 2013-08-07 12:20:05 -0700 | [diff] [blame] | 167 | TEXT runtime·settls(SB),NOSPLIT,$0 |
Akshat Kumar | a72bebf | 2012-08-31 13:21:13 -0400 | [diff] [blame] | 168 | RET |
Akshat Kumar | 23599ca | 2012-10-05 16:23:30 -0400 | [diff] [blame] | 169 | |
Akshat Kumar | c74f3c4 | 2013-01-30 02:53:56 -0800 | [diff] [blame] | 170 | // void sigtramp(void *ureg, int8 *note) |
Keith Randall | 0273dc1 | 2013-08-07 12:20:05 -0700 | [diff] [blame] | 171 | TEXT runtime·sigtramp(SB),NOSPLIT,$0 |
Akshat Kumar | c74f3c4 | 2013-01-30 02:53:56 -0800 | [diff] [blame] | 172 | get_tls(AX) |
| 173 | |
Russ Cox | 89f185f | 2014-06-26 11:54:39 -0400 | [diff] [blame] | 174 | // check that g exists |
| 175 | MOVQ g(AX), BX |
Akshat Kumar | c74f3c4 | 2013-01-30 02:53:56 -0800 | [diff] [blame] | 176 | CMPQ BX, $0 |
| 177 | JNE 3(PC) |
Shenghou Ma | 2f1ead7 | 2013-07-12 04:39:39 +0800 | [diff] [blame] | 178 | CALL runtime·badsignal2(SB) // will exit |
Akshat Kumar | c74f3c4 | 2013-01-30 02:53:56 -0800 | [diff] [blame] | 179 | RET |
| 180 | |
| 181 | // save args |
| 182 | MOVQ ureg+8(SP), CX |
| 183 | MOVQ note+16(SP), DX |
| 184 | |
| 185 | // change stack |
Russ Cox | 89f185f | 2014-06-26 11:54:39 -0400 | [diff] [blame] | 186 | MOVQ g_m(BX), BX |
Akshat Kumar | c74f3c4 | 2013-01-30 02:53:56 -0800 | [diff] [blame] | 187 | MOVQ m_gsignal(BX), R10 |
Russ Cox | 8ac35be | 2014-09-09 14:02:37 -0400 | [diff] [blame] | 188 | MOVQ (g_stack+stack_hi)(R10), BP |
Akshat Kumar | c74f3c4 | 2013-01-30 02:53:56 -0800 | [diff] [blame] | 189 | MOVQ BP, SP |
| 190 | |
| 191 | // make room for args and g |
Russ Cox | f9829e9 | 2014-09-09 17:16:31 -0400 | [diff] [blame] | 192 | SUBQ $128, SP |
Akshat Kumar | c74f3c4 | 2013-01-30 02:53:56 -0800 | [diff] [blame] | 193 | |
| 194 | // save g |
| 195 | MOVQ g(AX), BP |
Russ Cox | 9e36092 | 2014-08-27 17:38:01 -0400 | [diff] [blame] | 196 | MOVQ BP, 32(SP) |
Akshat Kumar | c74f3c4 | 2013-01-30 02:53:56 -0800 | [diff] [blame] | 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) |
Russ Cox | 9e36092 | 2014-08-27 17:38:01 -0400 | [diff] [blame] | 207 | MOVL 24(SP), AX |
Akshat Kumar | c74f3c4 | 2013-01-30 02:53:56 -0800 | [diff] [blame] | 208 | |
| 209 | // restore g |
| 210 | get_tls(BX) |
Russ Cox | 9e36092 | 2014-08-27 17:38:01 -0400 | [diff] [blame] | 211 | MOVQ 32(SP), R10 |
Akshat Kumar | c74f3c4 | 2013-01-30 02:53:56 -0800 | [diff] [blame] | 212 | MOVQ R10, g(BX) |
| 213 | |
| 214 | // call noted(AX) |
| 215 | MOVQ AX, 0(SP) |
| 216 | CALL runtime·noted(SB) |
| 217 | RET |
| 218 | |
Keith Randall | 0273dc1 | 2013-08-07 12:20:05 -0700 | [diff] [blame] | 219 | TEXT runtime·setfpmasks(SB),NOSPLIT,$8 |
Akshat Kumar | 23599ca | 2012-10-05 16:23:30 -0400 | [diff] [blame] | 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 |
Akshat Kumar | a566dea | 2013-03-08 00:54:44 +0100 | [diff] [blame] | 227 | |
| 228 | #define ERRMAX 128 /* from os_plan9.h */ |
| 229 | |
Anthony Martin | b3de7f2 | 2014-08-28 16:02:15 -0700 | [diff] [blame] | 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 |
Akshat Kumar | a566dea | 2013-03-08 00:54:44 +0100 | [diff] [blame] | 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). |
Anthony Martin | b3de7f2 | 2014-08-28 16:02:15 -0700 | [diff] [blame] | 241 | // See ../syscall/asm_plan9_amd64.s:/·Syscall/ |
| 242 | TEXT runtime·errstr(SB),NOSPLIT,$16-16 |
Akshat Kumar | a566dea | 2013-03-08 00:54:44 +0100 | [diff] [blame] | 243 | get_tls(AX) |
Russ Cox | 89f185f | 2014-06-26 11:54:39 -0400 | [diff] [blame] | 244 | MOVQ g(AX), BX |
| 245 | MOVQ g_m(BX), BX |
Akshat Kumar | a566dea | 2013-03-08 00:54:44 +0100 | [diff] [blame] | 246 | MOVQ m_errstr(BX), CX |
Anthony Martin | b3de7f2 | 2014-08-28 16:02:15 -0700 | [diff] [blame] | 247 | MOVQ CX, 0(SP) |
| 248 | MOVQ $ERRMAX, 8(SP) |
| 249 | CALL errstr<>(SB) |
Akshat Kumar | a566dea | 2013-03-08 00:54:44 +0100 | [diff] [blame] | 250 | CALL runtime·findnull(SB) |
Anthony Martin | b3de7f2 | 2014-08-28 16:02:15 -0700 | [diff] [blame] | 251 | MOVQ 8(SP), AX |
Russ Cox | 25f6b02 | 2014-08-27 11:32:17 -0400 | [diff] [blame] | 252 | MOVQ AX, ret_len+8(FP) |
Anthony Martin | b3de7f2 | 2014-08-28 16:02:15 -0700 | [diff] [blame] | 253 | MOVQ 0(SP), AX |
| 254 | MOVQ AX, ret_base+0(FP) |
Akshat Kumar | a566dea | 2013-03-08 00:54:44 +0100 | [diff] [blame] | 255 | RET |