linux/include/asm-mips/compat-signal.h
<<
>>
Prefs
   1#ifndef __ASM_COMPAT_SIGNAL_H
   2#define __ASM_COMPAT_SIGNAL_H
   3
   4#include <linux/bug.h>
   5#include <linux/compat.h>
   6#include <linux/compiler.h>
   7
   8#include <asm/signal.h>
   9#include <asm/siginfo.h>
  10
  11#include <asm/uaccess.h>
  12
  13#define SI_PAD_SIZE32   ((SI_MAX_SIZE/sizeof(int)) - 3)
  14
  15typedef struct compat_siginfo {
  16        int si_signo;
  17        int si_code;
  18        int si_errno;
  19
  20        union {
  21                int _pad[SI_PAD_SIZE32];
  22
  23                /* kill() */
  24                struct {
  25                        compat_pid_t _pid;      /* sender's pid */
  26                        compat_uid_t _uid;      /* sender's uid */
  27                } _kill;
  28
  29                /* SIGCHLD */
  30                struct {
  31                        compat_pid_t _pid;      /* which child */
  32                        compat_uid_t _uid;      /* sender's uid */
  33                        int _status;            /* exit code */
  34                        compat_clock_t _utime;
  35                        compat_clock_t _stime;
  36                } _sigchld;
  37
  38                /* IRIX SIGCHLD */
  39                struct {
  40                        compat_pid_t _pid;      /* which child */
  41                        compat_clock_t _utime;
  42                        int _status;            /* exit code */
  43                        compat_clock_t _stime;
  44                } _irix_sigchld;
  45
  46                /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */
  47                struct {
  48                        s32 _addr; /* faulting insn/memory ref. */
  49                } _sigfault;
  50
  51                /* SIGPOLL, SIGXFSZ (To do ...)  */
  52                struct {
  53                        int _band;      /* POLL_IN, POLL_OUT, POLL_MSG */
  54                        int _fd;
  55                } _sigpoll;
  56
  57                /* POSIX.1b timers */
  58                struct {
  59                        timer_t _tid;           /* timer id */
  60                        int _overrun;           /* overrun count */
  61                        compat_sigval_t _sigval;/* same as below */
  62                        int _sys_private;       /* not to be passed to user */
  63                } _timer;
  64
  65                /* POSIX.1b signals */
  66                struct {
  67                        compat_pid_t _pid;      /* sender's pid */
  68                        compat_uid_t _uid;      /* sender's uid */
  69                        compat_sigval_t _sigval;
  70                } _rt;
  71
  72        } _sifields;
  73} compat_siginfo_t;
  74
  75static inline int __copy_conv_sigset_to_user(compat_sigset_t __user *d,
  76        const sigset_t *s)
  77{
  78        int err;
  79
  80        BUG_ON(sizeof(*d) != sizeof(*s));
  81        BUG_ON(_NSIG_WORDS != 2);
  82
  83        err  = __put_user(s->sig[0],       &d->sig[0]);
  84        err |= __put_user(s->sig[0] >> 32, &d->sig[1]);
  85        err |= __put_user(s->sig[1],       &d->sig[2]);
  86        err |= __put_user(s->sig[1] >> 32, &d->sig[3]);
  87
  88        return err;
  89}
  90
  91static inline int __copy_conv_sigset_from_user(sigset_t *d,
  92        const compat_sigset_t __user *s)
  93{
  94        int err;
  95        union sigset_u {
  96                sigset_t        s;
  97                compat_sigset_t c;
  98        } *u = (union sigset_u *) d;
  99
 100        BUG_ON(sizeof(*d) != sizeof(*s));
 101        BUG_ON(_NSIG_WORDS != 2);
 102
 103#ifdef CONFIG_CPU_BIG_ENDIAN
 104        err  = __get_user(u->c.sig[1], &s->sig[0]);
 105        err |= __get_user(u->c.sig[0], &s->sig[1]);
 106        err |= __get_user(u->c.sig[3], &s->sig[2]);
 107        err |= __get_user(u->c.sig[2], &s->sig[3]);
 108#endif
 109#ifdef CONFIG_CPU_LITTLE_ENDIAN
 110        err  = __get_user(u->c.sig[0], &s->sig[0]);
 111        err |= __get_user(u->c.sig[1], &s->sig[1]);
 112        err |= __get_user(u->c.sig[2], &s->sig[2]);
 113        err |= __get_user(u->c.sig[3], &s->sig[3]);
 114#endif
 115
 116        return err;
 117}
 118
 119#endif /* __ASM_COMPAT_SIGNAL_H */
 120