aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/linux
diff options
context:
space:
mode:
Diffstat (limited to 'src/runtime/linux')
-rwxr-xr-xsrc/runtime/linux/386/defs.h136
-rwxr-xr-xsrc/runtime/linux/386/rt0.s8
-rw-r--r--src/runtime/linux/386/signal.c102
-rwxr-xr-xsrc/runtime/linux/386/sys.s222
-rw-r--r--src/runtime/linux/amd64/defs.h175
-rw-r--r--src/runtime/linux/amd64/rt0.s9
-rw-r--r--src/runtime/linux/amd64/signal.c112
-rw-r--r--src/runtime/linux/amd64/sys.s193
-rw-r--r--src/runtime/linux/arm/defs.h27
-rw-r--r--src/runtime/linux/arm/rt0.s6
-rw-r--r--src/runtime/linux/arm/signal.c4
-rw-r--r--src/runtime/linux/arm/sys.s15
-rw-r--r--src/runtime/linux/defs.c40
-rw-r--r--src/runtime/linux/defs1.c25
-rw-r--r--src/runtime/linux/defs2.c51
-rw-r--r--src/runtime/linux/defs_arm.c54
-rw-r--r--src/runtime/linux/os.h10
-rw-r--r--src/runtime/linux/signals.h48
-rw-r--r--src/runtime/linux/thread.c282
19 files changed, 0 insertions, 1519 deletions
diff --git a/src/runtime/linux/386/defs.h b/src/runtime/linux/386/defs.h
deleted file mode 100755
index 112fc7b094..0000000000
--- a/src/runtime/linux/386/defs.h
+++ /dev/null
@@ -1,136 +0,0 @@
-// godefs -f -m32 -f -I/home/rsc/pub/linux-2.6/arch/x86/include -f -I/home/rsc/pub/linux-2.6/include defs2.c
-
-// MACHINE GENERATED - DO NOT EDIT.
-
-// Constants
-enum {
- PROT_NONE = 0,
- PROT_READ = 0x1,
- PROT_WRITE = 0x2,
- PROT_EXEC = 0x4,
- MAP_ANON = 0x20,
- MAP_PRIVATE = 0x2,
- SA_RESTART = 0x10000000,
- SA_ONSTACK = 0x8000000,
- SA_RESTORER = 0x4000000,
- SA_SIGINFO = 0x4,
-};
-
-// Types
-#pragma pack on
-
-typedef struct Fpreg Fpreg;
-struct Fpreg {
- uint16 significand[4];
- uint16 exponent;
-};
-
-typedef struct Fpxreg Fpxreg;
-struct Fpxreg {
- uint16 significand[4];
- uint16 exponent;
- uint16 padding[3];
-};
-
-typedef struct Xmmreg Xmmreg;
-struct Xmmreg {
- uint32 element[4];
-};
-
-typedef struct Fpstate Fpstate;
-struct Fpstate {
- uint32 cw;
- uint32 sw;
- uint32 tag;
- uint32 ipoff;
- uint32 cssel;
- uint32 dataoff;
- uint32 datasel;
- Fpreg _st[8];
- uint16 status;
- uint16 magic;
- uint32 _fxsr_env[6];
- uint32 mxcsr;
- uint32 reserved;
- Fpxreg _fxsr_st[8];
- Xmmreg _xmm[8];
- uint32 padding1[44];
- byte _anon_[48];
-};
-
-typedef struct Timespec Timespec;
-struct Timespec {
- int32 tv_sec;
- int32 tv_nsec;
-};
-
-typedef struct Timeval Timeval;
-struct Timeval {
- int32 tv_sec;
- int32 tv_usec;
-};
-
-typedef struct Sigaction Sigaction;
-struct Sigaction {
- byte _u[4];
- uint32 sa_mask;
- uint32 sa_flags;
- void *sa_restorer;
-};
-
-typedef struct Siginfo Siginfo;
-struct Siginfo {
- int32 si_signo;
- int32 si_errno;
- int32 si_code;
- byte _sifields[116];
-};
-
-typedef struct Sigaltstack Sigaltstack;
-struct Sigaltstack {
- void *ss_sp;
- int32 ss_flags;
- uint32 ss_size;
-};
-
-typedef struct Sigcontext Sigcontext;
-struct Sigcontext {
- uint16 gs;
- uint16 __gsh;
- uint16 fs;
- uint16 __fsh;
- uint16 es;
- uint16 __esh;
- uint16 ds;
- uint16 __dsh;
- uint32 edi;
- uint32 esi;
- uint32 ebp;
- uint32 esp;
- uint32 ebx;
- uint32 edx;
- uint32 ecx;
- uint32 eax;
- uint32 trapno;
- uint32 err;
- uint32 eip;
- uint16 cs;
- uint16 __csh;
- uint32 eflags;
- uint32 esp_at_signal;
- uint16 ss;
- uint16 __ssh;
- Fpstate *fpstate;
- uint32 oldmask;
- uint32 cr2;
-};
-
-typedef struct Ucontext Ucontext;
-struct Ucontext {
- uint32 uc_flags;
- Ucontext *uc_link;
- Sigaltstack uc_stack;
- Sigcontext uc_mcontext;
- uint32 uc_sigmask;
-};
-#pragma pack off
diff --git a/src/runtime/linux/386/rt0.s b/src/runtime/linux/386/rt0.s
deleted file mode 100755
index 7717c37e86..0000000000
--- a/src/runtime/linux/386/rt0.s
+++ /dev/null
@@ -1,8 +0,0 @@
-// 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.
-
-// Darwin and Linux use the same linkage to main
-
-TEXT _rt0_386_linux(SB),7,$0
- JMP _rt0_386(SB)
diff --git a/src/runtime/linux/386/signal.c b/src/runtime/linux/386/signal.c
deleted file mode 100644
index 7dfca6bb40..0000000000
--- a/src/runtime/linux/386/signal.c
+++ /dev/null
@@ -1,102 +0,0 @@
-// 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.
-
-#include "runtime.h"
-#include "defs.h"
-#include "signals.h"
-#include "os.h"
-
-void
-dumpregs(Sigcontext *r)
-{
- printf("eax %X\n", r->eax);
- printf("ebx %X\n", r->ebx);
- printf("ecx %X\n", r->ecx);
- printf("edx %X\n", r->edx);
- printf("edi %X\n", r->edi);
- printf("esi %X\n", r->esi);
- printf("ebp %X\n", r->ebp);
- printf("esp %X\n", r->esp);
- printf("eip %X\n", r->eip);
- printf("eflags %X\n", r->eflags);
- printf("cs %X\n", r->cs);
- printf("fs %X\n", r->fs);
- printf("gs %X\n", r->gs);
-}
-
-/*
- * This assembler routine takes the args from registers, puts them on the stack,
- * and calls sighandler().
- */
-extern void sigtramp(void);
-extern void sigignore(void); // just returns
-extern void sigreturn(void); // calls sigreturn
-
-void
-sighandler(int32 sig, Siginfo* info, void* context)
-{
- Ucontext *uc;
- Sigcontext *sc;
-
- if(panicking) // traceback already printed
- exit(2);
- panicking = 1;
-
- uc = context;
- sc = &uc->uc_mcontext;
-
- if(sig < 0 || sig >= NSIG)
- printf("Signal %d\n", sig);
- else
- printf("%s\n", sigtab[sig].name);
-
- printf("Faulting address: %p\n", *(void**)info->_sifields);
- printf("pc=%X\n", sc->eip);
- printf("\n");
-
- if(gotraceback()){
- traceback((void*)sc->eip, (void*)sc->esp, m->curg);
- tracebackothers(m->curg);
- dumpregs(sc);
- }
-
- breakpoint();
- exit(2);
-}
-
-void
-signalstack(byte *p, int32 n)
-{
- Sigaltstack st;
-
- st.ss_sp = p;
- st.ss_size = n;
- st.ss_flags = 0;
- sigaltstack(&st, nil);
-}
-
-void
-initsig(void)
-{
- static Sigaction sa;
-
- int32 i;
- sa.sa_flags = SA_ONSTACK | SA_SIGINFO | SA_RESTORER;
- sa.sa_mask = 0xFFFFFFFFFFFFFFFFULL;
- sa.sa_restorer = (void*)sigreturn;
- for(i = 0; i<NSIG; i++) {
- if(sigtab[i].flags) {
- if(sigtab[i].flags & SigCatch)
- *(void**)sa._u = (void*)sigtramp; // handler
- else
- *(void**)sa._u = (void*)sigignore; // handler
- if(sigtab[i].flags & SigRestart)
- sa.sa_flags |= SA_RESTART;
- else
- sa.sa_flags &= ~SA_RESTART;
- rt_sigaction(i, &sa, nil, 8);
- }
- }
-}
-
diff --git a/src/runtime/linux/386/sys.s b/src/runtime/linux/386/sys.s
deleted file mode 100755
index 419973a5ca..0000000000
--- a/src/runtime/linux/386/sys.s
+++ /dev/null
@@ -1,222 +0,0 @@
-// 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
-//
-
-TEXT syscall(SB),7,$0
- MOVL 4(SP), AX // syscall number
- MOVL 8(SP), BX // arg1
- MOVL 12(SP), CX // arg2
- MOVL 16(SP), DX // arg3
- MOVL 20(SP), SI // arg4
- MOVL 24(SP), DI // arg5
- MOVL 28(SP), BP // arg6
- INT $0x80
- CMPL AX, $0xfffff001
- JLS 2(PC)
- INT $3 // not reached
- RET
-
-TEXT exit(SB),7,$0
- MOVL $252, AX // syscall number
- MOVL 4(SP), BX
- INT $0x80
- INT $3 // not reached
- RET
-
-TEXT exit1(SB),7,$0
- MOVL $1, AX // exit - exit the current os thread
- MOVL 4(SP), BX
- INT $0x80
- INT $3 // not reached
- RET
-
-TEXT write(SB),7,$0
- MOVL $4, AX // syscall - write
- MOVL 4(SP), BX
- MOVL 8(SP), CX
- MOVL 12(SP), DX
- INT $0x80
- RET
-
-TEXT getpid(SB),7,$0
- MOVL $20, AX
- INT $0x80
- RET
-
-TEXT kill(SB),7,$0
- MOVL $37, AX
- MOVL 4(SP), BX
- MOVL 8(SP), CX
- INT $0x80
- RET
-
-TEXT sys·write(SB),7,$0
- MOVL $4, AX // syscall - write
- MOVL 4(SP), BX
- MOVL 8(SP), CX
- MOVL 12(SP), DX
- INT $0x80
- RET
-
-TEXT rt_sigaction(SB),7,$0
- MOVL $174, AX // syscall - rt_sigaction
- MOVL 4(SP), BX
- MOVL 8(SP), CX
- MOVL 12(SP), DX
- MOVL 16(SP), SI
- INT $0x80
- RET
-
-TEXT sigtramp(SB),7,$0
- MOVL 4(FS), BP // m
- MOVL 20(BP), AX // m->gsignal
- MOVL AX, 0(FS) // g = m->gsignal
- JMP sighandler(SB)
-
-TEXT sigignore(SB),7,$0
- RET
-
-TEXT sigreturn(SB),7,$0
- MOVL 4(FS), BP // m
- MOVL 32(BP), BP // m->curg
- MOVL BP, 0(FS) // g = m->curg
- MOVL $173, AX // rt_sigreturn
- INT $0x80
- INT $3 // not reached
- RET
-
-TEXT sys·mmap(SB),7,$0
- MOVL $192, AX // mmap2
- MOVL 4(SP), BX
- MOVL 8(SP), CX
- MOVL 12(SP), DX
- MOVL 16(SP), SI
- MOVL 20(SP), DI
- MOVL 24(SP), BP
- SHRL $12, BP
- INT $0x80
- CMPL AX, $0xfffff001
- JLS 2(PC)
- INT $3
- RET
-
-// int64 futex(int32 *uaddr, int32 op, int32 val,
-// struct timespec *timeout, int32 *uaddr2, int32 val2);
-TEXT futex(SB),7,$0
- MOVL $240, AX // futex
- MOVL 4(SP), BX
- MOVL 8(SP), CX
- MOVL 12(SP), DX
- MOVL 16(SP), SI
- MOVL 20(SP), DI
- MOVL 24(SP), BP
- INT $0x80
- RET
-
-// int64 clone(int32 flags, void *stack, M *m, G *g, void (*fn)(void));
-TEXT clone(SB),7,$0
- MOVL $120, AX // clone
- MOVL flags+4(SP), BX
- MOVL stack+8(SP), CX
-
- // Copy m, g, fn off parent stack for use by child.
- SUBL $12, CX
- MOVL m+12(SP), DX
- MOVL DX, 0(CX)
- MOVL g+16(SP), DX
- MOVL DX, 4(CX)
- MOVL fn+20(SP), DX
- MOVL DX, 8(CX)
-
- MOVL $120, AX
- INT $0x80
-
- // In parent, return.
- CMPL AX, $0
- JEQ 2(PC)
- RET
-
- // In child, set up new stack, etc.
- MOVL 0(CX), BX // m
- MOVL 12(AX), AX // fs (= m->cret)
- MOVW AX, FS
- MOVL 8(CX), DX // fn
- ADDL $12, CX
- MOVL CX, SP
-
- // fn is now on top of stack.
-
- // initialize m->procid to Linux tid
- MOVL $224, AX
- INT $0x80
- MOVL AX, 20(BX)
-
- // call fn
- CALL DX
-
- // It shouldn't return; if it does, exit.
- MOVL $111, DI
- MOVL $1, AX
- INT $0x80
- JMP -3(PC) // keep exiting
-
-TEXT sigaltstack(SB),7,$-8
- MOVL $186, AX // sigaltstack
- MOVL new+4(SP), BX
- MOVL old+8(SP), CX
- INT $0x80
- CMPL AX, $0xfffff001
- JLS 2(PC)
- INT $3
- RET
-
-// // fake the per-goroutine and per-mach registers
-// LEAL m0(SB),
-
-// TODO(rsc): move to linux.s
-// <asm-i386/ldt.h>
-// struct user_desc {
-// unsigned int entry_number;
-// unsigned long base_addr;
-// unsigned int limit;
-// unsigned int seg_32bit:1;
-// unsigned int contents:2;
-// unsigned int read_exec_only:1;
-// unsigned int limit_in_pages:1;
-// unsigned int seg_not_present:1;
-// unsigned int useable:1;
-// };
-#define SEG_32BIT 0x01
-// contents are the 2 bits 0x02 and 0x04.
-#define CONTENTS_DATA 0x00
-#define CONTENTS_STACK 0x02
-#define CONTENTS_CODE 0x04
-#define READ_EXEC_ONLY 0x08
-#define LIMIT_IN_PAGES 0x10
-#define SEG_NOT_PRESENT 0x20
-#define USEABLE 0x40
-
-// setldt(int entry, int address, int limit)
-TEXT setldt(SB),7,$32
- // set up user_desc
- LEAL 16(SP), AX // struct user_desc
- MOVL entry+0(FP), BX // entry
- MOVL BX, 0(AX)
- MOVL address+4(FP), BX // base address
- MOVL BX, 4(AX)
- MOVL limit+8(FP), BX // limit
- MOVL BX, 8(AX)
- MOVL $(SEG_32BIT|USEABLE|CONTENTS_DATA), 12(AX) // flag bits
-
- // call modify_ldt
- MOVL $123, 0(SP) // syscall - modify_ldt
- MOVL $1, 4(SP) // func = 1 (write)
- MOVL AX, 8(SP) // user_desc
- MOVL $16, 12(SP) // sizeof(user_desc)
- CALL syscall(SB)
- RET
-
diff --git a/src/runtime/linux/amd64/defs.h b/src/runtime/linux/amd64/defs.h
deleted file mode 100644
index 43b0475239..0000000000
--- a/src/runtime/linux/amd64/defs.h
+++ /dev/null
@@ -1,175 +0,0 @@
-// godefs -f -m64 defs.c
-
-// MACHINE GENERATED - DO NOT EDIT.
-
-// Constants
-enum {
- PROT_NONE = 0,
- PROT_READ = 0x1,
- PROT_WRITE = 0x2,
- PROT_EXEC = 0x4,
- MAP_ANON = 0x20,
- MAP_PRIVATE = 0x2,
- SA_RESTART = 0x10000000,
- SA_ONSTACK = 0x8000000,
- SA_RESTORER = 0x4000000,
- SA_SIGINFO = 0x4,
-};
-
-// Types
-#pragma pack on
-
-typedef struct Timespec Timespec;
-struct Timespec {
- int64 tv_sec;
- int64 tv_nsec;
-};
-
-typedef struct Timeval Timeval;
-struct Timeval {
- int64 tv_sec;
- int64 tv_usec;
-};
-
-typedef struct Sigaction Sigaction;
-struct Sigaction {
- void *sa_handler;
- uint64 sa_flags;
- void *sa_restorer;
- uint64 sa_mask;
-};
-
-typedef struct Siginfo Siginfo;
-struct Siginfo {
- int32 si_signo;
- int32 si_errno;
- int32 si_code;
- byte pad0[4];
- byte _sifields[112];
-};
-#pragma pack off
-// godefs -f -m64 defs1.c
-
-// MACHINE GENERATED - DO NOT EDIT.
-
-// Constants
-
-// Types
-#pragma pack on
-
-typedef struct Usigset Usigset;
-struct Usigset {
- uint64 __val[16];
-};
-
-typedef struct Fpxreg Fpxreg;
-struct Fpxreg {
- uint16 significand[4];
- uint16 exponent;
- uint16 padding[3];
-};
-
-typedef struct Xmmreg Xmmreg;
-struct Xmmreg {
- uint32 element[4];
-};
-
-typedef struct Fpstate Fpstate;
-struct Fpstate {
- uint16 cwd;
- uint16 swd;
- uint16 ftw;
- uint16 fop;
- uint64 rip;
- uint64 rdp;
- uint32 mxcsr;
- uint32 mxcr_mask;
- Fpxreg _st[8];
- Xmmreg _xmm[16];
- uint32 padding[24];
-};
-
-typedef struct Fpxreg1 Fpxreg1;
-struct Fpxreg1 {
- uint16 significand[4];
- uint16 exponent;
- uint16 padding[3];
-};
-
-typedef struct Xmmreg1 Xmmreg1;
-struct Xmmreg1 {
- uint32 element[4];
-};
-
-typedef struct Fpstate1 Fpstate1;
-struct Fpstate1 {
- uint16 cwd;
- uint16 swd;
- uint16 ftw;
- uint16 fop;
- uint64 rip;
- uint64 rdp;
- uint32 mxcsr;
- uint32 mxcr_mask;
- Fpxreg1 _st[8];
- Xmmreg1 _xmm[16];
- uint32 padding[24];
-};
-
-typedef struct Sigaltstack Sigaltstack;
-struct Sigaltstack {
- void *ss_sp;
- int32 ss_flags;
- byte pad0[4];
- uint64 ss_size;
-};
-
-typedef struct Mcontext Mcontext;
-struct Mcontext {
- int64 gregs[23];
- Fpstate *fpregs;
- uint64 __reserved1[8];
-};
-
-typedef struct Ucontext Ucontext;
-struct Ucontext {
- uint64 uc_flags;
- Ucontext *uc_link;
- Sigaltstack uc_stack;
- Mcontext uc_mcontext;
- Usigset uc_sigmask;
- Fpstate __fpregs_mem;
-};
-
-typedef struct Sigcontext Sigcontext;
-struct Sigcontext {
- uint64 r8;
- uint64 r9;
- uint64 r10;
- uint64 r11;
- uint64 r12;
- uint64 r13;
- uint64 r14;
- uint64 r15;
- uint64 rdi;
- uint64 rsi;
- uint64 rbp;
- uint64 rbx;
- uint64 rdx;
- uint64 rax;
- uint64 rcx;
- uint64 rsp;
- uint64 rip;
- uint64 eflags;
- uint16 cs;
- uint16 gs;
- uint16 fs;
- uint16 __pad0;
- uint64 err;
- uint64 trapno;
- uint64 oldmask;
- uint64 cr2;
- Fpstate1 *fpstate;
- uint64 __reserved1[8];
-};
-#pragma pack off
diff --git a/src/runtime/linux/amd64/rt0.s b/src/runtime/linux/amd64/rt0.s
deleted file mode 100644
index 55be5bceef..0000000000
--- a/src/runtime/linux/amd64/rt0.s
+++ /dev/null
@@ -1,9 +0,0 @@
-// 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.
-
-// Darwin and Linux use the same linkage to main
-
-TEXT _rt0_amd64_linux(SB),7,$-8
- MOVQ $_rt0_amd64(SB), AX
- JMP AX
diff --git a/src/runtime/linux/amd64/signal.c b/src/runtime/linux/amd64/signal.c
deleted file mode 100644
index 55215176de..0000000000
--- a/src/runtime/linux/amd64/signal.c
+++ /dev/null
@@ -1,112 +0,0 @@
-// 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.
-
-#include "runtime.h"
-#include "defs.h"
-#include "signals.h"
-#include "os.h"
-
-void
-dumpregs(Sigcontext *r)
-{
- printf("rax %X\n", r->rax);
- printf("rbx %X\n", r->rbx);
- printf("rcx %X\n", r->rcx);
- printf("rdx %X\n", r->rdx);
- printf("rdi %X\n", r->rdi);
- printf("rsi %X\n", r->rsi);
- printf("rbp %X\n", r->rbp);
- printf("rsp %X\n", r->rsp);
- printf("r8 %X\n", r->r8 );
- printf("r9 %X\n", r->r9 );
- printf("r10 %X\n", r->r10);
- printf("r11 %X\n", r->r11);
- printf("r12 %X\n", r->r12);
- printf("r13 %X\n", r->r13);
- printf("r14 %X\n", r->r14);
- printf("r15 %X\n", r->r15);
- printf("rip %X\n", r->rip);
- printf("rflags %X\n", r->eflags);
- printf("cs %X\n", (uint64)r->cs);
- printf("fs %X\n", (uint64)r->fs);
- printf("gs %X\n", (uint64)r->gs);
-}
-
-/*
- * This assembler routine takes the args from registers, puts them on the stack,
- * and calls sighandler().
- */
-extern void sigtramp(void);
-extern void sigignore(void); // just returns
-extern void sigreturn(void); // calls sigreturn
-
-void
-sighandler(int32 sig, Siginfo* info, void* context)
-{
- Ucontext *uc;
- Mcontext *mc;
- Sigcontext *sc;
-
- if(panicking) // traceback already printed
- exit(2);
- panicking = 1;
-
- uc = context;
- mc = &uc->uc_mcontext;
- sc = (Sigcontext*)mc; // same layout, more conveient names
-
- if(sig < 0 || sig >= NSIG)
- printf("Signal %d\n", sig);
- else
- printf("%s\n", sigtab[sig].name);
-
- printf("Faulting address: %p\n", *(void**)info->_sifields);
- printf("PC=%X\n", sc->rip);
- printf("\n");
-
- if(gotraceback()){
- traceback((void*)sc->rip, (void*)sc->rsp, (void*)sc->r15);
- tracebackothers((void*)sc->r15);
- dumpregs(sc);
- }
-
- breakpoint();
- exit(2);
-}
-
-void
-signalstack(byte *p, int32 n)
-{
- Sigaltstack st;
-
- st.ss_sp = p;
- st.ss_size = n;
- st.ss_flags = 0;
- sigaltstack(&st, nil);
-}
-
-void
-initsig(void)
-{
- static Sigaction sa;
-
- int32 i;
- sa.sa_flags = SA_ONSTACK | SA_SIGINFO | SA_RESTORER;
- sa.sa_mask = 0xFFFFFFFFFFFFFFFFULL;
- sa.sa_restorer = (void*)sigreturn;
- for(i = 0; i<NSIG; i++) {
- if(sigtab[i].flags) {
- if(sigtab[i].flags & SigCatch)
- sa.sa_handler = (void*)sigtramp;
- else
- sa.sa_handler = (void*)sigignore;
- if(sigtab[i].flags & SigRestart)
- sa.sa_flags |= SA_RESTART;
- else
- sa.sa_flags &= ~SA_RESTART;
- rt_sigaction(i, &sa, nil, 8);
- }
- }
-}
-
diff --git a/src/runtime/linux/amd64/sys.s b/src/runtime/linux/amd64/sys.s
deleted file mode 100644
index f90c704faf..0000000000
--- a/src/runtime/linux/amd64/sys.s
+++ /dev/null
@@ -1,193 +0,0 @@
-// 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 AMD64, Linux
-//
-
-TEXT exit(SB),7,$0-8
- MOVL 8(SP), DI
- MOVL $231, AX // exitgroup - force all os threads to exi
- SYSCALL
- RET
-
-TEXT exit1(SB),7,$0-8
- MOVL 8(SP), DI
- MOVL $60, AX // exit - exit the current os thread
- SYSCALL
- RET
-
-TEXT open(SB),7,$0-16
- MOVQ 8(SP), DI
- MOVL 16(SP), SI
- MOVL 20(SP), DX
- MOVL $2, AX // syscall entry
- SYSCALL
- RET
-
-TEXT close(SB),7,$0-8
- MOVL 8(SP), DI
- MOVL $3, AX // syscall entry
- SYSCALL
- RET
-
-TEXT fstat(SB),7,$0-16
- MOVL 8(SP), DI
- MOVQ 16(SP), SI
- MOVL $5, AX // syscall entry
- SYSCALL
- RET
-
-TEXT read(SB),7,$0-24
- MOVL 8(SP), DI
- MOVQ 16(SP), SI
- MOVL 24(SP), DX
- MOVL $0, AX // syscall entry
- SYSCALL
- RET
-
-TEXT write(SB),7,$0-24
- MOVL 8(SP), DI
- MOVQ 16(SP), SI
- MOVL 24(SP), DX
- MOVL $1, AX // syscall entry
- SYSCALL
- RET
-
-TEXT sys·write(SB),7,$0-24
- MOVL 8(SP), DI
- MOVQ 16(SP), SI
- MOVL 24(SP), DX
- MOVL $1, AX // syscall entry
- SYSCALL
- RET
-
-TEXT rt_sigaction(SB),7,$0-32
- MOVL 8(SP), DI
- MOVQ 16(SP), SI
- MOVQ 24(SP), DX
- MOVQ 32(SP), R10
- MOVL $13, AX // syscall entry
- SYSCALL
- RET
-
-TEXT sigtramp(SB),7,$24-16
- MOVQ 32(R14), R15 // g = m->gsignal
- MOVQ DI,0(SP)
- MOVQ SI,8(SP)
- MOVQ DX,16(SP)
- CALL sighandler(SB)
- RET
-
-TEXT sigignore(SB),7,$0
- RET
-
-TEXT sigreturn(SB),7,$0
- MOVL $15, AX // rt_sigreturn
- SYSCALL
- INT $3 // not reached
-
-TEXT sys·mmap(SB),7,$0-32
- MOVQ 8(SP), DI
- MOVQ $0, SI
- MOVL 16(SP), SI
- MOVL 20(SP), DX
- MOVL 24(SP), R10
- MOVL 28(SP), R8
- MOVL 32(SP), R9
-
- MOVL $9, AX // syscall entry
- SYSCALL
- CMPQ AX, $0xfffffffffffff001
- JLS 2(PC)
- CALL notok(SB)
- RET
-
-TEXT notok(SB),7,$0
- MOVQ $0xf1, BP
- MOVQ BP, (BP)
- RET
-
-TEXT sys·memclr(SB),7,$0-16
- MOVQ 8(SP), DI // arg 1 addr
- MOVL 16(SP), CX // arg 2 count (cannot be zero)
- ADDL $7, CX
- SHRL $3, CX
- MOVQ $0, AX
- CLD
- REP
- STOSQ
- RET
-
-TEXT sys·getcallerpc+0(SB),7,$0
- MOVQ x+0(FP),AX // addr of first arg
- MOVQ -8(AX),AX // get calling pc
- RET
-
-TEXT sys·setcallerpc+0(SB),7,$0
- MOVQ x+0(FP),AX // addr of first arg
- MOVQ x+8(FP), BX
- MOVQ BX, -8(AX) // set calling pc
- RET
-
-// int64 futex(int32 *uaddr, int32 op, int32 val,
-// struct timespec *timeout, int32 *uaddr2, int32 val2);
-TEXT futex(SB),7,$0
- MOVQ 8(SP), DI
- MOVL 16(SP), SI
- MOVL 20(SP), DX
- MOVQ 24(SP), R10
- MOVQ 32(SP), R8
- MOVL 40(SP), R9
- MOVL $202, AX
- SYSCALL
- RET
-
-// int64 clone(int32 flags, void *stack, M *m, G *g, void (*fn)(void));
-TEXT clone(SB),7,$0
- MOVL flags+8(SP), DI
- MOVQ stack+16(SP), SI
-
- // Copy m, g, fn off parent stack for use by child.
- // Careful: Linux system call clobbers CX and R11.
- MOVQ m+24(SP), R8
- MOVQ g+32(SP), R9
- MOVQ fn+40(SP), R12
-
- MOVL $56, AX
- SYSCALL
-
- // In parent, return.
- CMPQ AX, $0
- JEQ 2(PC)
- RET
-
- // In child, set up new stack
- MOVQ SI, SP
- MOVQ R8, R14 // m
- MOVQ R9, R15 // g
-
- // Initialize m->procid to Linux tid
- MOVL $186, AX // gettid
- SYSCALL
- MOVQ AX, 24(R14)
-
- // Call fn
- CALL R12
-
- // It shouldn't return. If it does, exi
- MOVL $111, DI
- MOVL $60, AX
- SYSCALL
- JMP -3(PC) // keep exiting
-
-TEXT sigaltstack(SB),7,$-8
- MOVQ new+8(SP), DI
- MOVQ old+16(SP), SI
- MOVQ $131, AX
- SYSCALL
- CMPQ AX, $0xfffffffffffff001
- JLS 2(PC)
- CALL notok(SB)
- RET
diff --git a/src/runtime/linux/arm/defs.h b/src/runtime/linux/arm/defs.h
deleted file mode 100644
index caad669895..0000000000
--- a/src/runtime/linux/arm/defs.h
+++ /dev/null
@@ -1,27 +0,0 @@
-// godefs -carm-gcc -f -I/usr/local/google/src/linux-2.6.28/arch/arm/include -f -I/usr/local/google/src/linux-2.6.28/include defs_arm.c
-
-// MACHINE GENERATED - DO NOT EDIT.
-
-// Constants
-enum {
- PROT_NONE = 0,
- PROT_READ = 0x1,
- PROT_WRITE = 0x2,
- PROT_EXEC = 0x4,
- MAP_ANON = 0x20,
- MAP_PRIVATE = 0x2,
- SA_RESTART = 0x10000000,
- SA_ONSTACK = 0x8000000,
- SA_RESTORER = 0x4000000,
- SA_SIGINFO = 0x4,
-};
-
-// Types
-#pragma pack on
-
-typedef struct Timespec Timespec;
-struct Timespec {
- int32 tv_sec;
- int32 tv_nsec;
-};
-#pragma pack off
diff --git a/src/runtime/linux/arm/rt0.s b/src/runtime/linux/arm/rt0.s
deleted file mode 100644
index 024547dddb..0000000000
--- a/src/runtime/linux/arm/rt0.s
+++ /dev/null
@@ -1,6 +0,0 @@
-// 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.
-
-TEXT _rt0_arm_linux(SB),7,$0
- B _rt0_arm(SB)
diff --git a/src/runtime/linux/arm/signal.c b/src/runtime/linux/arm/signal.c
deleted file mode 100644
index 024018d5a4..0000000000
--- a/src/runtime/linux/arm/signal.c
+++ /dev/null
@@ -1,4 +0,0 @@
-// 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.
-
diff --git a/src/runtime/linux/arm/sys.s b/src/runtime/linux/arm/sys.s
deleted file mode 100644
index f5db32305b..0000000000
--- a/src/runtime/linux/arm/sys.s
+++ /dev/null
@@ -1,15 +0,0 @@
-// 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 arm, Linux
-//
-
-TEXT write(SB),7,$0
- MOVW 4(SP), R0
- MOVW 8(SP), R1
- MOVW 12(SP), R2
- SWI $0x00900004 // syscall write
- RET
-
diff --git a/src/runtime/linux/defs.c b/src/runtime/linux/defs.c
deleted file mode 100644
index 35fa029532..0000000000
--- a/src/runtime/linux/defs.c
+++ /dev/null
@@ -1,40 +0,0 @@
-// 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.
-
-/*
- * Input to godefs
- godefs -f -m64 defs.c >amd64/defs.h
- godefs -f -m64 defs1.c >>amd64/defs.h
- */
-
-// Linux glibc and Linux kernel define different and conflicting
-// definitions for struct sigaction, struct timespec, etc.
-// We want the kernel ones, which are in the asm/* headers.
-// But then we'd get conflicts when we include the system
-// headers for things like ucontext_t, so that happens in
-// a separate file, defs1.c.
-
-#include <asm/signal.h>
-#include <asm/siginfo.h>
-#include <asm/mman.h>
-
-enum {
- $PROT_NONE = PROT_NONE,
- $PROT_READ = PROT_READ,
- $PROT_WRITE = PROT_WRITE,
- $PROT_EXEC = PROT_EXEC,
-
- $MAP_ANON = MAP_ANONYMOUS,
- $MAP_PRIVATE = MAP_PRIVATE,
-
- $SA_RESTART = SA_RESTART,
- $SA_ONSTACK = SA_ONSTACK,
- $SA_RESTORER = SA_RESTORER,
- $SA_SIGINFO = SA_SIGINFO,
-};
-
-typedef struct timespec $Timespec;
-typedef struct timeval $Timeval;
-typedef struct sigaction $Sigaction;
-typedef siginfo_t $Siginfo;
diff --git a/src/runtime/linux/defs1.c b/src/runtime/linux/defs1.c
deleted file mode 100644
index 0fe3506ad6..0000000000
--- a/src/runtime/linux/defs1.c
+++ /dev/null
@@ -1,25 +0,0 @@
-// 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.
-
-/*
- * Input to godefs
- godefs -f -m64 defs.c >amd64/defs.h
- godefs -f -m64 defs1.c >>amd64/defs.h
- */
-
-#include <ucontext.h>
-
-typedef __sigset_t $Usigset;
-typedef struct _libc_fpxreg $Fpxreg;
-typedef struct _libc_xmmreg $Xmmreg;
-typedef struct _libc_fpstate $Fpstate;
-typedef struct _libc_fpreg $Fpreg;
-typedef struct _fpxreg $Fpxreg1;
-typedef struct _xmmreg $Xmmreg1;
-typedef struct _fpstate $Fpstate1;
-typedef struct _fpreg $Fpreg1;
-typedef struct sigaltstack $Sigaltstack;
-typedef mcontext_t $Mcontext;
-typedef ucontext_t $Ucontext;
-typedef struct sigcontext $Sigcontext;
diff --git a/src/runtime/linux/defs2.c b/src/runtime/linux/defs2.c
deleted file mode 100644
index aa0331a375..0000000000
--- a/src/runtime/linux/defs2.c
+++ /dev/null
@@ -1,51 +0,0 @@
-// 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.
-
-/*
- * Input to godefs
- godefs -f -m32 -f -I/home/rsc/pub/linux-2.6/arch/x86/include -f -I/home/rsc/pub/linux-2.6/include defs2.c >386/defs.h
-
- * The asm header tricks we have to use for Linux on amd64
- * (see defs.c and defs1.c) don't work here, so this is yet another
- * file. Sigh.
- */
-
-#include <asm/signal.h>
-#include <asm/mman.h>
-#include <asm/sigframe.h>
-#include <asm/ucontext.h>
-
-/*
-#include <sys/signal.h>
-#include <sys/mman.h>
-#include <ucontext.h>
-*/
-
-enum {
- $PROT_NONE = PROT_NONE,
- $PROT_READ = PROT_READ,
- $PROT_WRITE = PROT_WRITE,
- $PROT_EXEC = PROT_EXEC,
-
- $MAP_ANON = MAP_ANONYMOUS,
- $MAP_PRIVATE = MAP_PRIVATE,
-
- $SA_RESTART = SA_RESTART,
- $SA_ONSTACK = SA_ONSTACK,
- $SA_RESTORER = SA_RESTORER,
- $SA_SIGINFO = SA_SIGINFO,
-};
-
-typedef struct _fpreg $Fpreg;
-typedef struct _fpxreg $Fpxreg;
-typedef struct _xmmreg $Xmmreg;
-typedef struct _fpstate $Fpstate;
-typedef struct timespec $Timespec;
-typedef struct timeval $Timeval;
-typedef struct sigaction $Sigaction;
-typedef siginfo_t $Siginfo;
-typedef struct sigaltstack $Sigaltstack;
-typedef struct sigcontext $Sigcontext;
-typedef struct ucontext $Ucontext;
-
diff --git a/src/runtime/linux/defs_arm.c b/src/runtime/linux/defs_arm.c
deleted file mode 100644
index eaec051549..0000000000
--- a/src/runtime/linux/defs_arm.c
+++ /dev/null
@@ -1,54 +0,0 @@
-// 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.
-
-/*
- * Input to godefs
- godefs -carm-gcc -f -I/usr/local/google/src/linux-2.6.28/arch/arm/include -f
- -I/usr/local/google/src/linux-2.6.28/include defs_arm.c >arm/defs.h
-
- * Another input file for ARM defs.h
- */
-
-#include <asm/signal.h>
-#include <asm/mman.h>
-#include <asm/sigcontext.h>
-#include <asm/ucontext.h>
-
-/*
-#include <sys/signal.h>
-#include <sys/mman.h>
-#include <ucontext.h>
-*/
-
-#include <time.h>
-
-enum {
- $PROT_NONE = PROT_NONE,
- $PROT_READ = PROT_READ,
- $PROT_WRITE = PROT_WRITE,
- $PROT_EXEC = PROT_EXEC,
-
- $MAP_ANON = MAP_ANONYMOUS,
- $MAP_PRIVATE = MAP_PRIVATE,
-
- $SA_RESTART = SA_RESTART,
- $SA_ONSTACK = SA_ONSTACK,
- $SA_RESTORER = SA_RESTORER,
- $SA_SIGINFO = SA_SIGINFO
-};
-
-
-
-
-//typedef struct _fpreg $Fpreg;
-//typedef struct _fpxreg $Fpxreg;
-//typedef struct _xmmreg $Xmmreg;
-//typedef struct _fpstate $Fpstate;
-typedef struct timespec $Timespec;
-//typedef struct timeval $Timeval;
-// typedef struct sigaction $Sigaction;
-// typedef siginfo_t $Siginfo;
-// typedef struct sigaltstack $Sigaltstack;
-// typedef struct sigcontext $Sigcontext;
-// typedef struct ucontext $Ucontext;
diff --git a/src/runtime/linux/os.h b/src/runtime/linux/os.h
deleted file mode 100644
index c616193676..0000000000
--- a/src/runtime/linux/os.h
+++ /dev/null
@@ -1,10 +0,0 @@
-// 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.
-
-// Linux-specific system calls
-int64 futex(uint32*, int32, uint32, Timespec*, uint32*, uint32);
-int64 clone(int32, void*, M*, G*, void(*)(void));
-
-struct Sigaction;
-void rt_sigaction(int64, struct Sigaction*, void*, uint64);
diff --git a/src/runtime/linux/signals.h b/src/runtime/linux/signals.h
deleted file mode 100644
index 1fb49c5135..0000000000
--- a/src/runtime/linux/signals.h
+++ /dev/null
@@ -1,48 +0,0 @@
-// 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.
-
-
-#define C SigCatch
-#define I SigIgnore
-#define R SigRestart
-
-static SigTab sigtab[] = {
- /* 0 */ 0, "SIGNONE: no trap",
- /* 1 */ 0, "SIGHUP: terminal line hangup",
- /* 2 */ 0, "SIGINT: interrupt",
- /* 3 */ C, "SIGQUIT: quit",
- /* 4 */ C, "SIGILL: illegal instruction",
- /* 5 */ C, "SIGTRAP: trace trap",
- /* 6 */ C, "SIGABRT: abort",
- /* 7 */ C, "SIGBUS: bus error",
- /* 8 */ C, "SIGFPE: floating-point exception",
- /* 9 */ 0, "SIGKILL: kill",
- /* 10 */ 0, "SIGUSR1: user-defined signal 1",
- /* 11 */ C, "SIGSEGV: segmentation violation",
- /* 12 */ 0, "SIGUSR2: user-defined signal 2",
- /* 13 */ I, "SIGPIPE: write to broken pipe",
- /* 14 */ 0, "SIGALRM: alarm clock",
- /* 15 */ 0, "SIGTERM: termination",
- /* 16 */ 0, "SIGSTKFLT: stack fault",
- /* 17 */ I+R, "SIGCHLD: child status has changed",
- /* 18 */ 0, "SIGCONT: continue",
- /* 19 */ 0, "SIGSTOP: stop, unblockable",
- /* 20 */ 0, "SIGTSTP: keyboard stop",
- /* 21 */ 0, "SIGTTIN: background read from tty",
- /* 22 */ 0, "SIGTTOU: background write to tty",
- /* 23 */ 0, "SIGURG: urgent condition on socket",
- /* 24 */ 0, "SIGXCPU: cpu limit exceeded",
- /* 25 */ 0, "SIGXFSZ: file size limit exceeded",
- /* 26 */ 0, "SIGVTALRM: virtual alarm clock",
- /* 27 */ 0, "SIGPROF: profiling alarm clock",
- /* 28 */ I+R, "SIGWINCH: window size change",
- /* 29 */ 0, "SIGIO: i/o now possible",
- /* 30 */ 0, "SIGPWR: power failure restart",
- /* 31 */ C, "SIGSYS: bad system call",
-};
-#undef C
-#undef I
-#undef R
-
-#define NSIG 32
diff --git a/src/runtime/linux/thread.c b/src/runtime/linux/thread.c
deleted file mode 100644
index cc9ba161bf..0000000000
--- a/src/runtime/linux/thread.c
+++ /dev/null
@@ -1,282 +0,0 @@
-// 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.
-
-#include "runtime.h"
-#include "defs.h"
-#include "signals.h"
-#include "os.h"
-
-// Linux futex.
-//
-// futexsleep(uint32 *addr, uint32 val)
-// futexwakeup(uint32 *addr)
-//
-// Futexsleep atomically checks if *addr == val and if so, sleeps on addr.
-// Futexwakeup wakes up one thread sleeping on addr.
-// Futexsleep is allowed to wake up spuriously.
-
-enum
-{
- FUTEX_WAIT = 0,
- FUTEX_WAKE = 1,
-
- EINTR = 4,
- EAGAIN = 11,
-};
-
-// TODO(rsc): I tried using 1<<40 here but futex woke up (-ETIMEDOUT).
-// I wonder if the timespec that gets to the kernel
-// actually has two 32-bit numbers in it, so that
-// a 64-bit 1<<40 ends up being 0 seconds,
-// 1<<8 nanoseconds.
-static Timespec longtime =
-{
- 1<<30, // 34 years
- 0
-};
-
-// Atomically,
-// if(*addr == val) sleep
-// Might be woken up spuriously; that's allowed.
-static void
-futexsleep(uint32 *addr, uint32 val)
-{
- int64 ret;
-
- ret = futex(addr, FUTEX_WAIT, val, &longtime, nil, 0);
- if(ret >= 0 || ret == -EAGAIN || ret == -EINTR)
- return;
-
- prints("futexsleep addr=");
- sys·printpointer(addr);
- prints(" val=");
- sys·printint(val);
- prints(" returned ");
- sys·printint(ret);
- prints("\n");
- *(int32*)0x1005 = 0x1005;
-}
-
-// If any procs are sleeping on addr, wake up at least one.
-static void
-futexwakeup(uint32 *addr)
-{
- int64 ret;
-
- ret = futex(addr, FUTEX_WAKE, 1, nil, nil, 0);
-
- if(ret >= 0)
- return;
-
- // I don't know that futex wakeup can return
- // EAGAIN or EINTR, but if it does, it would be
- // safe to loop and call futex again.
-
- prints("futexwakeup addr=");
- sys·printpointer(addr);
- prints(" returned ");
- sys·printint(ret);
- prints("\n");
- *(int32*)0x1006 = 0x1006;
-}
-
-
-// Lock and unlock.
-//
-// The lock state is a single 32-bit word that holds
-// a 31-bit count of threads waiting for the lock
-// and a single bit (the low bit) saying whether the lock is held.
-// The uncontended case runs entirely in user space.
-// When contention is detected, we defer to the kernel (futex).
-//
-// A reminder: compare-and-swap cas(addr, old, new) does
-// if(*addr == old) { *addr = new; return 1; }
-// else return 0;
-// but atomically.
-
-static void
-futexlock(Lock *l)
-{
- uint32 v;
-
-again:
- v = l->key;
- if((v&1) == 0){
- if(cas(&l->key, v, v|1)){
- // Lock wasn't held; we grabbed it.
- return;
- }
- goto again;
- }
-
- // Lock was held; try to add ourselves to the waiter count.
- if(!cas(&l->key, v, v+2))
- goto again;
-
- // We're accounted for, now sleep in the kernel.
- //
- // We avoid the obvious lock/unlock race because
- // the kernel won't put us to sleep if l->key has
- // changed underfoot and is no longer v+2.
- //
- // We only really care that (v&1) == 1 (the lock is held),
- // and in fact there is a futex variant that could
- // accomodate that check, but let's not get carried away.)
- futexsleep(&l->key, v+2);
-
- // We're awake: remove ourselves from the count.
- for(;;){
- v = l->key;
- if(v < 2)
- throw("bad lock key");
- if(cas(&l->key, v, v-2))
- break;
- }
-
- // Try for the lock again.
- goto again;
-}
-
-static void
-futexunlock(Lock *l)
-{
- uint32 v;
-
- // Atomically get value and clear lock bit.
-again:
- v = l->key;
- if((v&1) == 0)
- throw("unlock of unlocked lock");
- if(!cas(&l->key, v, v&~1))
- goto again;
-
- // If there were waiters, wake one.
- if(v & ~1)
- futexwakeup(&l->key);
-}
-
-void
-lock(Lock *l)
-{
- if(m->locks < 0)
- throw("lock count");
- m->locks++;
- futexlock(l);
-}
-
-void
-unlock(Lock *l)
-{
- m->locks--;
- if(m->locks < 0)
- throw("lock count");
- futexunlock(l);
-}
-
-
-// One-time notifications.
-//
-// Since the lock/unlock implementation already
-// takes care of sleeping in the kernel, we just reuse it.
-// (But it's a weird use, so it gets its own interface.)
-//
-// We use a lock to represent the event:
-// unlocked == event has happened.
-// Thus the lock starts out locked, and to wait for the
-// event you try to lock the lock. To signal the event,
-// you unlock the lock.
-
-void
-noteclear(Note *n)
-{
- n->lock.key = 0; // memset(n, 0, sizeof *n)
- futexlock(&n->lock);
-}
-
-void
-notewakeup(Note *n)
-{
- futexunlock(&n->lock);
-}
-
-void
-notesleep(Note *n)
-{
- futexlock(&n->lock);
- futexunlock(&n->lock); // Let other sleepers find out too.
-}
-
-
-// Clone, the Linux rfork.
-enum
-{
- CLONE_VM = 0x100,
- CLONE_FS = 0x200,
- CLONE_FILES = 0x400,
- CLONE_SIGHAND = 0x800,
- CLONE_PTRACE = 0x2000,
- CLONE_VFORK = 0x4000,
- CLONE_PARENT = 0x8000,
- CLONE_THREAD = 0x10000,
- CLONE_NEWNS = 0x20000,
- CLONE_SYSVSEM = 0x40000,
- CLONE_SETTLS = 0x80000,
- CLONE_PARENT_SETTID = 0x100000,
- CLONE_CHILD_CLEARTID = 0x200000,
- CLONE_UNTRACED = 0x800000,
- CLONE_CHILD_SETTID = 0x1000000,
- CLONE_STOPPED = 0x2000000,
- CLONE_NEWUTS = 0x4000000,
- CLONE_NEWIPC = 0x8000000,
-};
-
-void
-newosproc(M *m, G *g, void *stk, void (*fn)(void))
-{
- int64 ret;
- int32 flags;
-
- /*
- * note: strace gets confused if we use CLONE_PTRACE here.
- */
- flags = CLONE_PARENT /* getppid doesn't change in child */
- | CLONE_VM /* share memory */
- | CLONE_FS /* share cwd, etc */
- | CLONE_FILES /* share fd table */
- | CLONE_SIGHAND /* share sig handler table */
- | CLONE_THREAD /* revisit - okay for now */
- ;
-
- if(0){
- prints("newosproc stk=");
- sys·printpointer(stk);
- prints(" m=");
- sys·printpointer(m);
- prints(" g=");
- sys·printpointer(g);
- prints(" fn=");
- sys·printpointer(fn);
- prints(" clone=");
- sys·printpointer(clone);
- prints("\n");
- }
-
- ret = clone(flags, stk, m, g, fn);
- if(ret < 0)
- *(int32*)123 = 123;
-}
-
-void
-osinit(void)
-{
-}
-
-// Called to initialize a new m (including the bootstrap m).
-void
-minit(void)
-{
- // Initialize signal handling.
- m->gsignal = malg(32*1024); // OS X wants >=8K, Linux >=2K
- signalstack(m->gsignal->stackguard, 32*1024);
-}