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