compat-signal.h 2.6 KB

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