Yuval Pavel Zholkover | 99a10ef | 2010-10-18 12:32:55 -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" |
Yuval Pavel Zholkover | 99a10ef | 2010-10-18 12:32:55 -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 |
Yuval Pavel Zholkover | 99a10ef | 2010-10-18 12:32:55 -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 |
Yuval Pavel Zholkover | 0924185 | 2011-06-10 17:23:54 +1000 | [diff] [blame] | 14 | MOVL $14, AX |
| 15 | INT $64 |
Russ Cox | 25f6b02 | 2014-08-27 11:32:17 -0400 | [diff] [blame] | 16 | MOVL AX, ret+12(FP) |
Yuval Pavel Zholkover | 0924185 | 2011-06-10 17:23:54 +1000 | [diff] [blame] | 17 | RET |
| 18 | |
Keith Randall | 0273dc1 | 2013-08-07 12:20:05 -0700 | [diff] [blame] | 19 | TEXT runtime·pread(SB),NOSPLIT,$0 |
Anthony Martin | 4a2d30e | 2011-11-17 22:09:28 -0500 | [diff] [blame] | 20 | MOVL $50, AX |
| 21 | INT $64 |
Russ Cox | 25f6b02 | 2014-08-27 11:32:17 -0400 | [diff] [blame] | 22 | MOVL AX, ret+20(FP) |
Anthony Martin | 528ccdc | 2011-10-05 12:07:44 -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 |
Anthony Martin | 4a2d30e | 2011-11-17 22:09:28 -0500 | [diff] [blame] | 26 | MOVL $51, AX |
| 27 | INT $64 |
Russ Cox | 25f6b02 | 2014-08-27 11:32:17 -0400 | [diff] [blame] | 28 | MOVL AX, ret+20(FP) |
Anthony Martin | 528ccdc | 2011-10-05 12:07:44 -0400 | [diff] [blame] | 29 | RET |
| 30 | |
Russ Cox | 25f6b02 | 2014-08-27 11:32:17 -0400 | [diff] [blame] | 31 | // int32 _seek(int64*, int32, int64, int32) |
| 32 | TEXT _seek<>(SB),NOSPLIT,$0 |
Anthony Martin | 432f182 | 2012-12-17 11:07:40 -0500 | [diff] [blame] | 33 | MOVL $39, AX |
| 34 | INT $64 |
Russ Cox | 25f6b02 | 2014-08-27 11:32:17 -0400 | [diff] [blame] | 35 | RET |
| 36 | |
| 37 | TEXT runtime·seek(SB),NOSPLIT,$24 |
| 38 | LEAL ret+16(FP), AX |
| 39 | MOVL fd+0(FP), BX |
| 40 | MOVL offset_lo+4(FP), CX |
| 41 | MOVL offset_hi+8(FP), DX |
| 42 | MOVL whence+12(FP), SI |
| 43 | MOVL AX, 0(SP) |
| 44 | MOVL BX, 4(SP) |
| 45 | MOVL CX, 8(SP) |
| 46 | MOVL DX, 12(SP) |
| 47 | MOVL SI, 16(SP) |
| 48 | CALL _seek<>(SB) |
| 49 | CMPL AX, $0 |
| 50 | JGE 3(PC) |
| 51 | MOVL $-1, ret_lo+16(FP) |
| 52 | MOVL $-1, ret_hi+20(FP) |
Anthony Martin | 432f182 | 2012-12-17 11:07:40 -0500 | [diff] [blame] | 53 | RET |
| 54 | |
David Crawshaw | cea272d | 2015-04-13 19:37:04 -0400 | [diff] [blame] | 55 | TEXT runtime·closefd(SB),NOSPLIT,$0 |
Anthony Martin | 528ccdc | 2011-10-05 12:07:44 -0400 | [diff] [blame] | 56 | MOVL $4, AX |
Anthony Martin | 432f182 | 2012-12-17 11:07:40 -0500 | [diff] [blame] | 57 | INT $64 |
Russ Cox | 25f6b02 | 2014-08-27 11:32:17 -0400 | [diff] [blame] | 58 | MOVL AX, ret+4(FP) |
Yuval Pavel Zholkover | 99a10ef | 2010-10-18 12:32:55 -0400 | [diff] [blame] | 59 | RET |
| 60 | |
Keith Randall | 0273dc1 | 2013-08-07 12:20:05 -0700 | [diff] [blame] | 61 | TEXT runtime·exits(SB),NOSPLIT,$0 |
Yuval Pavel Zholkover | 99a10ef | 2010-10-18 12:32:55 -0400 | [diff] [blame] | 62 | MOVL $8, AX |
| 63 | INT $64 |
| 64 | RET |
| 65 | |
Keith Randall | 0273dc1 | 2013-08-07 12:20:05 -0700 | [diff] [blame] | 66 | TEXT runtime·brk_(SB),NOSPLIT,$0 |
Yuval Pavel Zholkover | 99a10ef | 2010-10-18 12:32:55 -0400 | [diff] [blame] | 67 | MOVL $24, AX |
| 68 | INT $64 |
Russ Cox | 25f6b02 | 2014-08-27 11:32:17 -0400 | [diff] [blame] | 69 | MOVL AX, ret+4(FP) |
Yuval Pavel Zholkover | 99a10ef | 2010-10-18 12:32:55 -0400 | [diff] [blame] | 70 | RET |
| 71 | |
Keith Randall | 0273dc1 | 2013-08-07 12:20:05 -0700 | [diff] [blame] | 72 | TEXT runtime·sleep(SB),NOSPLIT,$0 |
Anthony Martin | 528ccdc | 2011-10-05 12:07:44 -0400 | [diff] [blame] | 73 | MOVL $17, AX |
| 74 | INT $64 |
Russ Cox | 25f6b02 | 2014-08-27 11:32:17 -0400 | [diff] [blame] | 75 | MOVL AX, ret+4(FP) |
Anthony Martin | 528ccdc | 2011-10-05 12:07:44 -0400 | [diff] [blame] | 76 | RET |
| 77 | |
Keith Randall | 0273dc1 | 2013-08-07 12:20:05 -0700 | [diff] [blame] | 78 | TEXT runtime·plan9_semacquire(SB),NOSPLIT,$0 |
Yuval Pavel Zholkover | 99a10ef | 2010-10-18 12:32:55 -0400 | [diff] [blame] | 79 | MOVL $37, AX |
| 80 | INT $64 |
Russ Cox | 25f6b02 | 2014-08-27 11:32:17 -0400 | [diff] [blame] | 81 | MOVL AX, ret+8(FP) |
Yuval Pavel Zholkover | 99a10ef | 2010-10-18 12:32:55 -0400 | [diff] [blame] | 82 | RET |
Akshat Kumar | ccdca2c | 2012-05-04 03:48:34 -0700 | [diff] [blame] | 83 | |
Keith Randall | 0273dc1 | 2013-08-07 12:20:05 -0700 | [diff] [blame] | 84 | TEXT runtime·plan9_tsemacquire(SB),NOSPLIT,$0 |
Akshat Kumar | f575284 | 2012-05-16 15:09:28 -0700 | [diff] [blame] | 85 | MOVL $52, AX |
| 86 | INT $64 |
Russ Cox | 25f6b02 | 2014-08-27 11:32:17 -0400 | [diff] [blame] | 87 | MOVL AX, ret+8(FP) |
Akshat Kumar | f575284 | 2012-05-16 15:09:28 -0700 | [diff] [blame] | 88 | RET |
| 89 | |
Russ Cox | 25f6b02 | 2014-08-27 11:32:17 -0400 | [diff] [blame] | 90 | TEXT nsec<>(SB),NOSPLIT,$0 |
Aram Hăvărneanu | a84e3ad | 2014-07-09 12:33:42 +0200 | [diff] [blame] | 91 | MOVL $53, AX |
| 92 | INT $64 |
Russ Cox | 25f6b02 | 2014-08-27 11:32:17 -0400 | [diff] [blame] | 93 | RET |
| 94 | |
| 95 | TEXT runtime·nsec(SB),NOSPLIT,$8 |
| 96 | LEAL ret+4(FP), AX |
| 97 | MOVL AX, 0(SP) |
| 98 | CALL nsec<>(SB) |
| 99 | CMPL AX, $0 |
| 100 | JGE 3(PC) |
| 101 | MOVL $-1, ret_lo+4(FP) |
| 102 | MOVL $-1, ret_hi+8(FP) |
Aram Hăvărneanu | a84e3ad | 2014-07-09 12:33:42 +0200 | [diff] [blame] | 103 | RET |
| 104 | |
Russ Cox | 0e33559 | 2017-02-02 16:20:58 -0500 | [diff] [blame] | 105 | // func walltime() (sec int64, nsec int32) |
| 106 | TEXT runtime·walltime(SB),NOSPLIT,$8-12 |
Russ Cox | 13d0b82 | 2014-09-07 23:40:59 -0400 | [diff] [blame] | 107 | CALL runtime·nanotime(SB) |
| 108 | MOVL 0(SP), AX |
| 109 | MOVL 4(SP), DX |
| 110 | |
| 111 | MOVL $1000000000, CX |
| 112 | DIVL CX |
Josh Bleecher Snyder | ef30a1c | 2017-02-13 09:06:08 -0800 | [diff] [blame] | 113 | MOVL AX, sec_lo+0(FP) |
| 114 | MOVL $0, sec_hi+4(FP) |
Russ Cox | 13d0b82 | 2014-09-07 23:40:59 -0400 | [diff] [blame] | 115 | MOVL DX, nsec+8(FP) |
| 116 | RET |
| 117 | |
Keith Randall | 0273dc1 | 2013-08-07 12:20:05 -0700 | [diff] [blame] | 118 | TEXT runtime·notify(SB),NOSPLIT,$0 |
Akshat Kumar | ccdca2c | 2012-05-04 03:48:34 -0700 | [diff] [blame] | 119 | MOVL $28, AX |
| 120 | INT $64 |
Russ Cox | 25f6b02 | 2014-08-27 11:32:17 -0400 | [diff] [blame] | 121 | MOVL AX, ret+4(FP) |
Akshat Kumar | ccdca2c | 2012-05-04 03:48:34 -0700 | [diff] [blame] | 122 | RET |
| 123 | |
Keith Randall | 0273dc1 | 2013-08-07 12:20:05 -0700 | [diff] [blame] | 124 | TEXT runtime·noted(SB),NOSPLIT,$0 |
Akshat Kumar | ccdca2c | 2012-05-04 03:48:34 -0700 | [diff] [blame] | 125 | MOVL $29, AX |
| 126 | INT $64 |
Russ Cox | 25f6b02 | 2014-08-27 11:32:17 -0400 | [diff] [blame] | 127 | MOVL AX, ret+4(FP) |
Akshat Kumar | ccdca2c | 2012-05-04 03:48:34 -0700 | [diff] [blame] | 128 | RET |
Yuval Pavel Zholkover | 99a10ef | 2010-10-18 12:32:55 -0400 | [diff] [blame] | 129 | |
Keith Randall | 0273dc1 | 2013-08-07 12:20:05 -0700 | [diff] [blame] | 130 | TEXT runtime·plan9_semrelease(SB),NOSPLIT,$0 |
Yuval Pavel Zholkover | 99a10ef | 2010-10-18 12:32:55 -0400 | [diff] [blame] | 131 | MOVL $38, AX |
| 132 | INT $64 |
Russ Cox | 25f6b02 | 2014-08-27 11:32:17 -0400 | [diff] [blame] | 133 | MOVL AX, ret+8(FP) |
Yuval Pavel Zholkover | 99a10ef | 2010-10-18 12:32:55 -0400 | [diff] [blame] | 134 | RET |
Yuval Pavel Zholkover | 99a10ef | 2010-10-18 12:32:55 -0400 | [diff] [blame] | 135 | |
Anthony Martin | 9f012e1 | 2014-09-09 17:19:01 -0700 | [diff] [blame] | 136 | TEXT runtime·rfork(SB),NOSPLIT,$0 |
| 137 | MOVL $19, AX |
| 138 | INT $64 |
| 139 | MOVL AX, ret+4(FP) |
Yuval Pavel Zholkover | 99a10ef | 2010-10-18 12:32:55 -0400 | [diff] [blame] | 140 | RET |
| 141 | |
Austin Clements | eff2b26 | 2017-06-16 15:54:21 -0400 | [diff] [blame] | 142 | TEXT runtime·tstart_plan9(SB),NOSPLIT,$4 |
Anthony Martin | 9f012e1 | 2014-09-09 17:19:01 -0700 | [diff] [blame] | 143 | MOVL newm+0(FP), CX |
| 144 | MOVL m_g0(CX), DX |
Yuval Pavel Zholkover | 99a10ef | 2010-10-18 12:32:55 -0400 | [diff] [blame] | 145 | |
Anthony Martin | 9f012e1 | 2014-09-09 17:19:01 -0700 | [diff] [blame] | 146 | // Layout new m scheduler stack on os stack. |
| 147 | MOVL SP, AX |
| 148 | MOVL AX, (g_stack+stack_hi)(DX) |
| 149 | SUBL $(64*1024), AX // stack size |
| 150 | MOVL AX, (g_stack+stack_lo)(DX) |
Russ Cox | e6d3511 | 2015-01-05 16:29:21 +0000 | [diff] [blame] | 151 | MOVL AX, g_stackguard0(DX) |
| 152 | MOVL AX, g_stackguard1(DX) |
Yuval Pavel Zholkover | 99a10ef | 2010-10-18 12:32:55 -0400 | [diff] [blame] | 153 | |
Russ Cox | 90093f0 | 2014-04-15 13:45:39 -0400 | [diff] [blame] | 154 | // Initialize procid from TOS struct. |
Aram Hăvărneanu | decd810 | 2014-07-02 21:04:10 +1000 | [diff] [blame] | 155 | MOVL _tos(SB), AX |
Anthony Martin | 9f012e1 | 2014-09-09 17:19:01 -0700 | [diff] [blame] | 156 | MOVL 48(AX), AX |
| 157 | MOVL AX, m_procid(CX) // save pid as m->procid |
| 158 | |
| 159 | // Finally, initialize g. |
| 160 | get_tls(BX) |
| 161 | MOVL DX, g(BX) |
| 162 | |
Russ Cox | 68b4255 | 2010-11-04 14:00:19 -0400 | [diff] [blame] | 163 | CALL runtime·stackcheck(SB) // smashes AX, CX |
Anthony Martin | 9f012e1 | 2014-09-09 17:19:01 -0700 | [diff] [blame] | 164 | CALL runtime·mstart(SB) |
| 165 | |
Austin Clements | eff2b26 | 2017-06-16 15:54:21 -0400 | [diff] [blame] | 166 | // Exit the thread. |
| 167 | MOVL $0, 0(SP) |
| 168 | CALL runtime·exits(SB) |
| 169 | JMP 0(PC) |
Akshat Kumar | 23599ca | 2012-10-05 16:23:30 -0400 | [diff] [blame] | 170 | |
Akshat Kumar | c74f3c4 | 2013-01-30 02:53:56 -0800 | [diff] [blame] | 171 | // void sigtramp(void *ureg, int8 *note) |
Keith Randall | 0273dc1 | 2013-08-07 12:20:05 -0700 | [diff] [blame] | 172 | TEXT runtime·sigtramp(SB),NOSPLIT,$0 |
Akshat Kumar | c74f3c4 | 2013-01-30 02:53:56 -0800 | [diff] [blame] | 173 | get_tls(AX) |
| 174 | |
Russ Cox | 89f185f | 2014-06-26 11:54:39 -0400 | [diff] [blame] | 175 | // check that g exists |
| 176 | MOVL g(AX), BX |
Akshat Kumar | c74f3c4 | 2013-01-30 02:53:56 -0800 | [diff] [blame] | 177 | CMPL BX, $0 |
| 178 | JNE 3(PC) |
Shenghou Ma | 2f1ead7 | 2013-07-12 04:39:39 +0800 | [diff] [blame] | 179 | CALL runtime·badsignal2(SB) // will exit |
Akshat Kumar | c74f3c4 | 2013-01-30 02:53:56 -0800 | [diff] [blame] | 180 | RET |
| 181 | |
| 182 | // save args |
Matthew Dempsky | 9828b7c | 2016-09-29 21:34:44 -0700 | [diff] [blame] | 183 | MOVL ureg+0(FP), CX |
| 184 | MOVL note+4(FP), DX |
Akshat Kumar | c74f3c4 | 2013-01-30 02:53:56 -0800 | [diff] [blame] | 185 | |
| 186 | // change stack |
Russ Cox | 89f185f | 2014-06-26 11:54:39 -0400 | [diff] [blame] | 187 | MOVL g_m(BX), BX |
Akshat Kumar | c74f3c4 | 2013-01-30 02:53:56 -0800 | [diff] [blame] | 188 | MOVL m_gsignal(BX), BP |
Russ Cox | 8ac35be | 2014-09-09 14:02:37 -0400 | [diff] [blame] | 189 | MOVL (g_stack+stack_hi)(BP), BP |
Akshat Kumar | c74f3c4 | 2013-01-30 02:53:56 -0800 | [diff] [blame] | 190 | MOVL BP, SP |
| 191 | |
| 192 | // make room for args and g |
Russ Cox | 9e36092 | 2014-08-27 17:38:01 -0400 | [diff] [blame] | 193 | SUBL $24, SP |
Akshat Kumar | c74f3c4 | 2013-01-30 02:53:56 -0800 | [diff] [blame] | 194 | |
| 195 | // save g |
| 196 | MOVL g(AX), BP |
Russ Cox | 9e36092 | 2014-08-27 17:38:01 -0400 | [diff] [blame] | 197 | MOVL BP, 20(SP) |
Akshat Kumar | c74f3c4 | 2013-01-30 02:53:56 -0800 | [diff] [blame] | 198 | |
| 199 | // g = m->gsignal |
| 200 | MOVL m_gsignal(BX), DI |
| 201 | MOVL DI, g(AX) |
| 202 | |
| 203 | // load args and call sighandler |
| 204 | MOVL CX, 0(SP) |
| 205 | MOVL DX, 4(SP) |
| 206 | MOVL BP, 8(SP) |
| 207 | |
| 208 | CALL runtime·sighandler(SB) |
Russ Cox | 9e36092 | 2014-08-27 17:38:01 -0400 | [diff] [blame] | 209 | MOVL 12(SP), AX |
Akshat Kumar | c74f3c4 | 2013-01-30 02:53:56 -0800 | [diff] [blame] | 210 | |
| 211 | // restore g |
| 212 | get_tls(BX) |
Russ Cox | 9e36092 | 2014-08-27 17:38:01 -0400 | [diff] [blame] | 213 | MOVL 20(SP), BP |
Akshat Kumar | c74f3c4 | 2013-01-30 02:53:56 -0800 | [diff] [blame] | 214 | MOVL BP, g(BX) |
| 215 | |
| 216 | // call noted(AX) |
| 217 | MOVL AX, 0(SP) |
| 218 | CALL runtime·noted(SB) |
| 219 | RET |
| 220 | |
Akshat Kumar | 23599ca | 2012-10-05 16:23:30 -0400 | [diff] [blame] | 221 | // Only used by the 64-bit runtime. |
Keith Randall | 0273dc1 | 2013-08-07 12:20:05 -0700 | [diff] [blame] | 222 | TEXT runtime·setfpmasks(SB),NOSPLIT,$0 |
Akshat Kumar | 23599ca | 2012-10-05 16:23:30 -0400 | [diff] [blame] | 223 | RET |
Akshat Kumar | a566dea | 2013-03-08 00:54:44 +0100 | [diff] [blame] | 224 | |
| 225 | #define ERRMAX 128 /* from os_plan9.h */ |
| 226 | |
Anthony Martin | b3de7f2 | 2014-08-28 16:02:15 -0700 | [diff] [blame] | 227 | // void errstr(int8 *buf, int32 len) |
| 228 | TEXT errstr<>(SB),NOSPLIT,$0 |
| 229 | MOVL $41, AX |
| 230 | INT $64 |
| 231 | RET |
| 232 | |
| 233 | // func errstr() string |
Akshat Kumar | a566dea | 2013-03-08 00:54:44 +0100 | [diff] [blame] | 234 | // Only used by package syscall. |
| 235 | // Grab error string due to a syscall made |
| 236 | // in entersyscall mode, without going |
| 237 | // through the allocator (issue 4994). |
| 238 | // See ../syscall/asm_plan9_386.s:/·Syscall/ |
Anthony Martin | b3de7f2 | 2014-08-28 16:02:15 -0700 | [diff] [blame] | 239 | TEXT runtime·errstr(SB),NOSPLIT,$8-8 |
Akshat Kumar | a566dea | 2013-03-08 00:54:44 +0100 | [diff] [blame] | 240 | get_tls(AX) |
Russ Cox | 89f185f | 2014-06-26 11:54:39 -0400 | [diff] [blame] | 241 | MOVL g(AX), BX |
| 242 | MOVL g_m(BX), BX |
Matthew Dempsky | 58e3ae2 | 2015-10-21 12:48:53 -0700 | [diff] [blame] | 243 | MOVL (m_mOS+mOS_errstr)(BX), CX |
Anthony Martin | b3de7f2 | 2014-08-28 16:02:15 -0700 | [diff] [blame] | 244 | MOVL CX, 0(SP) |
| 245 | MOVL $ERRMAX, 4(SP) |
| 246 | CALL errstr<>(SB) |
Akshat Kumar | a566dea | 2013-03-08 00:54:44 +0100 | [diff] [blame] | 247 | CALL runtime·findnull(SB) |
Anthony Martin | b3de7f2 | 2014-08-28 16:02:15 -0700 | [diff] [blame] | 248 | MOVL 4(SP), AX |
Russ Cox | 25f6b02 | 2014-08-27 11:32:17 -0400 | [diff] [blame] | 249 | MOVL AX, ret_len+4(FP) |
Anthony Martin | b3de7f2 | 2014-08-28 16:02:15 -0700 | [diff] [blame] | 250 | MOVL 0(SP), AX |
| 251 | MOVL AX, ret_base+0(FP) |
Akshat Kumar | a566dea | 2013-03-08 00:54:44 +0100 | [diff] [blame] | 252 | RET |