mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-17 20:25:19 +00:00
compat: fixes to allow working with tile arch
The existing <asm-generic/unistd.h> mechanism doesn't really provide enough to create the 64-bit "compat" ABI properly in a generic way, since the compat ABI is a mix of things were you can re-use the 64-bit versions of syscalls and things where you need a compat wrapper. To provide this in the most direct way possible, I added two new macros to go along with the existing __SYSCALL and __SC_3264 macros: __SC_COMP and SC_COMP_3264. These macros take an additional argument, typically a "compat_sys_xxx" function, which is passed to __SYSCALL if you define __SYSCALL_COMPAT when including the header, resulting in a pointer to the compat function being placed in the generated syscall table. The change also adds some missing definitions to <linux/compat.h> so that it actually has declarations for all the compat syscalls, since the "[nr] = ##call" approach requires proper C declarations for all the functions included in the syscall table. Finally, compat.c defines compat_sys_sigpending() and compat_sys_sigprocmask() even if the underlying architecture doesn't request it, which tries to pull in undefined compat_old_sigset_t defines. We need to guard those compat syscall definitions with appropriate __ARCH_WANT_SYS_xxx ifdefs. Acked-by: Arnd Bergmann <arnd@arndb.de> Signed-off-by: Chris Metcalf <cmetcalf@tilera.com>
This commit is contained in:
parent
d2e48c1d41
commit
be84cb4383
4 changed files with 320 additions and 98 deletions
|
@ -12,6 +12,7 @@
|
|||
#include <linux/sem.h>
|
||||
#include <linux/socket.h>
|
||||
#include <linux/if.h>
|
||||
#include <linux/fs.h>
|
||||
|
||||
#include <asm/compat.h>
|
||||
#include <asm/siginfo.h>
|
||||
|
@ -209,6 +210,18 @@ struct compat_robust_list_head {
|
|||
compat_uptr_t list_op_pending;
|
||||
};
|
||||
|
||||
struct compat_statfs;
|
||||
struct compat_statfs64;
|
||||
struct compat_old_linux_dirent;
|
||||
struct compat_linux_dirent;
|
||||
struct linux_dirent64;
|
||||
struct compat_msghdr;
|
||||
struct compat_mmsghdr;
|
||||
struct compat_sysinfo;
|
||||
struct compat_sysctl_args;
|
||||
struct compat_kexec_segment;
|
||||
struct compat_mq_attr;
|
||||
|
||||
extern void compat_exit_robust_list(struct task_struct *curr);
|
||||
|
||||
asmlinkage long
|
||||
|
@ -331,9 +344,13 @@ asmlinkage long compat_sys_epoll_pwait(int epfd,
|
|||
const compat_sigset_t __user *sigmask,
|
||||
compat_size_t sigsetsize);
|
||||
|
||||
asmlinkage long compat_sys_utime(const char __user *filename,
|
||||
struct compat_utimbuf __user *t);
|
||||
asmlinkage long compat_sys_utimensat(unsigned int dfd, const char __user *filename,
|
||||
struct compat_timespec __user *t, int flags);
|
||||
|
||||
asmlinkage long compat_sys_time(compat_time_t __user *tloc);
|
||||
asmlinkage long compat_sys_stime(compat_time_t __user *tptr);
|
||||
asmlinkage long compat_sys_signalfd(int ufd,
|
||||
const compat_sigset_t __user *sigmask,
|
||||
compat_size_t sigsetsize);
|
||||
|
@ -350,11 +367,181 @@ asmlinkage long compat_sys_move_pages(pid_t pid, unsigned long nr_page,
|
|||
int flags);
|
||||
asmlinkage long compat_sys_futimesat(unsigned int dfd, const char __user *filename,
|
||||
struct compat_timeval __user *t);
|
||||
asmlinkage long compat_sys_utimes(const char __user *filename,
|
||||
struct compat_timeval __user *t);
|
||||
asmlinkage long compat_sys_newstat(const char __user * filename,
|
||||
struct compat_stat __user *statbuf);
|
||||
asmlinkage long compat_sys_newlstat(const char __user * filename,
|
||||
struct compat_stat __user *statbuf);
|
||||
asmlinkage long compat_sys_newfstatat(unsigned int dfd, const char __user * filename,
|
||||
struct compat_stat __user *statbuf,
|
||||
int flag);
|
||||
asmlinkage long compat_sys_newfstat(unsigned int fd,
|
||||
struct compat_stat __user * statbuf);
|
||||
asmlinkage long compat_sys_statfs(const char __user *pathname,
|
||||
struct compat_statfs __user *buf);
|
||||
asmlinkage long compat_sys_fstatfs(unsigned int fd,
|
||||
struct compat_statfs __user *buf);
|
||||
asmlinkage long compat_sys_statfs64(const char __user *pathname,
|
||||
compat_size_t sz,
|
||||
struct compat_statfs64 __user *buf);
|
||||
asmlinkage long compat_sys_fstatfs64(unsigned int fd, compat_size_t sz,
|
||||
struct compat_statfs64 __user *buf);
|
||||
asmlinkage long compat_sys_fcntl64(unsigned int fd, unsigned int cmd,
|
||||
unsigned long arg);
|
||||
asmlinkage long compat_sys_fcntl(unsigned int fd, unsigned int cmd,
|
||||
unsigned long arg);
|
||||
asmlinkage long compat_sys_io_setup(unsigned nr_reqs, u32 __user *ctx32p);
|
||||
asmlinkage long compat_sys_io_getevents(aio_context_t ctx_id,
|
||||
unsigned long min_nr,
|
||||
unsigned long nr,
|
||||
struct io_event __user *events,
|
||||
struct compat_timespec __user *timeout);
|
||||
asmlinkage long compat_sys_io_submit(aio_context_t ctx_id, int nr,
|
||||
u32 __user *iocb);
|
||||
asmlinkage long compat_sys_mount(const char __user * dev_name,
|
||||
const char __user * dir_name,
|
||||
const char __user * type, unsigned long flags,
|
||||
const void __user * data);
|
||||
asmlinkage long compat_sys_old_readdir(unsigned int fd,
|
||||
struct compat_old_linux_dirent __user *,
|
||||
unsigned int count);
|
||||
asmlinkage long compat_sys_getdents(unsigned int fd,
|
||||
struct compat_linux_dirent __user *dirent,
|
||||
unsigned int count);
|
||||
asmlinkage long compat_sys_getdents64(unsigned int fd,
|
||||
struct linux_dirent64 __user * dirent,
|
||||
unsigned int count);
|
||||
asmlinkage long compat_sys_vmsplice(int fd, const struct compat_iovec __user *,
|
||||
unsigned int nr_segs, unsigned int flags);
|
||||
asmlinkage long compat_sys_open(const char __user *filename, int flags,
|
||||
int mode);
|
||||
asmlinkage long compat_sys_openat(unsigned int dfd, const char __user *filename,
|
||||
int flags, int mode);
|
||||
asmlinkage long compat_sys_open_by_handle_at(int mountdirfd,
|
||||
struct file_handle __user *handle,
|
||||
int flags);
|
||||
asmlinkage long compat_sys_pselect6(int n, compat_ulong_t __user *inp,
|
||||
compat_ulong_t __user *outp,
|
||||
compat_ulong_t __user *exp,
|
||||
struct compat_timespec __user *tsp,
|
||||
void __user *sig);
|
||||
asmlinkage long compat_sys_ppoll(struct pollfd __user *ufds,
|
||||
unsigned int nfds,
|
||||
struct compat_timespec __user *tsp,
|
||||
const compat_sigset_t __user *sigmask,
|
||||
compat_size_t sigsetsize);
|
||||
#if (defined(CONFIG_NFSD) || defined(CONFIG_NFSD_MODULE)) && !defined(CONFIG_NFSD_DEPRECATED)
|
||||
union compat_nfsctl_res;
|
||||
struct compat_nfsctl_arg;
|
||||
asmlinkage long compat_sys_nfsservctl(int cmd,
|
||||
struct compat_nfsctl_arg __user *arg,
|
||||
union compat_nfsctl_res __user *res);
|
||||
#else
|
||||
long asmlinkage compat_sys_nfsservctl(int cmd, void *notused, void *notused2);
|
||||
#endif
|
||||
asmlinkage long compat_sys_signalfd4(int ufd,
|
||||
const compat_sigset_t __user *sigmask,
|
||||
compat_size_t sigsetsize, int flags);
|
||||
asmlinkage long compat_sys_get_mempolicy(int __user *policy,
|
||||
compat_ulong_t __user *nmask,
|
||||
compat_ulong_t maxnode,
|
||||
compat_ulong_t addr,
|
||||
compat_ulong_t flags);
|
||||
asmlinkage long compat_sys_set_mempolicy(int mode, compat_ulong_t __user *nmask,
|
||||
compat_ulong_t maxnode);
|
||||
asmlinkage long compat_sys_mbind(compat_ulong_t start, compat_ulong_t len,
|
||||
compat_ulong_t mode,
|
||||
compat_ulong_t __user *nmask,
|
||||
compat_ulong_t maxnode, compat_ulong_t flags);
|
||||
|
||||
asmlinkage long compat_sys_setsockopt(int fd, int level, int optname,
|
||||
char __user *optval, unsigned int optlen);
|
||||
asmlinkage long compat_sys_sendmsg(int fd, struct compat_msghdr __user *msg,
|
||||
unsigned flags);
|
||||
asmlinkage long compat_sys_recvmsg(int fd, struct compat_msghdr __user *msg,
|
||||
unsigned int flags);
|
||||
asmlinkage long compat_sys_recv(int fd, void __user *buf, size_t len,
|
||||
unsigned flags);
|
||||
asmlinkage long compat_sys_recvfrom(int fd, void __user *buf, size_t len,
|
||||
unsigned flags, struct sockaddr __user *addr,
|
||||
int __user *addrlen);
|
||||
asmlinkage long compat_sys_recvmmsg(int fd, struct compat_mmsghdr __user *mmsg,
|
||||
unsigned vlen, unsigned int flags,
|
||||
struct compat_timespec __user *timeout);
|
||||
asmlinkage long compat_sys_nanosleep(struct compat_timespec __user *rqtp,
|
||||
struct compat_timespec __user *rmtp);
|
||||
asmlinkage long compat_sys_getitimer(int which,
|
||||
struct compat_itimerval __user *it);
|
||||
asmlinkage long compat_sys_setitimer(int which,
|
||||
struct compat_itimerval __user *in,
|
||||
struct compat_itimerval __user *out);
|
||||
asmlinkage long compat_sys_times(struct compat_tms __user *tbuf);
|
||||
asmlinkage long compat_sys_setrlimit(unsigned int resource,
|
||||
struct compat_rlimit __user *rlim);
|
||||
asmlinkage long compat_sys_getrlimit (unsigned int resource,
|
||||
struct compat_rlimit __user *rlim);
|
||||
asmlinkage long compat_sys_getrusage(int who, struct compat_rusage __user *ru);
|
||||
asmlinkage long compat_sys_sched_setaffinity(compat_pid_t pid,
|
||||
unsigned int len,
|
||||
compat_ulong_t __user *user_mask_ptr);
|
||||
asmlinkage long compat_sys_sched_getaffinity(compat_pid_t pid,
|
||||
unsigned int len,
|
||||
compat_ulong_t __user *user_mask_ptr);
|
||||
asmlinkage long compat_sys_timer_create(clockid_t which_clock,
|
||||
struct compat_sigevent __user *timer_event_spec,
|
||||
timer_t __user *created_timer_id);
|
||||
asmlinkage long compat_sys_timer_settime(timer_t timer_id, int flags,
|
||||
struct compat_itimerspec __user *new,
|
||||
struct compat_itimerspec __user *old);
|
||||
asmlinkage long compat_sys_timer_gettime(timer_t timer_id,
|
||||
struct compat_itimerspec __user *setting);
|
||||
asmlinkage long compat_sys_clock_settime(clockid_t which_clock,
|
||||
struct compat_timespec __user *tp);
|
||||
asmlinkage long compat_sys_clock_gettime(clockid_t which_clock,
|
||||
struct compat_timespec __user *tp);
|
||||
asmlinkage long compat_sys_clock_adjtime(clockid_t which_clock,
|
||||
struct compat_timex __user *tp);
|
||||
asmlinkage long compat_sys_clock_getres(clockid_t which_clock,
|
||||
struct compat_timespec __user *tp);
|
||||
asmlinkage long compat_sys_clock_nanosleep(clockid_t which_clock, int flags,
|
||||
struct compat_timespec __user *rqtp,
|
||||
struct compat_timespec __user *rmtp);
|
||||
asmlinkage long compat_sys_rt_sigtimedwait (compat_sigset_t __user *uthese,
|
||||
struct compat_siginfo __user *uinfo,
|
||||
struct compat_timespec __user *uts, compat_size_t sigsetsize);
|
||||
asmlinkage long compat_sys_rt_sigsuspend(compat_sigset_t __user *unewset,
|
||||
compat_size_t sigsetsize);
|
||||
asmlinkage long compat_sys_sysinfo(struct compat_sysinfo __user *info);
|
||||
asmlinkage long compat_sys_ioctl(unsigned int fd, unsigned int cmd,
|
||||
unsigned long arg);
|
||||
asmlinkage long compat_sys_futex(u32 __user *uaddr, int op, u32 val,
|
||||
struct compat_timespec __user *utime, u32 __user *uaddr2,
|
||||
u32 val3);
|
||||
asmlinkage long compat_sys_getsockopt(int fd, int level, int optname,
|
||||
char __user *optval, int __user *optlen);
|
||||
asmlinkage long compat_sys_kexec_load(unsigned long entry,
|
||||
unsigned long nr_segments,
|
||||
struct compat_kexec_segment __user *,
|
||||
unsigned long flags);
|
||||
asmlinkage long compat_sys_mq_getsetattr(mqd_t mqdes,
|
||||
const struct compat_mq_attr __user *u_mqstat,
|
||||
struct compat_mq_attr __user *u_omqstat);
|
||||
asmlinkage long compat_sys_mq_notify(mqd_t mqdes,
|
||||
const struct compat_sigevent __user *u_notification);
|
||||
asmlinkage long compat_sys_mq_open(const char __user *u_name,
|
||||
int oflag, compat_mode_t mode,
|
||||
struct compat_mq_attr __user *u_attr);
|
||||
asmlinkage long compat_sys_mq_timedsend(mqd_t mqdes,
|
||||
const char __user *u_msg_ptr,
|
||||
size_t msg_len, unsigned int msg_prio,
|
||||
const struct compat_timespec __user *u_abs_timeout);
|
||||
asmlinkage ssize_t compat_sys_mq_timedreceive(mqd_t mqdes,
|
||||
char __user *u_msg_ptr,
|
||||
size_t msg_len, unsigned int __user *u_msg_prio,
|
||||
const struct compat_timespec __user *u_abs_timeout);
|
||||
asmlinkage long compat_sys_socketcall(int call, u32 __user *args);
|
||||
asmlinkage long compat_sys_sysctl(struct compat_sysctl_args __user *args);
|
||||
|
||||
extern ssize_t compat_rw_copy_check_uvector(int type,
|
||||
const struct compat_iovec __user *uvector, unsigned long nr_segs,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue