summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@golang.org>2009-10-26 22:49:08 -0700
committerIan Lance Taylor <iant@golang.org>2009-10-26 22:49:08 -0700
commit94ad282e94e38e9394b031edbc30605f9331d033 (patch)
treedbf2f4416a4686386b35a7e557b730d0f8db94de
parenta0857e4a2dc0f11b2a6a0f859f885ac7091e6c09 (diff)
downloadgolang-94ad282e94e38e9394b031edbc30605f9331d033.tar.gz
Get the right sigaction struct for the 386 rt_sigaction system
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
-rwxr-xr-xsrc/pkg/runtime/linux/386/defs.h9
-rw-r--r--src/pkg/runtime/linux/386/signal.c4
-rw-r--r--src/pkg/runtime/linux/defs2.c16
3 files changed, 20 insertions, 9 deletions
diff --git a/src/pkg/runtime/linux/386/defs.h b/src/pkg/runtime/linux/386/defs.h
index 112fc7b09..94bc2b5b6 100755
--- a/src/pkg/runtime/linux/386/defs.h
+++ b/src/pkg/runtime/linux/386/defs.h
@@ -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;
diff --git a/src/pkg/runtime/linux/386/signal.c b/src/pkg/runtime/linux/386/signal.c
index 5deb0f985..54e109f58 100644
--- a/src/pkg/runtime/linux/386/signal.c
+++ b/src/pkg/runtime/linux/386/signal.c
@@ -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
diff --git a/src/pkg/runtime/linux/defs2.c b/src/pkg/runtime/linux/defs2.c
index aa0331a37..a91086aa5 100644
--- a/src/pkg/runtime/linux/defs2.c
+++ b/src/pkg/runtime/linux/defs2.c
@@ -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>
@@ -22,6 +23,17 @@
#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;