1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * Common syscall restarting data
4 */
5#ifndef __LINUX_RESTART_BLOCK_H
6#define __LINUX_RESTART_BLOCK_H
7
8#include <linux/compiler.h>
9#include <linux/types.h>
10
11struct __kernel_timespec;
12struct timespec;
13struct old_timespec32;
14struct pollfd;
15
16enum timespec_type {
17	TT_NONE		= 0,
18	TT_NATIVE	= 1,
19	TT_COMPAT	= 2,
20};
21
22/*
23 * System call restart block.
24 */
25struct restart_block {
26	unsigned long arch_data;
27	long (*fn)(struct restart_block *);
28	union {
29		/* For futex_wait and futex_wait_requeue_pi */
30		struct {
31			u32 __user *uaddr;
32			u32 val;
33			u32 flags;
34			u32 bitset;
35			u64 time;
36			u32 __user *uaddr2;
37		} futex;
38		/* For nanosleep */
39		struct {
40			clockid_t clockid;
41			enum timespec_type type;
42			union {
43				struct __kernel_timespec __user *rmtp;
44				struct old_timespec32 __user *compat_rmtp;
45			};
46			u64 expires;
47		} nanosleep;
48		/* For poll */
49		struct {
50			struct pollfd __user *ufds;
51			int nfds;
52			int has_timeout;
53			unsigned long tv_sec;
54			unsigned long tv_nsec;
55		} poll;
56	};
57};
58
59extern long do_no_restart_syscall(struct restart_block *parm);
60
61#endif /* __LINUX_RESTART_BLOCK_H */
62