Re: sizeof (siginfo_t) problem

Stephen Rothwell (sfr@canb.auug.org.au)
Tue, 15 Jul 2003 02:52:52 +1000


On Mon, 14 Jul 2003 08:40:00 -0400 Jakub Jelinek <jakub@redhat.com> wrote:
>
> The kernel unfortunately does this right on sparc64 and alpha from 64-bit
> arches only; ia64, s390x, ppc64 etc. got it wrong.

David Mosberger is correct that ia64 is OK (because it basically uses its
own siginfo.h as does mips64). The following is an update of a patch that
was lost a while ago (when __ARCH_SI_PREAMBLE_SIZE was invented).

I am not sure if the s390 fix is correct (since s390x has been merged) or
if x86_64 needs this (as I cannot remember the alignment needs of the
x86_64 compiler - though I suspect it is needed).

I have no idea if parisc is correct on 64 bit platforms (probably not).

This has been neither compiled or tested, but should be close.

-- 
Cheers,
Stephen Rothwell                    sfr@canb.auug.org.au

diff -ruN 2.6.0-test1/include/asm-generic/siginfo.h 2.6.0-test1-sfr.1/include/asm-generic/siginfo.h --- 2.6.0-test1/include/asm-generic/siginfo.h 2003-04-20 14:12:49.000000000 +1000 +++ 2.6.0-test1-sfr.1/include/asm-generic/siginfo.h 2003-07-15 02:41:47.000000000 +1000 @@ -142,7 +142,6 @@ #define SI_FROMUSER(siptr) ((siptr)->si_code <= 0) #define SI_FROMKERNEL(siptr) ((siptr)->si_code > 0) -#ifndef HAVE_ARCH_SI_CODES /* * SIGILL si_codes */ @@ -213,8 +212,6 @@ #define POLL_HUP (__SI_POLL|6) /* device disconnected */ #define NSIGPOLL 6 -#endif - /* * sigevent definitions * diff -ruN 2.6.0-test1/include/asm-ppc64/siginfo.h 2.6.0-test1-sfr.1/include/asm-ppc64/siginfo.h --- 2.6.0-test1/include/asm-ppc64/siginfo.h 2002-11-05 17:00:34.000000000 +1100 +++ 2.6.0-test1-sfr.1/include/asm-ppc64/siginfo.h 2003-07-15 02:28:22.000000000 +1000 @@ -8,8 +8,8 @@ * 2 of the License, or (at your option) any later version. */ -#define SI_PAD_SIZE ((SI_MAX_SIZE/sizeof(int)) - 4) -#define SI_PAD_SIZE32 ((SI_MAX_SIZE/sizeof(int)) - 3) +#define __ARCH_SI_PREAMBLE_SIZE (4 * sizeof(int)) +#define SI_PAD_SIZE32 ((SI_MAX_SIZE/sizeof(int)) - 3) #include <asm-generic/siginfo.h> diff -ruN 2.6.0-test1/include/asm-s390/siginfo.h 2.6.0-test1-sfr.1/include/asm-s390/siginfo.h --- 2.6.0-test1/include/asm-s390/siginfo.h 2002-11-05 16:58:19.000000000 +1100 +++ 2.6.0-test1-sfr.1/include/asm-s390/siginfo.h 2003-07-15 02:34:55.000000000 +1000 @@ -9,78 +9,12 @@ #ifndef _S390_SIGINFO_H #define _S390_SIGINFO_H -#define HAVE_ARCH_SI_CODES +#include <linux/config.h> -#include <asm-generic/siginfo.h> - -/* - * SIGILL si_codes - */ -#define ILL_ILLOPC (__SI_FAULT|1) /* illegal opcode */ -#define ILL_ILLOPN (__SI_FAULT|2) /* illegal operand */ -#define ILL_ILLADR (__SI_FAULT|3) /* illegal addressing mode */ -#define ILL_ILLTRP (__SI_FAULT|4) /* illegal trap */ -#define ILL_PRVOPC (__SI_FAULT|5) /* privileged opcode */ -#define ILL_PRVREG (__SI_FAULT|6) /* privileged register */ -#define ILL_COPROC (__SI_FAULT|7) /* coprocessor error */ -#define ILL_BADSTK (__SI_FAULT|8) /* internal stack error */ -#define NSIGILL 8 - -/* - * SIGFPE si_codes - */ -#define FPE_INTDIV (__SI_FAULT|1) /* integer divide by zero */ -#define FPE_INTOVF (__SI_FAULT|2) /* integer overflow */ -#define FPE_FLTDIV (__SI_FAULT|3) /* floating point divide by zero */ -#define FPE_FLTOVF (__SI_FAULT|4) /* floating point overflow */ -#define FPE_FLTUND (__SI_FAULT|5) /* floating point underflow */ -#define FPE_FLTRES (__SI_FAULT|6) /* floating point inexact result */ -#define FPE_FLTINV (__SI_FAULT|7) /* floating point invalid operation */ -#define FPE_FLTSUB (__SI_FAULT|8) /* subscript out of range */ -#define NSIGFPE 8 - -/* - * SIGSEGV si_codes - */ -#define SEGV_MAPERR (__SI_FAULT|1) /* address not mapped to object */ -#define SEGV_ACCERR (__SI_FAULT|2) /* invalid permissions for mapped object */ -#define NSIGSEGV 2 - -/* - * SIGBUS si_codes - */ -#define BUS_ADRALN (__SI_FAULT|1) /* invalid address alignment */ -#define BUS_ADRERR (__SI_FAULT|2) /* non-existant physical address */ -#define BUS_OBJERR (__SI_FAULT|3) /* object specific hardware error */ -#define NSIGBUS 3 - -/* - * SIGTRAP si_codes - */ -#define TRAP_BRKPT (__SI_FAULT|1) /* process breakpoint */ -#define TRAP_TRACE (__SI_FAULT|2) /* process trace trap */ -#define NSIGTRAP 2 - -/* - * SIGCHLD si_codes - */ -#define CLD_EXITED (__SI_CHLD|1) /* child has exited */ -#define CLD_KILLED (__SI_CHLD|2) /* child was killed */ -#define CLD_DUMPED (__SI_CHLD|3) /* child terminated abnormally */ -#define CLD_TRAPPED (__SI_CHLD|4) /* traced child has trapped */ -#define CLD_STOPPED (__SI_CHLD|5) /* child has stopped */ -#define CLD_CONTINUED (__SI_CHLD|6) /* stopped child has continued */ -#define NSIGCHLD 6 +#ifdef CONFIG_ARCH_S390X +#define __ARCH_SI_PREAMBLE_SIZE (4 * sizeof(int)) +#endif -/* - * SIGPOLL si_codes - */ -#define POLL_IN (__SI_POLL|1) /* data input available */ -#define POLL_OUT (__SI_POLL|2) /* output buffers available */ -#define POLL_MSG (__SI_POLL|3) /* input message available */ -#define POLL_ERR (__SI_POLL|4) /* i/o error */ -#define POLL_PRI (__SI_POLL|5) /* high priority input available */ -#define POLL_HUP (__SI_POLL|6) /* device disconnected */ -#define NSIGPOLL 6 +#include <asm-generic/siginfo.h> #endif diff -ruN 2.6.0-test1/include/asm-x86_64/siginfo.h 2.6.0-test1-sfr.1/include/asm-x86_64/siginfo.h --- 2.6.0-test1/include/asm-x86_64/siginfo.h 2002-11-05 16:58:09.000000000 +1100 +++ 2.6.0-test1-sfr.1/include/asm-x86_64/siginfo.h 2003-07-15 02:38:49.000000000 +1000 @@ -1,6 +1,9 @@ #ifndef _X8664_SIGINFO_H #define _X8664_SIGINFO_H +#define __ARCH_SI_PREAMBLE_SIZE (4 * sizeof(int)) +#define SIGEV_PAD_SIZE ((SIGEV_MAX_SIZE/sizeof(int)) - 4) + #include <asm-generic/siginfo.h> #endif - 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/