]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: get rid of SA_RESTORER on ARM.
authorShenghou Ma <minux@golang.org>
Wed, 6 Aug 2014 04:24:55 +0000 (00:24 -0400)
committerShenghou Ma <minux@golang.org>
Wed, 6 Aug 2014 04:24:55 +0000 (00:24 -0400)
The manpages says SA_RESTORER is obsolete, and indeed, not every architecture
support it. However, sadly it's required on x86_64, see http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/arch/x86/kernel/signal.c?id=26bcd8b72563b4c54892c4c2a409f6656fb8ae8b#n430, so only use it on x86.

LGTM=rsc
R=rsc, iant
CC=golang-codereviews
https://golang.org/cl/115450043

src/pkg/runtime/defs_linux_arm.h
src/pkg/runtime/os_linux.c
src/pkg/runtime/sys_linux_arm.s

index 92160966e119348bc653c9eb95b68db05d83d64e..05a17af64b812604156dd3363ed24f2f1d5ee8e0 100644 (file)
@@ -16,7 +16,7 @@ enum {
        MADV_DONTNEED = 0x4,
        SA_RESTART = 0x10000000,
        SA_ONSTACK = 0x8000000,
-       SA_RESTORER = 0x4000000,
+       SA_RESTORER = 0, // unused on ARM
        SA_SIGINFO = 0x4,
        SIGHUP = 0x1,
        SIGINT = 0x2,
index 31cbdb0ad53f05a0637a42e1bdd8d86105eb8130..77754f481ca66be570d79762d697caf4b5421e64 100644 (file)
@@ -288,7 +288,7 @@ runtime·memlimit(void)
  * and calls sighandler().
  */
 extern void runtime·sigtramp(void);
-extern void runtime·sigreturn(void);  // calls runtime·sigreturn
+extern void runtime·sigreturn(void);  // calls rt_sigreturn, only used with SA_RESTORER
 
 void
 runtime·setsig(int32 i, GoSighandler *fn, bool restart)
@@ -300,9 +300,15 @@ runtime·setsig(int32 i, GoSighandler *fn, bool restart)
        if(restart)
                sa.sa_flags |= SA_RESTART;
        sa.sa_mask = ~0ULL;
-       // TODO(adonovan): Linux manpage says "sa_restorer element is
-       // obsolete and should not be used".  Avoid it here, and test.
+       // Although Linux manpage says "sa_restorer element is obsolete and
+       // should not be used". x86_64 kernel requires it. Only use it on
+       // x86.
+#ifdef GOARCH_386
+       sa.sa_restorer = (void*)runtime·sigreturn;
+#endif
+#ifdef GOARCH_amd64
        sa.sa_restorer = (void*)runtime·sigreturn;
+#endif
        if(fn == runtime·sighandler)
                fn = (void*)runtime·sigtramp;
        sa.sa_handler = fn;
index 8bfc72b5710900402a33264ee3f2d3df9edcaf43..770b963d2423303aa35311142600fa287124d000 100644 (file)
@@ -340,11 +340,6 @@ TEXT runtime·rt_sigaction(SB),NOSPLIT,$0
        SWI     $0
        RET
 
-TEXT runtime·sigreturn(SB),NOSPLIT,$0
-       MOVW    $SYS_rt_sigreturn, R7
-       SWI     $0
-       RET
-
 TEXT runtime·usleep(SB),NOSPLIT,$12
        MOVW    usec+0(FP), R0
        MOVW    R0, R1