1
// Copyright 2013 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.
5
#include "zasm_GOOS_GOARCH.h"
6
#include "../../cmd/ld/textflag.h"
7
#include "syscall_nacl.h"
9
#define NACL_SYSCALL(code) \
10
MOVL $(0x10000 + ((code)<<5)), AX; CALL AX
12
#define NACL_SYSJMP(code) \
13
MOVL $(0x10000 + ((code)<<5)), AX; JMP AX
15
TEXT runtime·settls(SB),NOSPLIT,$0
16
MOVL DI, TLS // really BP
19
TEXT runtime·exit(SB),NOSPLIT,$0
23
TEXT runtime·exit1(SB),NOSPLIT,$0
25
NACL_SYSJMP(SYS_thread_exit)
27
TEXT runtime·open(SB),NOSPLIT,$0
33
TEXT runtime·close(SB),NOSPLIT,$0
35
NACL_SYSJMP(SYS_close)
37
TEXT runtime·read(SB),NOSPLIT,$0
43
TEXT syscall·naclWrite(SB), NOSPLIT, $16-20
50
CALL runtime·write(SB)
54
TEXT runtime·write(SB),NOSPLIT,$16-12
55
// If using fake time and writing to stdout or stderr,
56
// emit playback header before actual data.
57
MOVQ runtime·timens(SB), AX
71
NACL_SYSCALL(SYS_write)
74
// Write with playback header.
75
// First, lock to avoid interleaving writes.
78
XCHGL runtime·writelock(SB), BX
82
// Playback header: 0 0 P B <8-byte time> <4-byte data length>
83
MOVL $(('B'<<24) | ('P'<<16)), 0(SP)
89
MOVL $1, DI // standard output
92
NACL_SYSCALL(SYS_write)
95
MOVL $1, DI // standard output
98
NACL_SYSCALL(SYS_write)
101
MOVL $0, runtime·writelock(SB)
105
TEXT runtime·nacl_exception_stack(SB),NOSPLIT,$0
108
NACL_SYSJMP(SYS_exception_stack)
110
TEXT runtime·nacl_exception_handler(SB),NOSPLIT,$0
113
NACL_SYSJMP(SYS_exception_handler)
115
TEXT runtime·nacl_sem_create(SB),NOSPLIT,$0
117
NACL_SYSJMP(SYS_sem_create)
119
TEXT runtime·nacl_sem_wait(SB),NOSPLIT,$0
121
NACL_SYSJMP(SYS_sem_wait)
123
TEXT runtime·nacl_sem_post(SB),NOSPLIT,$0
125
NACL_SYSJMP(SYS_sem_post)
127
TEXT runtime·nacl_mutex_create(SB),NOSPLIT,$0
129
NACL_SYSJMP(SYS_mutex_create)
131
TEXT runtime·nacl_mutex_lock(SB),NOSPLIT,$0
133
NACL_SYSJMP(SYS_mutex_lock)
135
TEXT runtime·nacl_mutex_trylock(SB),NOSPLIT,$0
137
NACL_SYSJMP(SYS_mutex_trylock)
139
TEXT runtime·nacl_mutex_unlock(SB),NOSPLIT,$0
141
NACL_SYSJMP(SYS_mutex_unlock)
143
TEXT runtime·nacl_cond_create(SB),NOSPLIT,$0
145
NACL_SYSJMP(SYS_cond_create)
147
TEXT runtime·nacl_cond_wait(SB),NOSPLIT,$0
150
NACL_SYSJMP(SYS_cond_wait)
152
TEXT runtime·nacl_cond_signal(SB),NOSPLIT,$0
154
NACL_SYSJMP(SYS_cond_signal)
156
TEXT runtime·nacl_cond_broadcast(SB),NOSPLIT,$0
158
NACL_SYSJMP(SYS_cond_broadcast)
160
TEXT runtime·nacl_cond_timed_wait_abs(SB),NOSPLIT,$0
164
NACL_SYSJMP(SYS_cond_timed_wait_abs)
166
TEXT runtime·nacl_thread_create(SB),NOSPLIT,$0
171
NACL_SYSJMP(SYS_thread_create)
173
TEXT runtime·mstart_nacl(SB),NOSPLIT,$0
174
NACL_SYSCALL(SYS_tls_get)
177
JMP runtime·mstart(SB)
179
TEXT runtime·nacl_nanosleep(SB),NOSPLIT,$0
182
NACL_SYSJMP(SYS_nanosleep)
184
TEXT runtime·osyield(SB),NOSPLIT,$0
185
NACL_SYSJMP(SYS_sched_yield)
187
TEXT runtime·mmap(SB),NOSPLIT,$8
196
NACL_SYSCALL(SYS_mmap)
202
TEXT time·now(SB),NOSPLIT,$16
203
MOVQ runtime·timens(SB), AX
213
MOVL $0, DI // real time clock
215
MOVL AX, SI // timespec
216
NACL_SYSCALL(SYS_clock_gettime)
217
MOVL 0(SP), AX // low 32 sec
218
MOVL 4(SP), CX // high 32 sec
219
MOVL 8(SP), BX // nsec
221
// sec is in AX, nsec in BX
227
TEXT syscall·now(SB),NOSPLIT,$0
230
TEXT runtime·nacl_clock_gettime(SB),NOSPLIT,$0
233
NACL_SYSJMP(SYS_clock_gettime)
235
TEXT runtime·nanotime(SB),NOSPLIT,$16
236
MOVQ runtime·timens(SB), AX
240
MOVL $0, DI // real time clock
242
MOVL AX, SI // timespec
243
NACL_SYSCALL(SYS_clock_gettime)
244
MOVQ 0(SP), AX // sec
245
MOVL 8(SP), DX // nsec
247
// sec is in AX, nsec in DX
249
IMULQ $1000000000, AX
253
TEXT runtime·sigtramp(SB),NOSPLIT,$80
254
// restore TLS register at time of execution,
255
// in case it's been smashed.
256
// the TLS register is really BP, but for consistency
257
// with non-NaCl systems it is referred to here as TLS.
258
// NOTE: Cannot use SYS_tls_get here (like we do in mstart_nacl),
259
// because the main thread never calls tls_set.
261
MOVL (16*4+5*8)(AX), AX
264
// check that m exists
276
MOVL m_gsignal(BX), BX
281
// copy arguments for sighandler
282
MOVL $11, 0(SP) // signal
283
MOVL $0, 4(SP) // siginfo
285
MOVL AX, 8(SP) // context
288
CALL runtime·sighandler(SB)
296
// Enable exceptions again.
297
NACL_SYSCALL(SYS_exception_clear_flag)
299
// Restore registers as best we can. Impossible to do perfectly.
300
// See comment in sys_nacl_386.s for extended rationale.
307
MOVL 32(SI), SP // MOVL for SP sandboxing
308
// 40(SI) is saved BP aka TLS, already restored above
309
// 48(SI) is saved SI, never to be seen again
318
// 120(SI) is R15, which is owned by Native Client and must not be modified
319
MOVQ 128(SI), SI // saved PC
320
// 136(SI) is saved EFLAGS, never to be seen again
324
// print basic information
326
MOVL $runtime·sigtrampf(SB), AX
328
MOVQ (16*4+16*8)(DI), BX // rip
330
MOVQ (16*4+0*8)(DI), BX // rax
332
MOVQ (16*4+1*8)(DI), BX // rcx
334
MOVQ (16*4+2*8)(DI), BX // rdx
336
MOVQ (16*4+3*8)(DI), BX // rbx
338
MOVQ (16*4+7*8)(DI), BX // rdi
340
MOVQ (16*4+15*8)(DI), BX // r15
342
MOVQ (16*4+4*8)(DI), BX // rsp
345
CALL runtime·printf(SB)
348
MOVQ (16*4+16*8)(DI), BX // rip
350
MOVQ (16*4+4*8)(DI), BX // rsp
355
MOVL BX, 12(SP) // gp
356
CALL runtime·traceback(SB)
366
// cannot do real signal handling yet, because gsignal has not been allocated.
367
MOVL $1, DI; NACL_SYSCALL(SYS_exit)
369
TEXT runtime·nacl_sysinfo(SB),NOSPLIT,$16
377
MOVL BX, runtime·nacl_irt_query(SB)
389
MOVL BX, runtime·nacl_irt_query(SB)
391
LEAL runtime·nacl_irt_basic_v0_1_str(SB), DI
392
LEAL runtime·nacl_irt_basic_v0_1(SB), SI
393
MOVL runtime·nacl_irt_basic_v0_1_size(SB), DX
394
MOVL runtime·nacl_irt_query(SB), BX
397
LEAL runtime·nacl_irt_memory_v0_3_str(SB), DI
398
LEAL runtime·nacl_irt_memory_v0_3(SB), SI
399
MOVL runtime·nacl_irt_memory_v0_3_size(SB), DX
400
MOVL runtime·nacl_irt_query(SB), BX
403
LEAL runtime·nacl_irt_thread_v0_1_str(SB), DI
404
LEAL runtime·nacl_irt_thread_v0_1(SB), SI
405
MOVL runtime·nacl_irt_thread_v0_1_size(SB), DX
406
MOVL runtime·nacl_irt_query(SB), BX
409
// TODO: Once we have a NaCl SDK with futex syscall support,
410
// try switching to futex syscalls and here load the
411
// nacl-irt-futex-0.1 table.