// Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // // System calls and other sys.stuff for 386, Linux // #include "386/asm.h" // http://code.google.com/p/nativeclient/source/browse/trunk/src/native_client/src/trusted/service_runtime/include/bits/nacl_syscalls.h #define SYS_exit 30 #define SYS_mmap 21 #define SYS_thread_create 80 #define SYS_thread_exit 81 #define SYS_tls_init 82 #define SYS_write 13 #define SYS_close 11 #define SYS_mutex_create 70 #define SYS_mutex_lock 71 #define SYS_mutex_unlock 73 #define SYSCALL(x) $(0x10000+SYS_/**/x * 32) TEXT exit(SB),7,$4 MOVL code+0(FP), AX MOVL AX, 0(SP) CALL SYSCALL(exit) INT $3 // not reached RET TEXT exit1(SB),7,$4 MOVL code+0(FP), AX MOVL AX, 0(SP) CALL SYSCALL(thread_exit) INT $3 // not reached RET TEXT write(SB),7,$0 JMP SYSCALL(write) TEXT close(SB),7,$0 JMP SYSCALL(close) TEXT mutex_create(SB),7,$0 JMP SYSCALL(mutex_create) TEXT mutex_lock(SB),7,$0 JMP SYSCALL(mutex_lock) TEXT mutex_unlock(SB),7,$0 JMP SYSCALL(mutex_unlock) TEXT thread_create(SB),7,$0 JMP SYSCALL(thread_create) TEXT runtime·mmap(SB),7,$24 MOVL a1+0(FP), BX MOVL a2+4(FP), CX // round up to 64 kB boundary; silences nacl warning ADDL $(64*1024-1), CX ANDL $~(64*1024-1), CX MOVL a3+8(FP), DX MOVL a4+12(FP), SI MOVL a5+16(FP), DI MOVL a6+20(FP), BP MOVL BX, 0(SP) MOVL CX, 4(SP) MOVL DX, 8(SP) MOVL SI, 12(SP) MOVL DI, 16(SP) MOVL BP, 20(SP) CALL SYSCALL(mmap) CMPL AX, $0xfffff001 JLS 6(PC) MOVL $1, 0(SP) MOVL $mmap_failed(SB), 4(SP) MOVL $12, 8(SP) // "mmap failed\n" CALL SYSCALL(write) INT $3 RET // setldt(int entry, int address, int limit) TEXT setldt(SB),7,$32 // entry is ignored - nacl tells us the // segment selector to use and stores it in GS. MOVL address+4(FP), BX MOVL limit+8(FP), CX MOVL BX, 0(SP) MOVL CX, 4(SP) CALL SYSCALL(tls_init) CMPL AX, $0xfffff001 JLS 6(PC) MOVL $1, 0(SP) MOVL $tls_init_failed(SB), 4(SP) MOVL $16, 8(SP) // "tls_init failed\n" CALL SYSCALL(write) INT $3 RET // There's no good way (yet?) to get stack traces out of a // broken NaCl process, so if something goes wrong, // print an error string before dying. DATA mmap_failed(SB)/8, $"mmap fai" DATA mmap_failed+8(SB)/4, $"led\n" GLOBL mmap_failed(SB), $12 DATA tls_init_failed(SB)/8, $"tls_init" DATA tls_init_failed+8(SB)/8, $" failed\n" GLOBL tls_init_failed(SB), $16