From dfa5893d4f5a5724e36e1265eba4e148ca42911f Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Wed, 3 Dec 2008 14:21:28 -0800 Subject: preparation for exec. * syscall: add syscall.RawSyscall, which doesn't use sys.entersyscall/sys.exitsyscall add syscall.dup2 add syscall.BytePtrPtr add syscall.Rusage, RusagePtr add syscall.F_GETFD, F_SETFD, FD_CLOEXEC * runtime: clean up, correct signal handling. can now survive (continue running after) a signal. R=r DELTA=394 (286 added, 51 deleted, 57 changed) OCL=20351 CL=20369 --- src/runtime/rt1_amd64_darwin.c | 75 +++++++++++++++++++++++++----------------- src/runtime/rt1_amd64_linux.c | 65 +++++++++++++++++++++--------------- src/runtime/runtime.h | 11 +++++-- src/runtime/signals.h | 40 ---------------------- src/runtime/signals_darwin.h | 48 +++++++++++++++++++++++++++ src/runtime/signals_linux.h | 48 +++++++++++++++++++++++++++ src/runtime/sys_amd64_darwin.s | 14 +++++--- src/runtime/sys_amd64_linux.s | 10 +++++- 8 files changed, 207 insertions(+), 104 deletions(-) delete mode 100644 src/runtime/signals.h create mode 100644 src/runtime/signals_darwin.h create mode 100644 src/runtime/signals_linux.h (limited to 'src/runtime') diff --git a/src/runtime/rt1_amd64_darwin.c b/src/runtime/rt1_amd64_darwin.c index 82999b89f9..7bd7c78fdc 100644 --- a/src/runtime/rt1_amd64_darwin.c +++ b/src/runtime/rt1_amd64_darwin.c @@ -4,7 +4,7 @@ #include "runtime.h" #include "amd64_darwin.h" -#include "signals.h" +#include "signals_darwin.h" typedef uint64 __uint64_t; @@ -100,15 +100,14 @@ static _STRUCT_X86_FLOAT_STATE64 *get___fs(_STRUCT_MCONTEXT64 *ptr) { /* * This assembler routine takes the args from registers, puts them on the stack, - * and calls sighandler(). + * and calls the registered handler. */ -extern void sigtramp(); - +extern void sigtramp(void); /* * Rudimentary reverse-engineered definition of signal interface. * You'd think it would be documented. */ -typedef struct siginfo { +struct siginfo { int32 si_signo; /* signal number */ int32 si_errno; /* errno association */ int32 si_code; /* signal code */ @@ -117,21 +116,17 @@ typedef struct siginfo { int32 si_status; /* exit value */ void *si_addr; /* faulting address */ /* more stuff here */ -} siginfo; - +}; -typedef struct sigaction { - union { - void (*sa_handler)(int32); - void (*sa_sigaction)(int32, siginfo *, void *); - } u; /* signal handler */ - void (*sa_trampoline)(void); /* kernel callback point; calls sighandler() */ - uint8 sa_mask[4]; /* signal mask to apply */ - int32 sa_flags; /* see signal options below */ -} sigaction; +struct sigaction { + void (*sa_handler)(int32, struct siginfo*, void*); // actual handler + void (*sa_trampoline)(void); // assembly trampoline + uint32 sa_mask; // signal mask during handler + int32 sa_flags; // flags below +}; void -sighandler(int32 sig, siginfo *info, void *context) +sighandler(int32 sig, struct siginfo *info, void *context) { if(panicking) // traceback already printed sys·exit(2); @@ -159,15 +154,17 @@ sighandler(int32 sig, siginfo *info, void *context) sys·exit(2); } +void +sigignore(int32, struct siginfo*, void*) +{ +} + struct stack_t { byte *sp; int64 size; int32 flags; }; -sigaction a; -extern void sigtramp(void); - void signalstack(byte *p, int32 n) { @@ -179,21 +176,39 @@ signalstack(byte *p, int32 n) sigaltstack(&st, nil); } +void sigaction(int64, void*, void*); + +enum { + SA_SIGINFO = 0x40, + SA_RESTART = 0x02, + SA_ONSTACK = 0x01, + SA_USERTRAMP = 0x100, + SA_64REGSET = 0x200, +}; + void initsig(void) { int32 i; - - a.u.sa_sigaction = (void*)sigtramp; - a.sa_flags |= 0x41; /* SA_SIGINFO, SA_ONSTACK */ - for(i=0; igsignal MOVL DX,0(SP) MOVQ CX,8(SP) MOVQ R8,16(SP) - CALL sighandler(SB) - RET + MOVQ R8, 24(SP) // save ucontext + MOVQ SI, 32(SP) // save infostyle + CALL DI + MOVL $(0x2000000+184), AX // sigreturn(ucontext, infostyle) + MOVQ 24(SP), DI // saved ucontext + MOVQ 32(SP), SI // saved infostyle + SYSCALL + INT $3 // not reached TEXT sys·mmap(SB),7,$-8 MOVQ 8(SP), DI // arg 1 addr diff --git a/src/runtime/sys_amd64_linux.s b/src/runtime/sys_amd64_linux.s index 581bf15ab5..d385bb43ec 100644 --- a/src/runtime/sys_amd64_linux.s +++ b/src/runtime/sys_amd64_linux.s @@ -63,7 +63,7 @@ TEXT sys·write(SB),7,$0-24 SYSCALL RET -TEXT sys·rt_sigaction(SB),7,$0-32 +TEXT rt_sigaction(SB),7,$0-32 MOVL 8(SP), DI MOVQ 16(SP), SI MOVQ 24(SP), DX @@ -80,6 +80,14 @@ TEXT sigtramp(SB),7,$24-16 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 -- cgit v1.3