Linux Audio

Check our new training course

Loading...
v4.17
 1/* SPDX-License-Identifier: GPL-2.0 */
 2#ifndef __ASM_COMPAT_SIGNAL_H
 3#define __ASM_COMPAT_SIGNAL_H
 4
 5#include <linux/bug.h>
 6#include <linux/compat.h>
 7#include <linux/compiler.h>
 8
 9#include <asm/signal.h>
10#include <asm/siginfo.h>
11
12#include <linux/uaccess.h>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13
14static inline int __copy_conv_sigset_to_user(compat_sigset_t __user *d,
15	const sigset_t *s)
16{
17	BUILD_BUG_ON(sizeof(*d) != sizeof(*s));
18	BUILD_BUG_ON(_NSIG_WORDS != 2);
19
20	return put_compat_sigset(d, s, sizeof(*d));
 
 
 
 
 
 
 
 
21}
22
23static inline int __copy_conv_sigset_from_user(sigset_t *d,
24	const compat_sigset_t __user *s)
25{
26	return get_compat_sigset(d, s);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27}
28
29#endif /* __ASM_COMPAT_SIGNAL_H */
v3.1
 
  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 */