Logo Search packages:      
Sourcecode: linux version File versions

compat-signal.h

#ifndef __ASM_COMPAT_SIGNAL_H
#define __ASM_COMPAT_SIGNAL_H

#include <linux/bug.h>
#include <linux/compat.h>
#include <linux/compiler.h>

#include <asm/signal.h>
#include <asm/siginfo.h>

#include <asm/uaccess.h>

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

typedef struct compat_siginfo {
      int si_signo;
      int si_code;
      int si_errno;

      union {
            int _pad[SI_PAD_SIZE32];

            /* kill() */
            struct {
                  compat_pid_t _pid;      /* sender's pid */
                  compat_uid_t _uid;      /* sender's uid */
            } _kill;

            /* SIGCHLD */
            struct {
                  compat_pid_t _pid;      /* which child */
                  compat_uid_t _uid;      /* sender's uid */
                  int _status;            /* exit code */
                  compat_clock_t _utime;
                  compat_clock_t _stime;
            } _sigchld;

            /* IRIX SIGCHLD */
            struct {
                  compat_pid_t _pid;      /* which child */
                  compat_clock_t _utime;
                  int _status;            /* exit code */
                  compat_clock_t _stime;
            } _irix_sigchld;

            /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */
            struct {
                  s32 _addr; /* faulting insn/memory ref. */
            } _sigfault;

            /* SIGPOLL, SIGXFSZ (To do ...)  */
            struct {
                  int _band;  /* POLL_IN, POLL_OUT, POLL_MSG */
                  int _fd;
            } _sigpoll;

            /* POSIX.1b timers */
            struct {
                  timer_t _tid;           /* timer id */
                  int _overrun;           /* overrun count */
                  compat_sigval_t _sigval;/* same as below */
                  int _sys_private;       /* not to be passed to user */
            } _timer;

            /* POSIX.1b signals */
            struct {
                  compat_pid_t _pid;      /* sender's pid */
                  compat_uid_t _uid;      /* sender's uid */
                  compat_sigval_t _sigval;
            } _rt;

      } _sifields;
} compat_siginfo_t;

static inline int __copy_conv_sigset_to_user(compat_sigset_t __user *d,
      const sigset_t *s)
{
      int err;

      BUG_ON(sizeof(*d) != sizeof(*s));
      BUG_ON(_NSIG_WORDS != 2);

      err  = __put_user(s->sig[0],       &d->sig[0]);
      err |= __put_user(s->sig[0] >> 32, &d->sig[1]);
      err |= __put_user(s->sig[1],       &d->sig[2]);
      err |= __put_user(s->sig[1] >> 32, &d->sig[3]);

      return err;
}

static inline int __copy_conv_sigset_from_user(sigset_t *d,
      const compat_sigset_t __user *s)
{
      int err;
      union sigset_u {
            sigset_t    s;
            compat_sigset_t c;
      } *u = (union sigset_u *) d;

      BUG_ON(sizeof(*d) != sizeof(*s));
      BUG_ON(_NSIG_WORDS != 2);

#ifdef CONFIG_CPU_BIG_ENDIAN
      err  = __get_user(u->c.sig[1], &s->sig[0]);
      err |= __get_user(u->c.sig[0], &s->sig[1]);
      err |= __get_user(u->c.sig[3], &s->sig[2]);
      err |= __get_user(u->c.sig[2], &s->sig[3]);
#endif
#ifdef CONFIG_CPU_LITTLE_ENDIAN
      err  = __get_user(u->c.sig[0], &s->sig[0]);
      err |= __get_user(u->c.sig[1], &s->sig[1]);
      err |= __get_user(u->c.sig[2], &s->sig[2]);
      err |= __get_user(u->c.sig[3], &s->sig[3]);
#endif

      return err;
}

#endif /* __ASM_COMPAT_SIGNAL_H */

Generated by  Doxygen 1.6.0   Back to index