LEFT | RIGHT |
(no file at all) | |
1 // Copyright 2009 The Go Authors. All rights reserved. | 1 // Copyright 2009 The Go Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style | 2 // Use of this source code is governed by a BSD-style |
3 // license that can be found in the LICENSE file. | 3 // license that can be found in the LICENSE file. |
4 // | 4 // |
5 // System calls and other sys.stuff for 386, NetBSD | 5 // System calls and other sys.stuff for 386, NetBSD |
6 // /usr/src/sys/kern/syscalls.master for syscall numbers. | 6 // /usr/src/sys/kern/syscalls.master for syscall numbers. |
7 // | 7 // |
8 | 8 |
9 #include "zasm_GOOS_GOARCH.h" | 9 #include "zasm_GOOS_GOARCH.h" |
| 10 #include "../../cmd/ld/textflag.h" |
10 | 11 |
11 // Exit the entire program (like C exit) | 12 // Exit the entire program (like C exit) |
12 TEXT runtime·exit(SB),7,$-4 | 13 TEXT runtime·exit(SB),NOSPLIT,$-4 |
13 MOVL $1, AX | 14 MOVL $1, AX |
14 INT $0x80 | 15 INT $0x80 |
15 MOVL $0xf1, 0xf1 // crash | 16 MOVL $0xf1, 0xf1 // crash |
16 RET | 17 RET |
17 | 18 |
18 TEXT runtime·exit1(SB),7,$-4 | 19 TEXT runtime·exit1(SB),NOSPLIT,$-4 |
19 MOVL $310, AX // sys__lwp_exit | 20 MOVL $310, AX // sys__lwp_exit |
20 INT $0x80 | 21 INT $0x80 |
21 JAE 2(PC) | 22 JAE 2(PC) |
22 MOVL $0xf1, 0xf1 // crash | 23 MOVL $0xf1, 0xf1 // crash |
23 RET | 24 RET |
24 | 25 |
25 TEXT runtime·open(SB),7,$-4 | 26 TEXT runtime·open(SB),NOSPLIT,$-4 |
26 MOVL $5, AX | 27 MOVL $5, AX |
27 INT $0x80 | 28 INT $0x80 |
28 RET | 29 RET |
29 | 30 |
30 TEXT runtime·close(SB),7,$-4 | 31 TEXT runtime·close(SB),NOSPLIT,$-4 |
31 MOVL $6, AX | 32 MOVL $6, AX |
32 INT $0x80 | 33 INT $0x80 |
33 RET | 34 RET |
34 | 35 |
35 TEXT runtime·read(SB),7,$-4 | 36 TEXT runtime·read(SB),NOSPLIT,$-4 |
36 MOVL $3, AX | 37 MOVL $3, AX |
37 INT $0x80 | 38 INT $0x80 |
38 RET | 39 RET |
39 | 40 |
40 TEXT runtime·write(SB),7,$-4 | 41 TEXT runtime·write(SB),NOSPLIT,$-4 |
41 MOVL $4, AX // sys_write | 42 MOVL $4, AX // sys_write |
42 INT $0x80 | 43 INT $0x80 |
43 RET | 44 RET |
44 | 45 |
45 TEXT runtime·usleep(SB),7,$24 | 46 TEXT runtime·usleep(SB),NOSPLIT,$24 |
46 MOVL $0, DX | 47 MOVL $0, DX |
47 MOVL usec+0(FP), AX | 48 MOVL usec+0(FP), AX |
48 MOVL $1000000, CX | 49 MOVL $1000000, CX |
49 DIVL CX | 50 DIVL CX |
50 MOVL AX, 12(SP) // tv_sec - l32 | 51 MOVL AX, 12(SP) // tv_sec - l32 |
51 MOVL $0, 16(SP) // tv_sec - h32 | 52 MOVL $0, 16(SP) // tv_sec - h32 |
52 MOVL $1000, AX | 53 MOVL $1000, AX |
53 MULL DX | 54 MULL DX |
54 MOVL AX, 20(SP) // tv_nsec | 55 MOVL AX, 20(SP) // tv_nsec |
55 | 56 |
56 MOVL $0, 0(SP) | 57 MOVL $0, 0(SP) |
57 LEAL 12(SP), AX | 58 LEAL 12(SP), AX |
58 MOVL AX, 4(SP) // arg 1 - rqtp | 59 MOVL AX, 4(SP) // arg 1 - rqtp |
59 MOVL $0, 8(SP) // arg 2 - rmtp | 60 MOVL $0, 8(SP) // arg 2 - rmtp |
60 MOVL $430, AX // sys_nanosleep | 61 MOVL $430, AX // sys_nanosleep |
61 INT $0x80 | 62 INT $0x80 |
62 RET | 63 RET |
63 | 64 |
64 TEXT runtime·raise(SB),7,$12 | 65 TEXT runtime·raise(SB),NOSPLIT,$12 |
65 MOVL $311, AX // sys__lwp_self | 66 MOVL $311, AX // sys__lwp_self |
66 INT $0x80 | 67 INT $0x80 |
67 MOVL $0, 0(SP) | 68 MOVL $0, 0(SP) |
68 MOVL AX, 4(SP) // arg 1 - target | 69 MOVL AX, 4(SP) // arg 1 - target |
69 MOVL sig+0(FP), AX | 70 MOVL sig+0(FP), AX |
70 MOVL AX, 8(SP) // arg 2 - signo | 71 MOVL AX, 8(SP) // arg 2 - signo |
71 MOVL $318, AX // sys__lwp_kill | 72 MOVL $318, AX // sys__lwp_kill |
72 INT $0x80 | 73 INT $0x80 |
73 RET | 74 RET |
74 | 75 |
75 TEXT runtime·mmap(SB),7,$36 | 76 TEXT runtime·mmap(SB),NOSPLIT,$36 |
76 LEAL arg0+0(FP), SI | 77 LEAL arg0+0(FP), SI |
77 LEAL 4(SP), DI | 78 LEAL 4(SP), DI |
78 CLD | 79 CLD |
79 MOVSL // arg 1 - addr | 80 MOVSL // arg 1 - addr |
80 MOVSL // arg 2 - len | 81 MOVSL // arg 2 - len |
81 MOVSL // arg 3 - prot | 82 MOVSL // arg 3 - prot |
82 MOVSL // arg 4 - flags | 83 MOVSL // arg 4 - flags |
83 MOVSL // arg 5 - fd | 84 MOVSL // arg 5 - fd |
84 MOVL $0, AX | 85 MOVL $0, AX |
85 STOSL // arg 6 - pad | 86 STOSL // arg 6 - pad |
86 MOVSL // arg 7 - offset | 87 MOVSL // arg 7 - offset |
87 MOVL $0, AX // top 32 bits of file offset | 88 MOVL $0, AX // top 32 bits of file offset |
88 STOSL | 89 STOSL |
89 MOVL $197, AX // sys_mmap | 90 MOVL $197, AX // sys_mmap |
90 INT $0x80 | 91 INT $0x80 |
91 RET | 92 RET |
92 | 93 |
93 TEXT runtime·munmap(SB),7,$-4 | 94 TEXT runtime·munmap(SB),NOSPLIT,$-4 |
94 MOVL $73, AX // sys_munmap | 95 MOVL $73, AX // sys_munmap |
95 INT $0x80 | 96 INT $0x80 |
96 JAE 2(PC) | 97 JAE 2(PC) |
97 MOVL $0xf1, 0xf1 // crash | 98 MOVL $0xf1, 0xf1 // crash |
98 RET | 99 RET |
99 | 100 |
100 TEXT runtime·madvise(SB),7,$-4 | 101 TEXT runtime·madvise(SB),NOSPLIT,$-4 |
101 MOVL $75, AX // sys_madvise | 102 MOVL $75, AX // sys_madvise |
102 INT $0x80 | 103 INT $0x80 |
103 // ignore failure - maybe pages are locked | 104 // ignore failure - maybe pages are locked |
104 RET | 105 RET |
105 | 106 |
106 TEXT runtime·setitimer(SB),7,$-4 | 107 TEXT runtime·setitimer(SB),NOSPLIT,$-4 |
107 MOVL $425, AX // sys_setitimer | 108 MOVL $425, AX // sys_setitimer |
108 INT $0x80 | 109 INT $0x80 |
109 RET | 110 RET |
110 | 111 |
111 // func now() (sec int64, nsec int32) | 112 // func now() (sec int64, nsec int32) |
112 TEXT time·now(SB), 7, $32 | 113 TEXT time·now(SB), NOSPLIT, $32 |
113 LEAL 12(SP), BX | 114 LEAL 12(SP), BX |
114 MOVL $0, 4(SP) // arg 1 - clock_id | 115 MOVL $0, 4(SP) // arg 1 - clock_id |
115 MOVL BX, 8(SP) // arg 2 - tp | 116 MOVL BX, 8(SP) // arg 2 - tp |
116 MOVL $427, AX // sys_clock_gettime | 117 MOVL $427, AX // sys_clock_gettime |
117 INT $0x80 | 118 INT $0x80 |
118 | 119 |
119 MOVL 12(SP), AX // sec - l32 | 120 MOVL 12(SP), AX // sec - l32 |
120 MOVL AX, sec+0(FP) | 121 MOVL AX, sec+0(FP) |
121 MOVL 16(SP), AX // sec - h32 | 122 MOVL 16(SP), AX // sec - h32 |
122 MOVL AX, sec+4(FP) | 123 MOVL AX, sec+4(FP) |
123 | 124 |
124 MOVL 20(SP), BX // nsec | 125 MOVL 20(SP), BX // nsec |
125 MOVL BX, nsec+8(FP) | 126 MOVL BX, nsec+8(FP) |
126 RET | 127 RET |
127 | 128 |
128 // int64 nanotime(void) so really | 129 // int64 nanotime(void) so really |
129 // void nanotime(int64 *nsec) | 130 // void nanotime(int64 *nsec) |
130 TEXT runtime·nanotime(SB),7,$32 | 131 TEXT runtime·nanotime(SB),NOSPLIT,$32 |
131 LEAL 12(SP), BX | 132 LEAL 12(SP), BX |
132 MOVL $0, 4(SP) // arg 1 - clock_id | 133 MOVL $0, 4(SP) // arg 1 - clock_id |
133 MOVL BX, 8(SP) // arg 2 - tp | 134 MOVL BX, 8(SP) // arg 2 - tp |
134 MOVL $427, AX // sys_clock_gettime | 135 MOVL $427, AX // sys_clock_gettime |
135 INT $0x80 | 136 INT $0x80 |
136 | 137 |
137 MOVL 16(SP), CX // sec - h32 | 138 MOVL 16(SP), CX // sec - h32 |
138 IMULL $1000000000, CX | 139 IMULL $1000000000, CX |
139 | 140 |
140 MOVL 12(SP), AX // sec - l32 | 141 MOVL 12(SP), AX // sec - l32 |
141 MOVL $1000000000, BX | 142 MOVL $1000000000, BX |
142 MULL BX // result in dx:ax | 143 MULL BX // result in dx:ax |
143 | 144 |
144 MOVL 20(SP), BX // nsec | 145 MOVL 20(SP), BX // nsec |
145 ADDL BX, AX | 146 ADDL BX, AX |
146 ADCL CX, DX // add high bits with carry | 147 ADCL CX, DX // add high bits with carry |
147 | 148 |
148 MOVL ret+0(FP), DI | 149 MOVL ret+0(FP), DI |
149 MOVL AX, 0(DI) | 150 MOVL AX, 0(DI) |
150 MOVL DX, 4(DI) | 151 MOVL DX, 4(DI) |
151 RET | 152 RET |
152 | 153 |
153 TEXT runtime·getcontext(SB),7,$-4 | 154 TEXT runtime·getcontext(SB),NOSPLIT,$-4 |
154 MOVL $307, AX // sys_getcontext | 155 MOVL $307, AX // sys_getcontext |
155 INT $0x80 | 156 INT $0x80 |
156 JAE 2(PC) | 157 JAE 2(PC) |
157 MOVL $0xf1, 0xf1 // crash | 158 MOVL $0xf1, 0xf1 // crash |
158 RET | 159 RET |
159 | 160 |
160 TEXT runtime·sigprocmask(SB),7,$-4 | 161 TEXT runtime·sigprocmask(SB),NOSPLIT,$-4 |
161 MOVL $293, AX // sys_sigprocmask | 162 MOVL $293, AX // sys_sigprocmask |
162 INT $0x80 | 163 INT $0x80 |
163 JAE 2(PC) | 164 JAE 2(PC) |
164 MOVL $0xf1, 0xf1 // crash | 165 MOVL $0xf1, 0xf1 // crash |
165 RET | 166 RET |
166 | 167 |
167 TEXT runtime·sigreturn_tramp(SB),7,$0 | 168 TEXT runtime·sigreturn_tramp(SB),NOSPLIT,$0 |
168 LEAL 140(SP), AX // Load address of ucontext | 169 LEAL 140(SP), AX // Load address of ucontext |
169 MOVL AX, 4(SP) | 170 MOVL AX, 4(SP) |
170 MOVL $308, AX // sys_setcontext | 171 MOVL $308, AX // sys_setcontext |
171 INT $0x80 | 172 INT $0x80 |
172 MOVL $-1, 4(SP) // Something failed... | 173 MOVL $-1, 4(SP) // Something failed... |
173 MOVL $1, AX // sys_exit | 174 MOVL $1, AX // sys_exit |
174 INT $0x80 | 175 INT $0x80 |
175 | 176 |
176 TEXT runtime·sigaction(SB),7,$24 | 177 TEXT runtime·sigaction(SB),NOSPLIT,$24 |
177 LEAL arg0+0(FP), SI | 178 LEAL arg0+0(FP), SI |
178 LEAL 4(SP), DI | 179 LEAL 4(SP), DI |
179 CLD | 180 CLD |
180 MOVSL // arg 1 - sig | 181 MOVSL // arg 1 - sig |
181 MOVSL // arg 2 - act | 182 MOVSL // arg 2 - act |
182 MOVSL // arg 3 - oact | 183 MOVSL // arg 3 - oact |
183 LEAL runtime·sigreturn_tramp(SB), AX | 184 LEAL runtime·sigreturn_tramp(SB), AX |
184 STOSL // arg 4 - tramp | 185 STOSL // arg 4 - tramp |
185 MOVL $2, AX | 186 MOVL $2, AX |
186 STOSL // arg 5 - vers | 187 STOSL // arg 5 - vers |
187 MOVL $340, AX // sys___sigaction_sigtramp | 188 MOVL $340, AX // sys___sigaction_sigtramp |
188 INT $0x80 | 189 INT $0x80 |
189 JAE 2(PC) | 190 JAE 2(PC) |
190 MOVL $0xf1, 0xf1 // crash | 191 MOVL $0xf1, 0xf1 // crash |
191 RET | 192 RET |
192 | 193 |
193 TEXT runtime·sigtramp(SB),7,$44 | 194 TEXT runtime·sigtramp(SB),NOSPLIT,$44 |
194 get_tls(CX) | 195 get_tls(CX) |
195 | 196 |
196 // check that m exists | 197 // check that m exists |
197 MOVL m(CX), BX | 198 MOVL m(CX), BX |
198 CMPL BX, $0 | 199 CMPL BX, $0 |
199 JNE 6(PC) | 200 JNE 6(PC) |
200 MOVL signo+0(FP), BX | 201 MOVL signo+0(FP), BX |
201 MOVL BX, 0(SP) | 202 MOVL BX, 0(SP) |
202 MOVL $runtime·badsignal(SB), AX | 203 MOVL $runtime·badsignal(SB), AX |
203 CALL AX | 204 CALL AX |
(...skipping 18 matching lines...) Expand all Loading... |
222 | 223 |
223 CALL runtime·sighandler(SB) | 224 CALL runtime·sighandler(SB) |
224 | 225 |
225 // restore g | 226 // restore g |
226 get_tls(CX) | 227 get_tls(CX) |
227 MOVL 20(SP), BX | 228 MOVL 20(SP), BX |
228 MOVL BX, g(CX) | 229 MOVL BX, g(CX) |
229 RET | 230 RET |
230 | 231 |
231 // int32 lwp_create(void *context, uintptr flags, void *lwpid); | 232 // int32 lwp_create(void *context, uintptr flags, void *lwpid); |
232 TEXT runtime·lwp_create(SB),7,$16 | 233 TEXT runtime·lwp_create(SB),NOSPLIT,$16 |
233 MOVL $0, 0(SP) | 234 MOVL $0, 0(SP) |
234 MOVL context+0(FP), AX | 235 MOVL context+0(FP), AX |
235 MOVL AX, 4(SP) // arg 1 - context | 236 MOVL AX, 4(SP) // arg 1 - context |
236 MOVL flags+4(FP), AX | 237 MOVL flags+4(FP), AX |
237 MOVL AX, 8(SP) // arg 2 - flags | 238 MOVL AX, 8(SP) // arg 2 - flags |
238 MOVL lwpid+8(FP), AX | 239 MOVL lwpid+8(FP), AX |
239 MOVL AX, 12(SP) // arg 3 - lwpid | 240 MOVL AX, 12(SP) // arg 3 - lwpid |
240 MOVL $309, AX // sys__lwp_create | 241 MOVL $309, AX // sys__lwp_create |
241 INT $0x80 | 242 INT $0x80 |
242 JCC 2(PC) | 243 JCC 2(PC) |
243 NEGL AX | 244 NEGL AX |
244 RET | 245 RET |
245 | 246 |
246 TEXT runtime·lwp_tramp(SB),7,$0 | 247 TEXT runtime·lwp_tramp(SB),NOSPLIT,$0 |
247 | 248 |
248 // Set FS to point at m->tls | 249 // Set FS to point at m->tls |
249 LEAL m_tls(BX), BP | 250 LEAL m_tls(BX), BP |
250 PUSHAL // save registers | 251 PUSHAL // save registers |
251 PUSHL BP | 252 PUSHL BP |
252 CALL runtime·settls(SB) | 253 CALL runtime·settls(SB) |
253 POPL AX | 254 POPL AX |
254 POPAL | 255 POPAL |
255 | 256 |
256 // Now segment is established. Initialize m, g. | 257 // Now segment is established. Initialize m, g. |
(...skipping 10 matching lines...) Expand all Loading... |
267 CALL runtime·emptyfunc(SB) | 268 CALL runtime·emptyfunc(SB) |
268 POPAL | 269 POPAL |
269 | 270 |
270 // Call fn | 271 // Call fn |
271 CALL SI | 272 CALL SI |
272 | 273 |
273 CALL runtime·exit1(SB) | 274 CALL runtime·exit1(SB) |
274 MOVL $0x1234, 0x1005 | 275 MOVL $0x1234, 0x1005 |
275 RET | 276 RET |
276 | 277 |
277 TEXT runtime·sigaltstack(SB),7,$-8 | 278 TEXT runtime·sigaltstack(SB),NOSPLIT,$-8 |
278 MOVL $281, AX // sys___sigaltstack14 | 279 MOVL $281, AX // sys___sigaltstack14 |
279 MOVL new+4(SP), BX | 280 MOVL new+4(SP), BX |
280 MOVL old+8(SP), CX | 281 MOVL old+8(SP), CX |
281 INT $0x80 | 282 INT $0x80 |
282 CMPL AX, $0xfffff001 | 283 CMPL AX, $0xfffff001 |
283 JLS 2(PC) | 284 JLS 2(PC) |
284 INT $3 | 285 INT $3 |
285 RET | 286 RET |
286 | 287 |
287 TEXT runtime·setldt(SB),7,$8 | 288 TEXT runtime·setldt(SB),NOSPLIT,$8 |
288 // Under NetBSD we set the GS base instead of messing with the LDT. | 289 // Under NetBSD we set the GS base instead of messing with the LDT. |
289 MOVL 16(SP), AX // tls0 | 290 MOVL 16(SP), AX // tls0 |
290 MOVL AX, 0(SP) | 291 MOVL AX, 0(SP) |
291 CALL runtime·settls(SB) | 292 CALL runtime·settls(SB) |
292 RET | 293 RET |
293 | 294 |
294 TEXT runtime·settls(SB),7,$16 | 295 TEXT runtime·settls(SB),NOSPLIT,$16 |
295 // adjust for ELF: wants to use -8(GS) and -4(GS) for g and m | 296 // adjust for ELF: wants to use -8(GS) and -4(GS) for g and m |
296 MOVL base+0(FP), CX | 297 MOVL base+0(FP), CX |
297 ADDL $8, CX | 298 ADDL $8, CX |
298 MOVL $0, 0(SP) // syscall gap | 299 MOVL $0, 0(SP) // syscall gap |
299 MOVL CX, 4(SP) // arg 1 - ptr | 300 MOVL CX, 4(SP) // arg 1 - ptr |
300 MOVL $317, AX // sys__lwp_setprivate | 301 MOVL $317, AX // sys__lwp_setprivate |
301 INT $0x80 | 302 INT $0x80 |
302 JCC 2(PC) | 303 JCC 2(PC) |
303 MOVL $0xf1, 0xf1 // crash | 304 MOVL $0xf1, 0xf1 // crash |
304 RET | 305 RET |
305 | 306 |
306 TEXT runtime·osyield(SB),7,$-4 | 307 TEXT runtime·osyield(SB),NOSPLIT,$-4 |
307 MOVL $350, AX // sys_sched_yield | 308 MOVL $350, AX // sys_sched_yield |
308 INT $0x80 | 309 INT $0x80 |
309 RET | 310 RET |
310 | 311 |
311 TEXT runtime·lwp_park(SB),7,$-4 | 312 TEXT runtime·lwp_park(SB),NOSPLIT,$-4 |
312 MOVL $434, AX // sys__lwp_park | 313 MOVL $434, AX // sys__lwp_park |
313 INT $0x80 | 314 INT $0x80 |
314 RET | 315 RET |
315 | 316 |
316 TEXT runtime·lwp_unpark(SB),7,$-4 | 317 TEXT runtime·lwp_unpark(SB),NOSPLIT,$-4 |
317 MOVL $321, AX // sys__lwp_unpark | 318 MOVL $321, AX // sys__lwp_unpark |
318 INT $0x80 | 319 INT $0x80 |
319 RET | 320 RET |
320 | 321 |
321 TEXT runtime·lwp_self(SB),7,$-4 | 322 TEXT runtime·lwp_self(SB),NOSPLIT,$-4 |
322 MOVL $311, AX // sys__lwp_self | 323 MOVL $311, AX // sys__lwp_self |
323 INT $0x80 | 324 INT $0x80 |
324 RET | 325 RET |
325 | 326 |
326 TEXT runtime·sysctl(SB),7,$28 | 327 TEXT runtime·sysctl(SB),NOSPLIT,$28 |
327 LEAL arg0+0(FP), SI | 328 LEAL arg0+0(FP), SI |
328 LEAL 4(SP), DI | 329 LEAL 4(SP), DI |
329 CLD | 330 CLD |
330 MOVSL // arg 1 - name | 331 MOVSL // arg 1 - name |
331 MOVSL // arg 2 - namelen | 332 MOVSL // arg 2 - namelen |
332 MOVSL // arg 3 - oldp | 333 MOVSL // arg 3 - oldp |
333 MOVSL // arg 4 - oldlenp | 334 MOVSL // arg 4 - oldlenp |
334 MOVSL // arg 5 - newp | 335 MOVSL // arg 5 - newp |
335 MOVSL // arg 6 - newlen | 336 MOVSL // arg 6 - newlen |
336 MOVL $202, AX // sys___sysctl | 337 MOVL $202, AX // sys___sysctl |
337 INT $0x80 | 338 INT $0x80 |
338 JCC 3(PC) | 339 JCC 3(PC) |
339 NEGL AX | 340 NEGL AX |
340 RET | 341 RET |
341 MOVL $0, AX | 342 MOVL $0, AX |
342 RET | 343 RET |
343 | 344 |
344 GLOBL runtime·tlsoffset(SB),$4 | 345 GLOBL runtime·tlsoffset(SB),$4 |
LEFT | RIGHT |