diff options
| author | Russ Cox <rsc@golang.org> | 2009-03-30 00:01:07 -0700 |
|---|---|---|
| committer | Russ Cox <rsc@golang.org> | 2009-03-30 00:01:07 -0700 |
| commit | 0d3a043de9b544ee3fca10fd1070a58f973161c4 (patch) | |
| tree | bf180d18aa981bdbf3219e42024b2a50cdf40ea2 /src/runtime/linux | |
| parent | de9cf52835c134a8e5a0df9a0880caa79b9b9b88 (diff) | |
| download | go-0d3a043de9b544ee3fca10fd1070a58f973161c4.tar.xz | |
more 386 runtime - can run tiny c programs.
R=r
DELTA=1926 (1727 added, 168 deleted, 31 changed)
OCL=26876
CL=26878
Diffstat (limited to 'src/runtime/linux')
| -rw-r--r-- | src/runtime/linux/386/signal.c | 102 | ||||
| -rw-r--r-- | src/runtime/linux/amd64/signal.c (renamed from src/runtime/linux/signal.c) | 3 | ||||
| -rw-r--r-- | src/runtime/linux/amd64/sys.s | 8 | ||||
| -rw-r--r-- | src/runtime/linux/defs.c | 2 | ||||
| -rw-r--r-- | src/runtime/linux/defs1.c | 4 | ||||
| -rw-r--r-- | src/runtime/linux/defs2.c | 51 |
6 files changed, 157 insertions, 13 deletions
diff --git a/src/runtime/linux/386/signal.c b/src/runtime/linux/386/signal.c new file mode 100644 index 0000000000..9cbd9fa855 --- /dev/null +++ b/src/runtime/linux/386/signal.c @@ -0,0 +1,102 @@ +// 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 + sys_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); + } + + sys·Breakpoint(); + sys_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/signal.c b/src/runtime/linux/amd64/signal.c index 87bea263af..5f3574f8e2 100644 --- a/src/runtime/linux/signal.c +++ b/src/runtime/linux/amd64/signal.c @@ -1,4 +1,4 @@ -// Copyright 2009 The Go Authors. All rights reserved. +// 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. @@ -50,6 +50,7 @@ sighandler(int32 sig, Siginfo* info, void* context) if(panicking) // traceback already printed sys_Exit(2); + panicking = 1; uc = context; mc = &uc->uc_mcontext; diff --git a/src/runtime/linux/amd64/sys.s b/src/runtime/linux/amd64/sys.s index 49349bb48b..5c4d98f973 100644 --- a/src/runtime/linux/amd64/sys.s +++ b/src/runtime/linux/amd64/sys.s @@ -97,14 +97,6 @@ TEXT sys·mmap(SB),7,$0-32 MOVL 28(SP), R8 MOVL 32(SP), R9 -/* flags arg for ANON is 1000 but sb 20 */ - MOVL CX, AX - ANDL $~0x1000, CX - ANDL $0x1000, AX - SHRL $7, AX - ORL AX, CX - - MOVL CX, R10 MOVL $9, AX // syscall entry SYSCALL CMPQ AX, $0xfffffffffffff001 diff --git a/src/runtime/linux/defs.c b/src/runtime/linux/defs.c index 9e635b429a..35fa029532 100644 --- a/src/runtime/linux/defs.c +++ b/src/runtime/linux/defs.c @@ -6,8 +6,6 @@ * Input to godefs godefs -f -m64 defs.c >amd64/defs.h godefs -f -m64 defs1.c >>amd64/defs.h - godefs defs.c >386/defs.h - godefs defs1.c >>386/defs.h */ // Linux glibc and Linux kernel define different and conflicting diff --git a/src/runtime/linux/defs1.c b/src/runtime/linux/defs1.c index 72de5c1fd6..0fe3506ad6 100644 --- a/src/runtime/linux/defs1.c +++ b/src/runtime/linux/defs1.c @@ -6,8 +6,6 @@ * Input to godefs godefs -f -m64 defs.c >amd64/defs.h godefs -f -m64 defs1.c >>amd64/defs.h - godefs defs.c >386/defs.h - godefs defs1.c >>386/defs.h */ #include <ucontext.h> @@ -16,9 +14,11 @@ 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; diff --git a/src/runtime/linux/defs2.c b/src/runtime/linux/defs2.c new file mode 100644 index 0000000000..aa0331a375 --- /dev/null +++ b/src/runtime/linux/defs2.c @@ -0,0 +1,51 @@ +// 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; + |
