lkml.org 
[lkml]   [2002]   [Oct]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
Subject[PATCH] bring sparc{64} into the generic siginfo fold
Hi Dave,

This patch (uncompiled, untested) enables sparc and sparc64 to use
the gerneic siginfo structure. Hope you like it :-)

diffstat:
asm-generic/siginfo.h | 28 +++++++++++++++----
asm-sparc/siginfo.h | 71 +------------------------------------------------
asm-sparc64/siginfo.h | 72 +-------------------------------------------------
3 files changed, 27 insertions(+), 144 deletions(-)

--
Cheers,
Stephen Rothwell sfr@canb.auug.org.au
http://www.canb.auug.org.au/~sfr/

diff -ruN 2.5.41-1.747/include/asm-generic/siginfo.h 2.5.41-1.747-si.1/include/asm-generic/siginfo.h
--- 2.5.41-1.747/include/asm-generic/siginfo.h 2002-10-10 14:31:49.000000000 +1000
+++ 2.5.41-1.747-si.1/include/asm-generic/siginfo.h 2002-10-10 15:27:26.000000000 +1000
@@ -8,9 +8,21 @@
void *sival_ptr;
} sigval_t;

+/*
+ * This is the size (including padding) of the part of the
+ * struct siginfo that is before the union.
+ */
+#ifndef __ARCH_SI_PREAMBLE_SIZE
+#define __ARCH_SI_PREAMBLE_SIZE (3 * sizeof(int))
+#endif
+
#define SI_MAX_SIZE 128
#ifndef SI_PAD_SIZE
-#define SI_PAD_SIZE ((SI_MAX_SIZE/sizeof(int)) - 3)
+#define SI_PAD_SIZE ((SI_MAX_SIZE - __ARCH_SI_PREAMBLE_SIZE) / sizeof(int))
+#endif
+
+#ifndef __ARCH_SI_UID_T
+#define __ARCH_SI_UID_T uid_t
#endif

#ifndef HAVE_ARCH_SIGINFO_T
@@ -26,7 +38,7 @@
/* kill() */
struct {
pid_t _pid; /* sender's pid */
- uid_t _uid; /* sender's uid */
+ __ARCH_SI_UID_T _uid; /* sender's uid */
} _kill;

/* POSIX.1b timers */
@@ -38,14 +50,14 @@
/* POSIX.1b signals */
struct {
pid_t _pid; /* sender's pid */
- uid_t _uid; /* sender's uid */
+ __ARCH_SI_UID_T _uid; /* sender's uid */
sigval_t _sigval;
} _rt;

/* SIGCHLD */
struct {
pid_t _pid; /* which child */
- uid_t _uid; /* sender's uid */
+ __ARCH_SI_UID_T _uid; /* sender's uid */
int _status; /* exit code */
clock_t _utime;
clock_t _stime;
@@ -54,6 +66,9 @@
/* SIGILL, SIGFPE, SIGSEGV, SIGBUS */
struct {
void *_addr; /* faulting insn/memory ref. */
+#ifdef __ARCH_SI_TRAPNO
+ int _trapno; /* TRAP # which caused the signal */
+#endif
} _sigfault;

/* SIGPOLL */
@@ -80,6 +95,9 @@
#define si_int _sifields._rt._sigval.sival_int
#define si_ptr _sifields._rt._sigval.sival_ptr
#define si_addr _sifields._sigfault._addr
+#ifdef __ARCH_SI_TRAPNO
+#define si_trapno _sifields._sigfault._trapno
+#endif
#define si_band _sifields._sigpoll._band
#define si_fd _sifields._sigpoll._fd

@@ -244,7 +262,7 @@
memcpy(to, from, sizeof(*to));
else
/* _sigchld is currently the largest know union member */
- memcpy(to, from, 3*sizeof(int) + sizeof(from->_sifields._sigchld));
+ memcpy(to, from, __ARCH_SI_PREAMBLE_SIZE + sizeof(from->_sifields._sigchld));
}

#endif
diff -ruN 2.5.41-1.747/include/asm-sparc/siginfo.h 2.5.41-1.747-si.1/include/asm-sparc/siginfo.h
--- 2.5.41-1.747/include/asm-sparc/siginfo.h 2002-06-03 12:13:01.000000000 +1000
+++ 2.5.41-1.747-si.1/include/asm-sparc/siginfo.h 2002-10-10 15:17:50.000000000 +1000
@@ -5,64 +5,12 @@
#ifndef _SPARC_SIGINFO_H
#define _SPARC_SIGINFO_H

-#define HAVE_ARCH_SIGINFO_T
-#define HAVE_ARCH_COPY_SIGINFO
+#define __ARCH_SI_UID_T unsigned int
+#define __ARCH_SI_TRAPNO
#define HAVE_ARCH_COPY_SIGINFO_TO_USER

#include <asm-generic/siginfo.h>

