From 0d3a043de9b544ee3fca10fd1070a58f973161c4 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Mon, 30 Mar 2009 00:01:07 -0700 Subject: more 386 runtime - can run tiny c programs. R=r DELTA=1926 (1727 added, 168 deleted, 31 changed) OCL=26876 CL=26878 --- src/runtime/linux/386/signal.c | 102 +++++++++++++++++++++++++++++++++++ src/runtime/linux/amd64/signal.c | 112 +++++++++++++++++++++++++++++++++++++++ src/runtime/linux/amd64/sys.s | 8 --- src/runtime/linux/defs.c | 2 - src/runtime/linux/defs1.c | 4 +- src/runtime/linux/defs2.c | 51 ++++++++++++++++++ src/runtime/linux/signal.c | 111 -------------------------------------- 7 files changed, 267 insertions(+), 123 deletions(-) create mode 100644 src/runtime/linux/386/signal.c create mode 100644 src/runtime/linux/amd64/signal.c create mode 100644 src/runtime/linux/defs2.c delete mode 100644 src/runtime/linux/signal.c (limited to 'src/runtime/linux') 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; irax); + 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 + sys_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); + } + + 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; iamd64/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 @@ -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 +#include +#include +#include + +/* +#include +#include +#include +*/ + +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/signal.c b/src/runtime/linux/signal.c deleted file mode 100644 index 87bea263af..0000000000 --- a/src/runtime/linux/signal.c +++ /dev/null @@ -1,111 +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 - sys_Exit(2); - - 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); - } - - 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