| .. | .. |
|---|
| 7 | 7 | */ |
|---|
| 8 | 8 | |
|---|
| 9 | 9 | #include <linux/types.h> |
|---|
| 10 | | -#include <linux/compat_time.h> |
|---|
| 10 | +#include <linux/time.h> |
|---|
| 11 | 11 | |
|---|
| 12 | 12 | #include <linux/stat.h> |
|---|
| 13 | 13 | #include <linux/param.h> /* for HZ */ |
|---|
| .. | .. |
|---|
| 91 | 91 | static inline long __do_compat_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__)) |
|---|
| 92 | 92 | #endif /* COMPAT_SYSCALL_DEFINEx */ |
|---|
| 93 | 93 | |
|---|
| 94 | +struct compat_iovec { |
|---|
| 95 | + compat_uptr_t iov_base; |
|---|
| 96 | + compat_size_t iov_len; |
|---|
| 97 | +}; |
|---|
| 98 | + |
|---|
| 94 | 99 | #ifdef CONFIG_COMPAT |
|---|
| 95 | 100 | |
|---|
| 96 | 101 | #ifndef compat_user_stack_pointer |
|---|
| .. | .. |
|---|
| 113 | 118 | typedef __compat_uid32_t compat_uid_t; |
|---|
| 114 | 119 | typedef __compat_gid32_t compat_gid_t; |
|---|
| 115 | 120 | |
|---|
| 116 | | -typedef compat_ulong_t compat_aio_context_t; |
|---|
| 117 | | - |
|---|
| 118 | 121 | struct compat_sel_arg_struct; |
|---|
| 119 | 122 | struct rusage; |
|---|
| 120 | 123 | |
|---|
| 121 | | -struct compat_utimbuf { |
|---|
| 122 | | - compat_time_t actime; |
|---|
| 123 | | - compat_time_t modtime; |
|---|
| 124 | | -}; |
|---|
| 125 | | - |
|---|
| 126 | | -struct compat_itimerval { |
|---|
| 127 | | - struct compat_timeval it_interval; |
|---|
| 128 | | - struct compat_timeval it_value; |
|---|
| 129 | | -}; |
|---|
| 130 | | - |
|---|
| 131 | | -struct itimerval; |
|---|
| 132 | | -int get_compat_itimerval(struct itimerval *, const struct compat_itimerval __user *); |
|---|
| 133 | | -int put_compat_itimerval(struct compat_itimerval __user *, const struct itimerval *); |
|---|
| 124 | +struct old_itimerval32; |
|---|
| 134 | 125 | |
|---|
| 135 | 126 | struct compat_tms { |
|---|
| 136 | 127 | compat_clock_t tms_utime; |
|---|
| .. | .. |
|---|
| 139 | 130 | compat_clock_t tms_cstime; |
|---|
| 140 | 131 | }; |
|---|
| 141 | 132 | |
|---|
| 142 | | -struct compat_timex { |
|---|
| 143 | | - compat_uint_t modes; |
|---|
| 144 | | - compat_long_t offset; |
|---|
| 145 | | - compat_long_t freq; |
|---|
| 146 | | - compat_long_t maxerror; |
|---|
| 147 | | - compat_long_t esterror; |
|---|
| 148 | | - compat_int_t status; |
|---|
| 149 | | - compat_long_t constant; |
|---|
| 150 | | - compat_long_t precision; |
|---|
| 151 | | - compat_long_t tolerance; |
|---|
| 152 | | - struct compat_timeval time; |
|---|
| 153 | | - compat_long_t tick; |
|---|
| 154 | | - compat_long_t ppsfreq; |
|---|
| 155 | | - compat_long_t jitter; |
|---|
| 156 | | - compat_int_t shift; |
|---|
| 157 | | - compat_long_t stabil; |
|---|
| 158 | | - compat_long_t jitcnt; |
|---|
| 159 | | - compat_long_t calcnt; |
|---|
| 160 | | - compat_long_t errcnt; |
|---|
| 161 | | - compat_long_t stbcnt; |
|---|
| 162 | | - compat_int_t tai; |
|---|
| 163 | | - |
|---|
| 164 | | - compat_int_t:32; compat_int_t:32; compat_int_t:32; compat_int_t:32; |
|---|
| 165 | | - compat_int_t:32; compat_int_t:32; compat_int_t:32; compat_int_t:32; |
|---|
| 166 | | - compat_int_t:32; compat_int_t:32; compat_int_t:32; |
|---|
| 167 | | -}; |
|---|
| 168 | | - |
|---|
| 169 | | -struct timex; |
|---|
| 170 | | -int compat_get_timex(struct timex *, const struct compat_timex __user *); |
|---|
| 171 | | -int compat_put_timex(struct compat_timex __user *, const struct timex *); |
|---|
| 172 | | - |
|---|
| 173 | 133 | #define _COMPAT_NSIG_WORDS (_COMPAT_NSIG / _COMPAT_NSIG_BPW) |
|---|
| 174 | 134 | |
|---|
| 175 | 135 | typedef struct { |
|---|
| 176 | 136 | compat_sigset_word sig[_COMPAT_NSIG_WORDS]; |
|---|
| 177 | 137 | } compat_sigset_t; |
|---|
| 138 | + |
|---|
| 139 | +int set_compat_user_sigmask(const compat_sigset_t __user *umask, |
|---|
| 140 | + size_t sigsetsize); |
|---|
| 178 | 141 | |
|---|
| 179 | 142 | struct compat_sigaction { |
|---|
| 180 | 143 | #ifndef __ARCH_HAS_IRIX_SIGACTION |
|---|
| .. | .. |
|---|
| 290 | 253 | } _sifields; |
|---|
| 291 | 254 | } compat_siginfo_t; |
|---|
| 292 | 255 | |
|---|
| 293 | | -/* |
|---|
| 294 | | - * These functions operate on 32- or 64-bit specs depending on |
|---|
| 295 | | - * COMPAT_USE_64BIT_TIME, hence the void user pointer arguments. |
|---|
| 296 | | - */ |
|---|
| 297 | | -extern int compat_get_timespec(struct timespec *, const void __user *); |
|---|
| 298 | | -extern int compat_put_timespec(const struct timespec *, void __user *); |
|---|
| 299 | | -extern int compat_get_timeval(struct timeval *, const void __user *); |
|---|
| 300 | | -extern int compat_put_timeval(const struct timeval *, void __user *); |
|---|
| 301 | | - |
|---|
| 302 | | -struct compat_iovec { |
|---|
| 303 | | - compat_uptr_t iov_base; |
|---|
| 304 | | - compat_size_t iov_len; |
|---|
| 305 | | -}; |
|---|
| 306 | | - |
|---|
| 307 | 256 | struct compat_rlimit { |
|---|
| 308 | 257 | compat_ulong_t rlim_cur; |
|---|
| 309 | 258 | compat_ulong_t rlim_max; |
|---|
| 310 | 259 | }; |
|---|
| 311 | 260 | |
|---|
| 312 | 261 | struct compat_rusage { |
|---|
| 313 | | - struct compat_timeval ru_utime; |
|---|
| 314 | | - struct compat_timeval ru_stime; |
|---|
| 262 | + struct old_timeval32 ru_utime; |
|---|
| 263 | + struct old_timeval32 ru_stime; |
|---|
| 315 | 264 | compat_long_t ru_maxrss; |
|---|
| 316 | 265 | compat_long_t ru_ixrss; |
|---|
| 317 | 266 | compat_long_t ru_idrss; |
|---|
| .. | .. |
|---|
| 453 | 402 | unsigned long bitmap_size); |
|---|
| 454 | 403 | long compat_put_bitmap(compat_ulong_t __user *umask, unsigned long *mask, |
|---|
| 455 | 404 | unsigned long bitmap_size); |
|---|
| 456 | | -int copy_siginfo_from_user32(siginfo_t *to, const struct compat_siginfo __user *from); |
|---|
| 457 | | -int copy_siginfo_to_user32(struct compat_siginfo __user *to, const siginfo_t *from); |
|---|
| 405 | +void copy_siginfo_to_external32(struct compat_siginfo *to, |
|---|
| 406 | + const struct kernel_siginfo *from); |
|---|
| 407 | +int copy_siginfo_from_user32(kernel_siginfo_t *to, |
|---|
| 408 | + const struct compat_siginfo __user *from); |
|---|
| 409 | +int __copy_siginfo_to_user32(struct compat_siginfo __user *to, |
|---|
| 410 | + const kernel_siginfo_t *from); |
|---|
| 411 | +#ifndef copy_siginfo_to_user32 |
|---|
| 412 | +#define copy_siginfo_to_user32 __copy_siginfo_to_user32 |
|---|
| 413 | +#endif |
|---|
| 458 | 414 | int get_compat_sigevent(struct sigevent *event, |
|---|
| 459 | 415 | const struct compat_sigevent __user *u_event); |
|---|
| 460 | | - |
|---|
| 461 | | -static inline int compat_timeval_compare(struct compat_timeval *lhs, |
|---|
| 462 | | - struct compat_timeval *rhs) |
|---|
| 463 | | -{ |
|---|
| 464 | | - if (lhs->tv_sec < rhs->tv_sec) |
|---|
| 465 | | - return -1; |
|---|
| 466 | | - if (lhs->tv_sec > rhs->tv_sec) |
|---|
| 467 | | - return 1; |
|---|
| 468 | | - return lhs->tv_usec - rhs->tv_usec; |
|---|
| 469 | | -} |
|---|
| 470 | | - |
|---|
| 471 | | -static inline int compat_timespec_compare(struct compat_timespec *lhs, |
|---|
| 472 | | - struct compat_timespec *rhs) |
|---|
| 473 | | -{ |
|---|
| 474 | | - if (lhs->tv_sec < rhs->tv_sec) |
|---|
| 475 | | - return -1; |
|---|
| 476 | | - if (lhs->tv_sec > rhs->tv_sec) |
|---|
| 477 | | - return 1; |
|---|
| 478 | | - return lhs->tv_nsec - rhs->tv_nsec; |
|---|
| 479 | | -} |
|---|
| 480 | 416 | |
|---|
| 481 | 417 | extern int get_compat_sigset(sigset_t *set, const compat_sigset_t __user *compat); |
|---|
| 482 | 418 | |
|---|
| .. | .. |
|---|
| 493 | 429 | compat_sigset_t v; |
|---|
| 494 | 430 | switch (_NSIG_WORDS) { |
|---|
| 495 | 431 | case 4: v.sig[7] = (set->sig[3] >> 32); v.sig[6] = set->sig[3]; |
|---|
| 432 | + fallthrough; |
|---|
| 496 | 433 | case 3: v.sig[5] = (set->sig[2] >> 32); v.sig[4] = set->sig[2]; |
|---|
| 434 | + fallthrough; |
|---|
| 497 | 435 | case 2: v.sig[3] = (set->sig[1] >> 32); v.sig[2] = set->sig[1]; |
|---|
| 436 | + fallthrough; |
|---|
| 498 | 437 | case 1: v.sig[1] = (set->sig[0] >> 32); v.sig[0] = set->sig[0]; |
|---|
| 499 | 438 | } |
|---|
| 500 | 439 | return copy_to_user(compat, &v, size) ? -EFAULT : 0; |
|---|
| .. | .. |
|---|
| 512 | 451 | |
|---|
| 513 | 452 | struct epoll_event; /* fortunately, this one is fixed-layout */ |
|---|
| 514 | 453 | |
|---|
| 515 | | -extern ssize_t compat_rw_copy_check_uvector(int type, |
|---|
| 516 | | - const struct compat_iovec __user *uvector, |
|---|
| 517 | | - unsigned long nr_segs, |
|---|
| 518 | | - unsigned long fast_segs, struct iovec *fast_pointer, |
|---|
| 519 | | - struct iovec **ret_pointer); |
|---|
| 520 | | - |
|---|
| 521 | 454 | extern void __user *compat_alloc_user_space(unsigned long len); |
|---|
| 522 | 455 | |
|---|
| 523 | 456 | int compat_restore_altstack(const compat_stack_t __user *uss); |
|---|
| 524 | 457 | int __compat_save_altstack(compat_stack_t __user *, unsigned long); |
|---|
| 525 | | -#define compat_save_altstack_ex(uss, sp) do { \ |
|---|
| 458 | +#define unsafe_compat_save_altstack(uss, sp, label) do { \ |
|---|
| 526 | 459 | compat_stack_t __user *__uss = uss; \ |
|---|
| 527 | 460 | struct task_struct *t = current; \ |
|---|
| 528 | | - put_user_ex(ptr_to_compat((void __user *)t->sas_ss_sp), &__uss->ss_sp); \ |
|---|
| 529 | | - put_user_ex(t->sas_ss_flags, &__uss->ss_flags); \ |
|---|
| 530 | | - put_user_ex(t->sas_ss_size, &__uss->ss_size); \ |
|---|
| 461 | + unsafe_put_user(ptr_to_compat((void __user *)t->sas_ss_sp), \ |
|---|
| 462 | + &__uss->ss_sp, label); \ |
|---|
| 463 | + unsafe_put_user(t->sas_ss_flags, &__uss->ss_flags, label); \ |
|---|
| 464 | + unsafe_put_user(t->sas_ss_size, &__uss->ss_size, label); \ |
|---|
| 531 | 465 | if (t->sas_ss_flags & SS_AUTODISARM) \ |
|---|
| 532 | 466 | sas_ss_reset(t); \ |
|---|
| 533 | 467 | } while (0); |
|---|
| .. | .. |
|---|
| 549 | 483 | asmlinkage long compat_sys_io_setup(unsigned nr_reqs, u32 __user *ctx32p); |
|---|
| 550 | 484 | asmlinkage long compat_sys_io_submit(compat_aio_context_t ctx_id, int nr, |
|---|
| 551 | 485 | u32 __user *iocb); |
|---|
| 552 | | -asmlinkage long compat_sys_io_getevents(compat_aio_context_t ctx_id, |
|---|
| 553 | | - compat_long_t min_nr, |
|---|
| 554 | | - compat_long_t nr, |
|---|
| 555 | | - struct io_event __user *events, |
|---|
| 556 | | - struct compat_timespec __user *timeout); |
|---|
| 557 | 486 | asmlinkage long compat_sys_io_pgetevents(compat_aio_context_t ctx_id, |
|---|
| 558 | 487 | compat_long_t min_nr, |
|---|
| 559 | 488 | compat_long_t nr, |
|---|
| 560 | 489 | struct io_event __user *events, |
|---|
| 561 | | - struct compat_timespec __user *timeout, |
|---|
| 490 | + struct old_timespec32 __user *timeout, |
|---|
| 491 | + const struct __compat_aio_sigset __user *usig); |
|---|
| 492 | +asmlinkage long compat_sys_io_pgetevents_time64(compat_aio_context_t ctx_id, |
|---|
| 493 | + compat_long_t min_nr, |
|---|
| 494 | + compat_long_t nr, |
|---|
| 495 | + struct io_event __user *events, |
|---|
| 496 | + struct __kernel_timespec __user *timeout, |
|---|
| 562 | 497 | const struct __compat_aio_sigset __user *usig); |
|---|
| 563 | 498 | |
|---|
| 564 | 499 | /* fs/cookies.c */ |
|---|
| .. | .. |
|---|
| 580 | 515 | /* fs/ioctl.c */ |
|---|
| 581 | 516 | asmlinkage long compat_sys_ioctl(unsigned int fd, unsigned int cmd, |
|---|
| 582 | 517 | compat_ulong_t arg); |
|---|
| 583 | | - |
|---|
| 584 | | -/* fs/namespace.c */ |
|---|
| 585 | | -asmlinkage long compat_sys_mount(const char __user *dev_name, |
|---|
| 586 | | - const char __user *dir_name, |
|---|
| 587 | | - const char __user *type, compat_ulong_t flags, |
|---|
| 588 | | - const void __user *data); |
|---|
| 589 | 518 | |
|---|
| 590 | 519 | /* fs/open.c */ |
|---|
| 591 | 520 | asmlinkage long compat_sys_statfs(const char __user *pathname, |
|---|
| .. | .. |
|---|
| 610 | 539 | |
|---|
| 611 | 540 | /* fs/read_write.c */ |
|---|
| 612 | 541 | asmlinkage long compat_sys_lseek(unsigned int, compat_off_t, unsigned int); |
|---|
| 613 | | -asmlinkage ssize_t compat_sys_readv(compat_ulong_t fd, |
|---|
| 614 | | - const struct compat_iovec __user *vec, compat_ulong_t vlen); |
|---|
| 615 | | -asmlinkage ssize_t compat_sys_writev(compat_ulong_t fd, |
|---|
| 616 | | - const struct compat_iovec __user *vec, compat_ulong_t vlen); |
|---|
| 617 | 542 | /* No generic prototype for pread64 and pwrite64 */ |
|---|
| 618 | 543 | asmlinkage ssize_t compat_sys_preadv(compat_ulong_t fd, |
|---|
| 619 | | - const struct compat_iovec __user *vec, |
|---|
| 544 | + const struct iovec __user *vec, |
|---|
| 620 | 545 | compat_ulong_t vlen, u32 pos_low, u32 pos_high); |
|---|
| 621 | 546 | asmlinkage ssize_t compat_sys_pwritev(compat_ulong_t fd, |
|---|
| 622 | | - const struct compat_iovec __user *vec, |
|---|
| 547 | + const struct iovec __user *vec, |
|---|
| 623 | 548 | compat_ulong_t vlen, u32 pos_low, u32 pos_high); |
|---|
| 624 | 549 | #ifdef __ARCH_WANT_COMPAT_SYS_PREADV64 |
|---|
| 625 | 550 | asmlinkage long compat_sys_preadv64(unsigned long fd, |
|---|
| 626 | | - const struct compat_iovec __user *vec, |
|---|
| 551 | + const struct iovec __user *vec, |
|---|
| 627 | 552 | unsigned long vlen, loff_t pos); |
|---|
| 628 | 553 | #endif |
|---|
| 629 | 554 | |
|---|
| 630 | 555 | #ifdef __ARCH_WANT_COMPAT_SYS_PWRITEV64 |
|---|
| 631 | 556 | asmlinkage long compat_sys_pwritev64(unsigned long fd, |
|---|
| 632 | | - const struct compat_iovec __user *vec, |
|---|
| 557 | + const struct iovec __user *vec, |
|---|
| 633 | 558 | unsigned long vlen, loff_t pos); |
|---|
| 634 | 559 | #endif |
|---|
| 635 | 560 | |
|---|
| .. | .. |
|---|
| 640 | 565 | compat_loff_t __user *offset, compat_size_t count); |
|---|
| 641 | 566 | |
|---|
| 642 | 567 | /* fs/select.c */ |
|---|
| 643 | | -asmlinkage long compat_sys_pselect6(int n, compat_ulong_t __user *inp, |
|---|
| 568 | +asmlinkage long compat_sys_pselect6_time32(int n, compat_ulong_t __user *inp, |
|---|
| 644 | 569 | compat_ulong_t __user *outp, |
|---|
| 645 | 570 | compat_ulong_t __user *exp, |
|---|
| 646 | | - struct compat_timespec __user *tsp, |
|---|
| 571 | + struct old_timespec32 __user *tsp, |
|---|
| 647 | 572 | void __user *sig); |
|---|
| 648 | | -asmlinkage long compat_sys_ppoll(struct pollfd __user *ufds, |
|---|
| 573 | +asmlinkage long compat_sys_pselect6_time64(int n, compat_ulong_t __user *inp, |
|---|
| 574 | + compat_ulong_t __user *outp, |
|---|
| 575 | + compat_ulong_t __user *exp, |
|---|
| 576 | + struct __kernel_timespec __user *tsp, |
|---|
| 577 | + void __user *sig); |
|---|
| 578 | +asmlinkage long compat_sys_ppoll_time32(struct pollfd __user *ufds, |
|---|
| 649 | 579 | unsigned int nfds, |
|---|
| 650 | | - struct compat_timespec __user *tsp, |
|---|
| 580 | + struct old_timespec32 __user *tsp, |
|---|
| 581 | + const compat_sigset_t __user *sigmask, |
|---|
| 582 | + compat_size_t sigsetsize); |
|---|
| 583 | +asmlinkage long compat_sys_ppoll_time64(struct pollfd __user *ufds, |
|---|
| 584 | + unsigned int nfds, |
|---|
| 585 | + struct __kernel_timespec __user *tsp, |
|---|
| 651 | 586 | const compat_sigset_t __user *sigmask, |
|---|
| 652 | 587 | compat_size_t sigsetsize); |
|---|
| 653 | 588 | |
|---|
| .. | .. |
|---|
| 655 | 590 | asmlinkage long compat_sys_signalfd4(int ufd, |
|---|
| 656 | 591 | const compat_sigset_t __user *sigmask, |
|---|
| 657 | 592 | compat_size_t sigsetsize, int flags); |
|---|
| 658 | | - |
|---|
| 659 | | -/* fs/splice.c */ |
|---|
| 660 | | -asmlinkage long compat_sys_vmsplice(int fd, const struct compat_iovec __user *, |
|---|
| 661 | | - unsigned int nr_segs, unsigned int flags); |
|---|
| 662 | 593 | |
|---|
| 663 | 594 | /* fs/stat.c */ |
|---|
| 664 | 595 | asmlinkage long compat_sys_newfstatat(unsigned int dfd, |
|---|
| .. | .. |
|---|
| 670 | 601 | |
|---|
| 671 | 602 | /* fs/sync.c: No generic prototype for sync_file_range and sync_file_range2 */ |
|---|
| 672 | 603 | |
|---|
| 673 | | -/* fs/timerfd.c */ |
|---|
| 674 | | -asmlinkage long compat_sys_timerfd_gettime(int ufd, |
|---|
| 675 | | - struct compat_itimerspec __user *otmr); |
|---|
| 676 | | -asmlinkage long compat_sys_timerfd_settime(int ufd, int flags, |
|---|
| 677 | | - const struct compat_itimerspec __user *utmr, |
|---|
| 678 | | - struct compat_itimerspec __user *otmr); |
|---|
| 679 | | - |
|---|
| 680 | | -/* fs/utimes.c */ |
|---|
| 681 | | -asmlinkage long compat_sys_utimensat(unsigned int dfd, |
|---|
| 682 | | - const char __user *filename, |
|---|
| 683 | | - struct compat_timespec __user *t, |
|---|
| 684 | | - int flags); |
|---|
| 685 | | - |
|---|
| 686 | 604 | /* kernel/exit.c */ |
|---|
| 687 | 605 | asmlinkage long compat_sys_waitid(int, compat_pid_t, |
|---|
| 688 | 606 | struct compat_siginfo __user *, int, |
|---|
| .. | .. |
|---|
| 691 | 609 | |
|---|
| 692 | 610 | |
|---|
| 693 | 611 | /* kernel/futex.c */ |
|---|
| 694 | | -asmlinkage long compat_sys_futex(u32 __user *uaddr, int op, u32 val, |
|---|
| 695 | | - struct compat_timespec __user *utime, u32 __user *uaddr2, |
|---|
| 696 | | - u32 val3); |
|---|
| 697 | 612 | asmlinkage long |
|---|
| 698 | 613 | compat_sys_set_robust_list(struct compat_robust_list_head __user *head, |
|---|
| 699 | 614 | compat_size_t len); |
|---|
| .. | .. |
|---|
| 701 | 616 | compat_sys_get_robust_list(int pid, compat_uptr_t __user *head_ptr, |
|---|
| 702 | 617 | compat_size_t __user *len_ptr); |
|---|
| 703 | 618 | |
|---|
| 704 | | -/* kernel/hrtimer.c */ |
|---|
| 705 | | -asmlinkage long compat_sys_nanosleep(struct compat_timespec __user *rqtp, |
|---|
| 706 | | - struct compat_timespec __user *rmtp); |
|---|
| 707 | | - |
|---|
| 708 | 619 | /* kernel/itimer.c */ |
|---|
| 709 | 620 | asmlinkage long compat_sys_getitimer(int which, |
|---|
| 710 | | - struct compat_itimerval __user *it); |
|---|
| 621 | + struct old_itimerval32 __user *it); |
|---|
| 711 | 622 | asmlinkage long compat_sys_setitimer(int which, |
|---|
| 712 | | - struct compat_itimerval __user *in, |
|---|
| 713 | | - struct compat_itimerval __user *out); |
|---|
| 623 | + struct old_itimerval32 __user *in, |
|---|
| 624 | + struct old_itimerval32 __user *out); |
|---|
| 714 | 625 | |
|---|
| 715 | 626 | /* kernel/kexec.c */ |
|---|
| 716 | 627 | asmlinkage long compat_sys_kexec_load(compat_ulong_t entry, |
|---|
| .. | .. |
|---|
| 722 | 633 | asmlinkage long compat_sys_timer_create(clockid_t which_clock, |
|---|
| 723 | 634 | struct compat_sigevent __user *timer_event_spec, |
|---|
| 724 | 635 | timer_t __user *created_timer_id); |
|---|
| 725 | | -asmlinkage long compat_sys_timer_gettime(timer_t timer_id, |
|---|
| 726 | | - struct compat_itimerspec __user *setting); |
|---|
| 727 | | -asmlinkage long compat_sys_timer_settime(timer_t timer_id, int flags, |
|---|
| 728 | | - struct compat_itimerspec __user *new, |
|---|
| 729 | | - struct compat_itimerspec __user *old); |
|---|
| 730 | | -asmlinkage long compat_sys_clock_settime(clockid_t which_clock, |
|---|
| 731 | | - struct compat_timespec __user *tp); |
|---|
| 732 | | -asmlinkage long compat_sys_clock_gettime(clockid_t which_clock, |
|---|
| 733 | | - struct compat_timespec __user *tp); |
|---|
| 734 | | -asmlinkage long compat_sys_clock_getres(clockid_t which_clock, |
|---|
| 735 | | - struct compat_timespec __user *tp); |
|---|
| 736 | | -asmlinkage long compat_sys_clock_nanosleep(clockid_t which_clock, int flags, |
|---|
| 737 | | - struct compat_timespec __user *rqtp, |
|---|
| 738 | | - struct compat_timespec __user *rmtp); |
|---|
| 739 | 636 | |
|---|
| 740 | 637 | /* kernel/ptrace.c */ |
|---|
| 741 | 638 | asmlinkage long compat_sys_ptrace(compat_long_t request, compat_long_t pid, |
|---|
| .. | .. |
|---|
| 748 | 645 | asmlinkage long compat_sys_sched_getaffinity(compat_pid_t pid, |
|---|
| 749 | 646 | unsigned int len, |
|---|
| 750 | 647 | compat_ulong_t __user *user_mask_ptr); |
|---|
| 751 | | -asmlinkage long compat_sys_sched_rr_get_interval(compat_pid_t pid, |
|---|
| 752 | | - struct compat_timespec __user *interval); |
|---|
| 753 | 648 | |
|---|
| 754 | 649 | /* kernel/signal.c */ |
|---|
| 755 | 650 | asmlinkage long compat_sys_sigaltstack(const compat_stack_t __user *uss_ptr, |
|---|
| .. | .. |
|---|
| 767 | 662 | compat_size_t sigsetsize); |
|---|
| 768 | 663 | asmlinkage long compat_sys_rt_sigpending(compat_sigset_t __user *uset, |
|---|
| 769 | 664 | compat_size_t sigsetsize); |
|---|
| 770 | | -asmlinkage long compat_sys_rt_sigtimedwait(compat_sigset_t __user *uthese, |
|---|
| 665 | +asmlinkage long compat_sys_rt_sigtimedwait_time32(compat_sigset_t __user *uthese, |
|---|
| 771 | 666 | struct compat_siginfo __user *uinfo, |
|---|
| 772 | | - struct compat_timespec __user *uts, compat_size_t sigsetsize); |
|---|
| 667 | + struct old_timespec32 __user *uts, compat_size_t sigsetsize); |
|---|
| 668 | +asmlinkage long compat_sys_rt_sigtimedwait_time64(compat_sigset_t __user *uthese, |
|---|
| 669 | + struct compat_siginfo __user *uinfo, |
|---|
| 670 | + struct __kernel_timespec __user *uts, compat_size_t sigsetsize); |
|---|
| 773 | 671 | asmlinkage long compat_sys_rt_sigqueueinfo(compat_pid_t pid, int sig, |
|---|
| 774 | 672 | struct compat_siginfo __user *uinfo); |
|---|
| 775 | 673 | /* No generic prototype for rt_sigreturn */ |
|---|
| .. | .. |
|---|
| 783 | 681 | asmlinkage long compat_sys_getrusage(int who, struct compat_rusage __user *ru); |
|---|
| 784 | 682 | |
|---|
| 785 | 683 | /* kernel/time.c */ |
|---|
| 786 | | -asmlinkage long compat_sys_gettimeofday(struct compat_timeval __user *tv, |
|---|
| 684 | +asmlinkage long compat_sys_gettimeofday(struct old_timeval32 __user *tv, |
|---|
| 787 | 685 | struct timezone __user *tz); |
|---|
| 788 | | -asmlinkage long compat_sys_settimeofday(struct compat_timeval __user *tv, |
|---|
| 686 | +asmlinkage long compat_sys_settimeofday(struct old_timeval32 __user *tv, |
|---|
| 789 | 687 | struct timezone __user *tz); |
|---|
| 790 | | -asmlinkage long compat_sys_adjtimex(struct compat_timex __user *utp); |
|---|
| 791 | 688 | |
|---|
| 792 | 689 | /* kernel/timer.c */ |
|---|
| 793 | 690 | asmlinkage long compat_sys_sysinfo(struct compat_sysinfo __user *info); |
|---|
| .. | .. |
|---|
| 796 | 693 | asmlinkage long compat_sys_mq_open(const char __user *u_name, |
|---|
| 797 | 694 | int oflag, compat_mode_t mode, |
|---|
| 798 | 695 | struct compat_mq_attr __user *u_attr); |
|---|
| 799 | | -asmlinkage long compat_sys_mq_timedsend(mqd_t mqdes, |
|---|
| 800 | | - const char __user *u_msg_ptr, |
|---|
| 801 | | - compat_size_t msg_len, unsigned int msg_prio, |
|---|
| 802 | | - const struct compat_timespec __user *u_abs_timeout); |
|---|
| 803 | | -asmlinkage ssize_t compat_sys_mq_timedreceive(mqd_t mqdes, |
|---|
| 804 | | - char __user *u_msg_ptr, |
|---|
| 805 | | - compat_size_t msg_len, unsigned int __user *u_msg_prio, |
|---|
| 806 | | - const struct compat_timespec __user *u_abs_timeout); |
|---|
| 807 | 696 | asmlinkage long compat_sys_mq_notify(mqd_t mqdes, |
|---|
| 808 | 697 | const struct compat_sigevent __user *u_notification); |
|---|
| 809 | 698 | asmlinkage long compat_sys_mq_getsetattr(mqd_t mqdes, |
|---|
| .. | .. |
|---|
| 819 | 708 | |
|---|
| 820 | 709 | /* ipc/sem.c */ |
|---|
| 821 | 710 | asmlinkage long compat_sys_semctl(int semid, int semnum, int cmd, int arg); |
|---|
| 822 | | -asmlinkage long compat_sys_semtimedop(int semid, struct sembuf __user *tsems, |
|---|
| 823 | | - unsigned nsems, const struct compat_timespec __user *timeout); |
|---|
| 824 | 711 | |
|---|
| 825 | 712 | /* ipc/shm.c */ |
|---|
| 826 | 713 | asmlinkage long compat_sys_shmctl(int first, int second, void __user *uptr); |
|---|
| .. | .. |
|---|
| 830 | 717 | asmlinkage long compat_sys_recvfrom(int fd, void __user *buf, compat_size_t len, |
|---|
| 831 | 718 | unsigned flags, struct sockaddr __user *addr, |
|---|
| 832 | 719 | int __user *addrlen); |
|---|
| 833 | | -asmlinkage long compat_sys_setsockopt(int fd, int level, int optname, |
|---|
| 834 | | - char __user *optval, unsigned int optlen); |
|---|
| 835 | | -asmlinkage long compat_sys_getsockopt(int fd, int level, int optname, |
|---|
| 836 | | - char __user *optval, int __user *optlen); |
|---|
| 837 | 720 | asmlinkage long compat_sys_sendmsg(int fd, struct compat_msghdr __user *msg, |
|---|
| 838 | 721 | unsigned flags); |
|---|
| 839 | 722 | asmlinkage long compat_sys_recvmsg(int fd, struct compat_msghdr __user *msg, |
|---|
| .. | .. |
|---|
| 875 | 758 | asmlinkage long compat_sys_rt_tgsigqueueinfo(compat_pid_t tgid, |
|---|
| 876 | 759 | compat_pid_t pid, int sig, |
|---|
| 877 | 760 | struct compat_siginfo __user *uinfo); |
|---|
| 878 | | -asmlinkage long compat_sys_recvmmsg(int fd, struct compat_mmsghdr __user *mmsg, |
|---|
| 761 | +asmlinkage long compat_sys_recvmmsg_time64(int fd, struct compat_mmsghdr __user *mmsg, |
|---|
| 879 | 762 | unsigned vlen, unsigned int flags, |
|---|
| 880 | | - struct compat_timespec __user *timeout); |
|---|
| 763 | + struct __kernel_timespec __user *timeout); |
|---|
| 764 | +asmlinkage long compat_sys_recvmmsg_time32(int fd, struct compat_mmsghdr __user *mmsg, |
|---|
| 765 | + unsigned vlen, unsigned int flags, |
|---|
| 766 | + struct old_timespec32 __user *timeout); |
|---|
| 881 | 767 | asmlinkage long compat_sys_wait4(compat_pid_t pid, |
|---|
| 882 | 768 | compat_uint_t __user *stat_addr, int options, |
|---|
| 883 | 769 | struct compat_rusage __user *ru); |
|---|
| .. | .. |
|---|
| 886 | 772 | asmlinkage long compat_sys_open_by_handle_at(int mountdirfd, |
|---|
| 887 | 773 | struct file_handle __user *handle, |
|---|
| 888 | 774 | int flags); |
|---|
| 889 | | -asmlinkage long compat_sys_clock_adjtime(clockid_t which_clock, |
|---|
| 890 | | - struct compat_timex __user *tp); |
|---|
| 891 | 775 | asmlinkage long compat_sys_sendmmsg(int fd, struct compat_mmsghdr __user *mmsg, |
|---|
| 892 | 776 | unsigned vlen, unsigned int flags); |
|---|
| 893 | | -asmlinkage ssize_t compat_sys_process_vm_readv(compat_pid_t pid, |
|---|
| 894 | | - const struct compat_iovec __user *lvec, |
|---|
| 895 | | - compat_ulong_t liovcnt, const struct compat_iovec __user *rvec, |
|---|
| 896 | | - compat_ulong_t riovcnt, compat_ulong_t flags); |
|---|
| 897 | | -asmlinkage ssize_t compat_sys_process_vm_writev(compat_pid_t pid, |
|---|
| 898 | | - const struct compat_iovec __user *lvec, |
|---|
| 899 | | - compat_ulong_t liovcnt, const struct compat_iovec __user *rvec, |
|---|
| 900 | | - compat_ulong_t riovcnt, compat_ulong_t flags); |
|---|
| 901 | 777 | asmlinkage long compat_sys_execveat(int dfd, const char __user *filename, |
|---|
| 902 | 778 | const compat_uptr_t __user *argv, |
|---|
| 903 | 779 | const compat_uptr_t __user *envp, int flags); |
|---|
| 904 | 780 | asmlinkage ssize_t compat_sys_preadv2(compat_ulong_t fd, |
|---|
| 905 | | - const struct compat_iovec __user *vec, |
|---|
| 781 | + const struct iovec __user *vec, |
|---|
| 906 | 782 | compat_ulong_t vlen, u32 pos_low, u32 pos_high, rwf_t flags); |
|---|
| 907 | 783 | asmlinkage ssize_t compat_sys_pwritev2(compat_ulong_t fd, |
|---|
| 908 | | - const struct compat_iovec __user *vec, |
|---|
| 784 | + const struct iovec __user *vec, |
|---|
| 909 | 785 | compat_ulong_t vlen, u32 pos_low, u32 pos_high, rwf_t flags); |
|---|
| 910 | 786 | #ifdef __ARCH_WANT_COMPAT_SYS_PREADV64V2 |
|---|
| 911 | | -asmlinkage long compat_sys_readv64v2(unsigned long fd, |
|---|
| 912 | | - const struct compat_iovec __user *vec, |
|---|
| 787 | +asmlinkage long compat_sys_preadv64v2(unsigned long fd, |
|---|
| 788 | + const struct iovec __user *vec, |
|---|
| 913 | 789 | unsigned long vlen, loff_t pos, rwf_t flags); |
|---|
| 914 | 790 | #endif |
|---|
| 915 | 791 | |
|---|
| 916 | 792 | #ifdef __ARCH_WANT_COMPAT_SYS_PWRITEV64V2 |
|---|
| 917 | 793 | asmlinkage long compat_sys_pwritev64v2(unsigned long fd, |
|---|
| 918 | | - const struct compat_iovec __user *vec, |
|---|
| 794 | + const struct iovec __user *vec, |
|---|
| 919 | 795 | unsigned long vlen, loff_t pos, rwf_t flags); |
|---|
| 920 | 796 | #endif |
|---|
| 921 | 797 | |
|---|
| .. | .. |
|---|
| 928 | 804 | /* __ARCH_WANT_SYSCALL_NO_AT */ |
|---|
| 929 | 805 | asmlinkage long compat_sys_open(const char __user *filename, int flags, |
|---|
| 930 | 806 | umode_t mode); |
|---|
| 931 | | -asmlinkage long compat_sys_utimes(const char __user *filename, |
|---|
| 932 | | - struct compat_timeval __user *t); |
|---|
| 933 | 807 | |
|---|
| 934 | 808 | /* __ARCH_WANT_SYSCALL_NO_FLAGS */ |
|---|
| 935 | 809 | asmlinkage long compat_sys_signalfd(int ufd, |
|---|
| .. | .. |
|---|
| 943 | 817 | struct compat_stat __user *statbuf); |
|---|
| 944 | 818 | |
|---|
| 945 | 819 | /* __ARCH_WANT_SYSCALL_DEPRECATED */ |
|---|
| 946 | | -asmlinkage long compat_sys_time(compat_time_t __user *tloc); |
|---|
| 947 | | -asmlinkage long compat_sys_utime(const char __user *filename, |
|---|
| 948 | | - struct compat_utimbuf __user *t); |
|---|
| 949 | | -asmlinkage long compat_sys_futimesat(unsigned int dfd, |
|---|
| 950 | | - const char __user *filename, |
|---|
| 951 | | - struct compat_timeval __user *t); |
|---|
| 952 | 820 | asmlinkage long compat_sys_select(int n, compat_ulong_t __user *inp, |
|---|
| 953 | 821 | compat_ulong_t __user *outp, compat_ulong_t __user *exp, |
|---|
| 954 | | - struct compat_timeval __user *tvp); |
|---|
| 822 | + struct old_timeval32 __user *tvp); |
|---|
| 955 | 823 | asmlinkage long compat_sys_ustat(unsigned dev, struct compat_ustat __user *u32); |
|---|
| 956 | 824 | asmlinkage long compat_sys_recv(int fd, void __user *buf, compat_size_t len, |
|---|
| 957 | 825 | unsigned flags); |
|---|
| 958 | | -asmlinkage long compat_sys_sysctl(struct compat_sysctl_args __user *args); |
|---|
| 959 | 826 | |
|---|
| 960 | 827 | /* obsolete: fs/readdir.c */ |
|---|
| 961 | 828 | asmlinkage long compat_sys_old_readdir(unsigned int fd, |
|---|
| .. | .. |
|---|
| 983 | 850 | struct compat_old_sigaction __user *oact); |
|---|
| 984 | 851 | #endif |
|---|
| 985 | 852 | |
|---|
| 986 | | -/* obsolete: kernel/time/time.c */ |
|---|
| 987 | | -asmlinkage long compat_sys_stime(compat_time_t __user *tptr); |
|---|
| 988 | | - |
|---|
| 989 | 853 | /* obsolete: net/socket.c */ |
|---|
| 990 | 854 | asmlinkage long compat_sys_socketcall(int call, u32 __user *args); |
|---|
| 991 | 855 | |
|---|
| .. | .. |
|---|
| 1003 | 867 | #endif |
|---|
| 1004 | 868 | |
|---|
| 1005 | 869 | /** |
|---|
| 1006 | | - * ns_to_compat_timeval - Compat version of ns_to_timeval |
|---|
| 870 | + * ns_to_old_timeval32 - Compat version of ns_to_timeval |
|---|
| 1007 | 871 | * @nsec: the nanoseconds value to be converted |
|---|
| 1008 | 872 | * |
|---|
| 1009 | | - * Returns the compat_timeval representation of the nsec parameter. |
|---|
| 873 | + * Returns the old_timeval32 representation of the nsec parameter. |
|---|
| 1010 | 874 | */ |
|---|
| 1011 | | -static inline struct compat_timeval ns_to_compat_timeval(s64 nsec) |
|---|
| 875 | +static inline struct old_timeval32 ns_to_old_timeval32(s64 nsec) |
|---|
| 1012 | 876 | { |
|---|
| 1013 | | - struct timeval tv; |
|---|
| 1014 | | - struct compat_timeval ctv; |
|---|
| 877 | + struct __kernel_old_timeval tv; |
|---|
| 878 | + struct old_timeval32 ctv; |
|---|
| 1015 | 879 | |
|---|
| 1016 | | - tv = ns_to_timeval(nsec); |
|---|
| 880 | + tv = ns_to_kernel_old_timeval(nsec); |
|---|
| 1017 | 881 | ctv.tv_sec = tv.tv_sec; |
|---|
| 1018 | 882 | ctv.tv_usec = tv.tv_usec; |
|---|
| 1019 | 883 | |
|---|
| .. | .. |
|---|
| 1034 | 898 | #else /* !CONFIG_COMPAT */ |
|---|
| 1035 | 899 | |
|---|
| 1036 | 900 | #define is_compat_task() (0) |
|---|
| 1037 | | -#ifndef in_compat_syscall |
|---|
| 901 | +/* Ensure no one redefines in_compat_syscall() under !CONFIG_COMPAT */ |
|---|
| 902 | +#define in_compat_syscall in_compat_syscall |
|---|
| 1038 | 903 | static inline bool in_compat_syscall(void) { return false; } |
|---|
| 1039 | | -#endif |
|---|
| 1040 | 904 | |
|---|
| 1041 | 905 | #endif /* CONFIG_COMPAT */ |
|---|
| 1042 | 906 | |
|---|
| 907 | +/* |
|---|
| 908 | + * Some legacy ABIs like the i386 one use less than natural alignment for 64-bit |
|---|
| 909 | + * types, and will need special compat treatment for that. Most architectures |
|---|
| 910 | + * don't need that special handling even for compat syscalls. |
|---|
| 911 | + */ |
|---|
| 912 | +#ifndef compat_need_64bit_alignment_fixup |
|---|
| 913 | +#define compat_need_64bit_alignment_fixup() false |
|---|
| 914 | +#endif |
|---|
| 915 | + |
|---|
| 916 | +/* |
|---|
| 917 | + * A pointer passed in from user mode. This should not |
|---|
| 918 | + * be used for syscall parameters, just declare them |
|---|
| 919 | + * as pointers because the syscall entry code will have |
|---|
| 920 | + * appropriately converted them already. |
|---|
| 921 | + */ |
|---|
| 922 | +#ifndef compat_ptr |
|---|
| 923 | +static inline void __user *compat_ptr(compat_uptr_t uptr) |
|---|
| 924 | +{ |
|---|
| 925 | + return (void __user *)(unsigned long)uptr; |
|---|
| 926 | +} |
|---|
| 927 | +#endif |
|---|
| 928 | + |
|---|
| 929 | +static inline compat_uptr_t ptr_to_compat(void __user *uptr) |
|---|
| 930 | +{ |
|---|
| 931 | + return (u32)(unsigned long)uptr; |
|---|
| 932 | +} |
|---|
| 933 | + |
|---|
| 1043 | 934 | #endif /* _LINUX_COMPAT_H */ |
|---|