diff options
Diffstat (limited to 'src/runtime/linux')
| -rwxr-xr-x | src/runtime/linux/386/defs.h | 136 | ||||
| -rwxr-xr-x | src/runtime/linux/386/rt0.s | 8 | ||||
| -rw-r--r-- | src/runtime/linux/386/signal.c | 102 | ||||
| -rwxr-xr-x | src/runtime/linux/386/sys.s | 222 | ||||
| -rw-r--r-- | src/runtime/linux/amd64/defs.h | 175 | ||||
| -rw-r--r-- | src/runtime/linux/amd64/rt0.s | 9 | ||||
| -rw-r--r-- | src/runtime/linux/amd64/signal.c | 112 | ||||
| -rw-r--r-- | src/runtime/linux/amd64/sys.s | 193 | ||||
| -rw-r--r-- | src/runtime/linux/arm/defs.h | 27 | ||||
| -rw-r--r-- | src/runtime/linux/arm/rt0.s | 6 | ||||
| -rw-r--r-- | src/runtime/linux/arm/signal.c | 4 | ||||
| -rw-r--r-- | src/runtime/linux/arm/sys.s | 15 | ||||
| -rw-r--r-- | src/runtime/linux/defs.c | 40 | ||||
| -rw-r--r-- | src/runtime/linux/defs1.c | 25 | ||||
| -rw-r--r-- | src/runtime/linux/defs2.c | 51 | ||||
| -rw-r--r-- | src/runtime/linux/defs_arm.c | 54 | ||||
| -rw-r--r-- | src/runtime/linux/os.h | 10 | ||||
| -rw-r--r-- | src/runtime/linux/signals.h | 48 | ||||
| -rw-r--r-- | src/runtime/linux/thread.c | 282 |
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); -} |
