]> Cypherpunks repositories - gostls13.git/commitdiff
Get the right sigaction struct for the 386 rt_sigaction system
authorIan Lance Taylor <iant@golang.org>
Tue, 27 Oct 2009 05:49:08 +0000 (22:49 -0700)
committerIan Lance Taylor <iant@golang.org>
Tue, 27 Oct 2009 05:49:08 +0000 (22:49 -0700)
call.  This uses the header files from a 32-bit Ubuntu Hardy
system.

The use of _LOOSE_KERNEL_NAMES seems right.  The
-D__ARCH_SI_UID_T works around a bug which appears to be fixed
in later Linux versions.

R=rsc
http://go/go-review/1013015

src/pkg/runtime/linux/386/defs.h
src/pkg/runtime/linux/386/signal.c
src/pkg/runtime/linux/defs2.c

index 112fc7b0946c96cceadf0dd7fe1c294f651e6ddc..94bc2b5b6f82b1207113bc13c2af34edf8849203 100755 (executable)
@@ -1,4 +1,4 @@
-// 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
+// godefs -f -m32 -f -D_LOOSE_KERNEL_NAMES -f -D__ARCH_SI_UID_T=__kernel_uid32_t defs2.c
 
 // MACHINE GENERATED - DO NOT EDIT.
 
@@ -54,8 +54,7 @@ struct Fpstate {
        uint32 reserved;
        Fpxreg _fxsr_st[8];
        Xmmreg _xmm[8];
-       uint32 padding1[44];
-       byte _anon_[48];
+       uint32 padding[56];
 };
 
 typedef struct Timespec Timespec;
@@ -72,10 +71,10 @@ struct Timeval {
 
 typedef struct Sigaction Sigaction;
 struct Sigaction {
-       byte _u[4];
-       uint32 sa_mask;
+       void *k_sa_handler;
        uint32 sa_flags;
        void *sa_restorer;
+       uint32 sa_mask;
 };
 
 typedef struct Siginfo Siginfo;
index 5deb0f9855ddde6d585ccd2242b890402e9ce4bb..54e109f5886eff6618941bcf3618c879746c6a77 100644 (file)
@@ -88,9 +88,9 @@ initsig(void)
        for(i = 0; i<NSIG; i++) {
                if(sigtab[i].flags) {
                        if(sigtab[i].flags & SigCatch)
-                               *(void**)sa._u = (void*)sigtramp;       // handler
+                               sa.k_sa_handler = (void*)sigtramp;
                        else
-                               *(void**)sa._u = (void*)sigignore;      // handler
+                               sa.k_sa_handler = (void*)sigignore;
                        if(sigtab[i].flags & SigRestart)
                                sa.sa_flags |= SA_RESTART;
                        else
index aa0331a3756c03a06f42a348dd24af79c46ec8c3..a91086aa5026bb0472643683996598c0bd2bead0 100644 (file)
@@ -13,8 +13,9 @@
 
 #include <asm/signal.h>
 #include <asm/mman.h>
-#include <asm/sigframe.h>
+#include <asm/sigcontext.h>
 #include <asm/ucontext.h>
+#include <asm/siginfo.h>
 
 /*
 #include <sys/signal.h>
 #include <ucontext.h>
 */
 
+/* This is the sigaction structure from the Linux 2.1.68 kernel which
+   is used with the rt_sigaction system call.  For 386 this is not
+   defined in any public header file.  */
+
+struct kernel_sigaction {
+       __sighandler_t k_sa_handler;
+       unsigned long sa_flags;
+       void (*sa_restorer) (void);
+       sigset_t sa_mask;
+};
+
 enum {
        $PROT_NONE = PROT_NONE,
        $PROT_READ = PROT_READ,
@@ -43,7 +55,7 @@ typedef struct _xmmreg $Xmmreg;
 typedef struct _fpstate $Fpstate;
 typedef struct timespec $Timespec;
 typedef struct timeval $Timeval;
-typedef struct sigaction $Sigaction;
+typedef struct kernel_sigaction $Sigaction;
 typedef siginfo_t $Siginfo;
 typedef struct sigaltstack $Sigaltstack;
 typedef struct sigcontext $Sigcontext;