-typedef struct siginfo {
- int si_signo;
- int si_errno;
- int si_code;
-
- union {
- int _pad[SI_PAD_SIZE];
-
- /* kill() */
- struct {
- pid_t _pid; /* sender's pid */
- unsigned int _uid; /* sender's uid */
- } _kill;
-
- /* POSIX.1b timers */
- struct {
- unsigned int _timer1;
- unsigned int _timer2;
- } _timer;
-
- /* POSIX.1b signals */
- struct {
- pid_t _pid; /* sender's pid */
- unsigned int _uid; /* sender's uid */
- sigval_t _sigval;
- } _rt;
-
- /* SIGCHLD */
- struct {
- pid_t _pid; /* which child */
- unsigned int _uid; /* sender's uid */
- int _status; /* exit code */
- clock_t _utime;
- clock_t _stime;
- } _sigchld;
-
- /* SIGILL, SIGFPE, SIGSEGV, SIGBUS, SIGEMT */
- struct {
- void *_addr; /* faulting insn/memory ref. */
- int _trapno; /* TRAP # which caused the signal */
- } _sigfault;
-
- /* SIGPOLL */
- struct {
- int _band; /* POLL_IN, POLL_OUT, POLL_MSG */
- int _fd;
- } _sigpoll;
- } _sifields;
-} siginfo_t;
-
-#define si_trapno _sifields._sigfault._trapno
-
#define SI_NOINFO 32767 /* no information in siginfo_t */

/*
@@ -71,19 +19,4 @@
#define EMT_TAGOVF (__SI_FAULT|1) /* tag overflow */
#define NSIGEMT 1

-#ifdef __KERNEL__
-
-#include <linux/string.h>
-
-extern inline void copy_siginfo(siginfo_t *to, siginfo_t *from)
-{
- if (from->si_code < 0)
- *to = *from;
- else
- /* _sigchld is currently the largest know union member */
- memcpy(to, from, 3*sizeof(int) + sizeof(from->_sifields._sigchld));
-}
-
-#endif /* __KERNEL__ */
-
#endif /* !(_SPARC_SIGINFO_H) */
diff -ruN 2.5.41-1.747/include/asm-sparc64/siginfo.h 2.5.41-1.747-si.1/include/asm-sparc64/siginfo.h
--- 2.5.41-1.747/include/asm-sparc64/siginfo.h 2002-10-08 12:02:59.000000000 +1000
+++ 2.5.41-1.747-si.1/include/asm-sparc64/siginfo.h 2002-10-10 15:29:34.000000000 +1000
@@ -1,14 +1,13 @@
#ifndef _SPARC64_SIGINFO_H
#define _SPARC64_SIGINFO_H

-#define SI_PAD_SIZE ((SI_MAX_SIZE/sizeof(int)) - 4)
#define SI_PAD_SIZE32 ((SI_MAX_SIZE/sizeof(int)) - 3)

#define SIGEV_PAD_SIZE ((SIGEV_MAX_SIZE/sizeof(int)) - 4)
#define SIGEV_PAD_SIZE32 ((SIGEV_MAX_SIZE/sizeof(int)) - 3)

-#define HAVE_ARCH_SIGINFO_T
-#define HAVE_ARCH_COPY_SIGINFO
+#define __ARCH_SI_PREAMBLE_SIZE (4 * sizeof(int))
+#define __ARCH_SI_TRAPNO
#define HAVE_ARCH_COPY_SIGINFO_TO_USER

#include <asm-generic/siginfo.h>
@@ -20,60 +19,6 @@
u32 sival_ptr;
} sigval_t32;

-#endif /* __KERNEL__ */
-
-typedef struct siginfo {
- int si_signo;
- int si_errno;
- int si_code;
-
- union {
- int _pad[SI_PAD_SIZE];
-
- /* kill() */
- struct {
- pid_t _pid; /* sender's pid */
- uid_t _uid; /* sender's uid */
- } _kill;
-
- /* POSIX.1b timers */
- struct {
- unsigned int _timer1;
- unsigned int _timer2;
- } _timer;
-
- /* POSIX.1b signals */
- struct {
- pid_t _pid; /* sender's pid */
- uid_t _uid; /* sender's uid */
- sigval_t _sigval;
- } _rt;
-
- /* SIGCHLD */
- struct {
- pid_t _pid; /* which child */
- uid_t _uid; /* sender's uid */
- int _status; /* exit code */
- clock_t _utime;
- clock_t _stime;
- } _sigchld;
-
- /* SIGILL, SIGFPE, SIGSEGV, SIGBUS, SIGEMT */
- struct {
- void *_addr; /* faulting insn/memory ref. */
- int _trapno; /* TRAP # which caused the signal */
- } _sigfault;
-
- /* SIGPOLL */
- struct {
- long _band; /* POLL_IN, POLL_OUT, POLL_MSG */
- int _fd;
- } _sigpoll;
- } _sifields;
-} siginfo_t;
-
-#ifdef __KERNEL__
-
typedef struct siginfo32 {
int si_signo;
int si_errno;
@@ -126,8 +71,6 @@

#endif /* __KERNEL__ */

-#define si_trapno _sifields._sigfault._trapno
-
#define SI_NOINFO 32767 /* no information in siginfo_t */

/*
@@ -152,17 +95,6 @@
} _sigev_un;
} sigevent_t32;

-#include <linux/string.h>
-
-static inline void copy_siginfo(siginfo_t *to, siginfo_t *from)
-{
- if (from->si_code < 0)
- *to = *from;
- else
- /* _sigchld is currently the largest know union member */
- memcpy(to, from, 4*sizeof(int) + sizeof(from->_sifields._sigchld));
-}
-
extern int copy_siginfo_to_user32(siginfo_t32 *to, siginfo_t *from);

#endif /* __KERNEL__ */
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
\
 
 \ /
  Last update: 2005-03-22 13:29    [W:0.121 / U:0.020 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site