summaryrefslogtreecommitdiff
path: root/arch/powerpc/include/asm/syscalls.h
blob: 6d51b007b59e53ac9f13028ace431220d3a907c5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef __ASM_POWERPC_SYSCALLS_H
#define __ASM_POWERPC_SYSCALLS_H
#ifdef __KERNEL__

#include <linux/compiler.h>
#include <linux/linkage.h>
#include <linux/types.h>
#include <linux/compat.h>

#include <asm/syscall.h>
#ifdef CONFIG_PPC64
#include <asm/syscalls_32.h>
#endif
#include <asm/unistd.h>
#include <asm/ucontext.h>

#ifndef CONFIG_ARCH_HAS_SYSCALL_WRAPPER
long sys_ni_syscall(void);
#else
long sys_ni_syscall(const struct pt_regs *regs);
#endif

struct rtas_args;

/*
 * long long munging:
 * The 32 bit ABI passes long longs in an odd even register pair.
 * High and low parts are swapped depending on endian mode,
 * so define a macro (similar to mips linux32) to handle that.
 */
#ifdef __LITTLE_ENDIAN__
#define merge_64(low, high) (((u64)high << 32) | low)
#else
#define merge_64(high, low) (((u64)high << 32) | low)
#endif

/*
 * PowerPC architecture-specific syscalls
 */

#ifndef CONFIG_ARCH_HAS_SYSCALL_WRAPPER

long sys_rtas(struct rtas_args __user *uargs);

#ifdef CONFIG_PPC64
long sys_ppc64_personality(unsigned long personality);
#ifdef CONFIG_COMPAT
long compat_sys_ppc64_personality(unsigned long personality);
#endif /* CONFIG_COMPAT */
#endif /* CONFIG_PPC64 */

long sys_swapcontext(struct ucontext __user *old_ctx,
		     struct ucontext __user *new_ctx, long ctx_size);
long sys_mmap(unsigned long addr, size_t len,
	      unsigned long prot, unsigned long flags,
	      unsigned long fd, off_t offset);
long sys_mmap2(unsigned long addr, size_t len,
	       unsigned long prot, unsigned long flags,
	       unsigned long fd, unsigned long pgoff);
long sys_switch_endian(void);

#ifdef CONFIG_PPC32
long sys_sigreturn(void);
long sys_debug_setcontext(struct ucontext __user *ctx, int ndbg,
			  struct sig_dbg_op __user *dbg);
#endif

long sys_rt_sigreturn(void);

long sys_subpage_prot(unsigned long addr,
		      unsigned long len, u32 __user *map);

#ifdef CONFIG_COMPAT
long compat_sys_swapcontext(struct ucontext32 __user *old_ctx,
			    struct ucontext32 __user *new_ctx,
			    int ctx_size);
long compat_sys_old_getrlimit(unsigned int resource,
			      struct compat_rlimit __user *rlim);
long compat_sys_sigreturn(void);
long compat_sys_rt_sigreturn(void);
#endif /* CONFIG_COMPAT */

/*
 * Architecture specific signatures required by long long munging:
 * The 32 bit ABI passes long longs in an odd even register pair.
 * The following signatures provide a machine long parameter for
 * each register that will be supplied. The implementation is
 * responsible for combining parameter pairs.
 */

#ifdef CONFIG_PPC32
long sys_ppc_pread64(unsigned int fd,
		     char __user *ubuf, compat_size_t count,
		     u32 reg6, u32 pos1, u32 pos2);
long sys_ppc_pwrite64(unsigned int fd,
		      const char __user *ubuf, compat_size_t count,
		      u32 reg6, u32 pos1, u32 pos2);
long sys_ppc_readahead(int fd, u32 r4,
		       u32 offset1, u32 offset2, u32 count);
long sys_ppc_truncate64(const char __user *path, u32 reg4,
		        unsigned long len1, unsigned long len2);
long sys_ppc_ftruncate64(unsigned int fd, u32 reg4,
			 unsigned long len1, unsigned long len2);
long sys_ppc32_fadvise64(int fd, u32 unused, u32 offset1, u32 offset2,
			 size_t len, int advice);
long sys_ppc_sync_file_range2(int fd, unsigned int flags,
			      unsigned int offset1,
			      unsigned int offset2,
			      unsigned int nbytes1,
			      unsigned int nbytes2);
long sys_ppc_fallocate(int fd, int mode, u32 offset1, u32 offset2,
		       u32 len1, u32 len2);
#endif
#ifdef CONFIG_COMPAT
long compat_sys_mmap2(unsigned long addr, size_t len,
		      unsigned long prot, unsigned long flags,
		      unsigned long fd, unsigned long pgoff);
long compat_sys_ppc_pread64(unsigned int fd,
			    char __user *ubuf, compat_size_t count,
			    u32 reg6, u32 pos1, u32 pos2);
long compat_sys_ppc_pwrite64(unsigned int fd,
			     const char __user *ubuf, compat_size_t count,
			     u32 reg6, u32 pos1, u32 pos2);
long compat_sys_ppc_readahead(int fd, u32 r4,
			      u32 offset1, u32 offset2, u32 count);
long compat_sys_ppc_truncate64(const char __user *path, u32 reg4,
			       unsigned long len1, unsigned long len2);
long compat_sys_ppc_ftruncate64(unsigned int fd, u32 reg4,
				unsigned long len1, unsigned long len2);
long compat_sys_ppc32_fadvise64(int fd, u32 unused, u32 offset1, u32 offset2,
				size_t len, int advice);
long compat_sys_ppc_sync_file_range2(int fd, unsigned int flags,
				     unsigned int offset1,
				     unsigned int offset2,
				     unsigned int nbytes1,
				     unsigned int nbytes2);
#endif /* CONFIG_COMPAT */

#if defined(CONFIG_PPC32) || defined(CONFIG_COMPAT)
long sys_ppc_fadvise64_64(int fd, int advice,
			  u32 offset_high, u32 offset_low,
			  u32 len_high, u32 len_low);
#endif

#else

#define __SYSCALL_WITH_COMPAT(nr, native, compat)	__SYSCALL(nr, native)
#define __SYSCALL(nr, entry) \
	long entry(const struct pt_regs *regs);

#ifdef CONFIG_PPC64
#include <asm/syscall_table_64.h>
#else
#include <asm/syscall_table_32.h>
#endif /* CONFIG_PPC64 */

#endif /* CONFIG_ARCH_HAS_SYSCALL_WRAPPER */

#endif /* __KERNEL__ */
#endif /* __ASM_POWERPC_SYSCALLS_H */