diff options
Diffstat (limited to 'src/runtime/rt1_amd64_linux.c')
-rw-r--r-- | src/runtime/rt1_amd64_linux.c | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/src/runtime/rt1_amd64_linux.c b/src/runtime/rt1_amd64_linux.c index 54b6496d1..c62db5ce9 100644 --- a/src/runtime/rt1_amd64_linux.c +++ b/src/runtime/rt1_amd64_linux.c @@ -161,6 +161,25 @@ sighandler(int32 sig, siginfo* info, void** context) sys·exit(2); } +struct stack_t { + void *sp; + int32 flags; + int32 pad; + int64 size; +}; + +void +signalstack(byte *p, int32 n) +{ + struct stack_t st; + + st.sp = p; + st.size = n; + st.pad = 0; + st.flags = 0; + sigaltstack(&st, nil); +} + static sigaction a; void @@ -168,7 +187,7 @@ initsig(void) { int32 i; a.u.sa_sigaction = (void*)sigtramp; - a.sa_flags = 0x04; /* SA_SIGINFO */ + a.sa_flags = 0x08000004; /* SA_ONSTACK, SA_SIGINFO */ for(i=0; i<sizeof(a.sa_mask); i++) a.sa_mask[i] = 0xFF; @@ -178,6 +197,7 @@ initsig(void) } } + // Linux futex. // // futexsleep(uint32 *addr, uint32 val) @@ -432,3 +452,12 @@ 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); +} |