compat.c 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. /*
  2. * Copyright 2010 Tilera Corporation. All Rights Reserved.
  3. *
  4. * This program is free software; you can redistribute it and/or
  5. * modify it under the terms of the GNU General Public License
  6. * as published by the Free Software Foundation, version 2.
  7. *
  8. * This program is distributed in the hope that it will be useful, but
  9. * WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
  11. * NON INFRINGEMENT. See the GNU General Public License for
  12. * more details.
  13. */
  14. /* Adjust unistd.h to provide 32-bit numbers and functions. */
  15. #define __SYSCALL_COMPAT
  16. #include <linux/compat.h>
  17. #include <linux/syscalls.h>
  18. #include <linux/kdev_t.h>
  19. #include <linux/fs.h>
  20. #include <linux/fcntl.h>
  21. #include <linux/uaccess.h>
  22. #include <linux/signal.h>
  23. #include <asm/syscalls.h>
  24. /*
  25. * Syscalls that take 64-bit numbers traditionally take them in 32-bit
  26. * "high" and "low" value parts on 32-bit architectures.
  27. * In principle, one could imagine passing some register arguments as
  28. * fully 64-bit on TILE-Gx in 32-bit mode, but it seems easier to
  29. * adapt the usual convention.
  30. */
  31. COMPAT_SYSCALL_DEFINE4(truncate64, char __user *, filename, u32, dummy,
  32. u32, low, u32, high)
  33. {
  34. return sys_truncate(filename, ((loff_t)high << 32) | low);
  35. }
  36. COMPAT_SYSCALL_DEFINE4(ftruncate64, unsigned int, fd, u32, dummy,
  37. u32, low, u32, high)
  38. {
  39. return sys_ftruncate(fd, ((loff_t)high << 32) | low);
  40. }
  41. COMPAT_SYSCALL_DEFINE6(pread64, unsigned int, fd, char __user *, ubuf,
  42. size_t, count, u32, dummy, u32, low, u32, high)
  43. {
  44. return sys_pread64(fd, ubuf, count, ((loff_t)high << 32) | low);
  45. }
  46. COMPAT_SYSCALL_DEFINE6(pwrite64, unsigned int, fd, char __user *, ubuf,
  47. size_t, count, u32, dummy, u32, low, u32, high)
  48. {
  49. return sys_pwrite64(fd, ubuf, count, ((loff_t)high << 32) | low);
  50. }
  51. COMPAT_SYSCALL_DEFINE6(sync_file_range2, int, fd, unsigned int, flags,
  52. u32, offset_lo, u32, offset_hi,
  53. u32, nbytes_lo, u32, nbytes_hi)
  54. {
  55. return sys_sync_file_range(fd, ((loff_t)offset_hi << 32) | offset_lo,
  56. ((loff_t)nbytes_hi << 32) | nbytes_lo,
  57. flags);
  58. }
  59. COMPAT_SYSCALL_DEFINE6(fallocate, int, fd, int, mode,
  60. u32, offset_lo, u32, offset_hi,
  61. u32, len_lo, u32, len_hi)
  62. {
  63. return sys_fallocate(fd, mode, ((loff_t)offset_hi << 32) | offset_lo,
  64. ((loff_t)len_hi << 32) | len_lo);
  65. }
  66. /*
  67. * Avoid bug in generic sys_llseek() that specifies offset_high and
  68. * offset_low as "unsigned long", thus making it possible to pass
  69. * a sign-extended high 32 bits in offset_low.
  70. */
  71. COMPAT_SYSCALL_DEFINE5(llseek, unsigned int, fd, unsigned int, offset_high,
  72. unsigned int, offset_low, loff_t __user *, result,
  73. unsigned int, origin)
  74. {
  75. return sys_llseek(fd, offset_high, offset_low, result, origin);
  76. }
  77. /* Provide the compat syscall number to call mapping. */
  78. #undef __SYSCALL
  79. #define __SYSCALL(nr, call) [nr] = (call),
  80. /* See comments in sys.c */
  81. #define compat_sys_fadvise64_64 sys32_fadvise64_64
  82. #define compat_sys_readahead sys32_readahead
  83. #define sys_llseek compat_sys_llseek
  84. /* Call the assembly trampolines where necessary. */
  85. #define compat_sys_rt_sigreturn _compat_sys_rt_sigreturn
  86. #define sys_clone _sys_clone
  87. /*
  88. * Note that we can't include <linux/unistd.h> here since the header
  89. * guard will defeat us; <asm/unistd.h> checks for __SYSCALL as well.
  90. */
  91. void *compat_sys_call_table[__NR_syscalls] = {
  92. [0 ... __NR_syscalls-1] = sys_ni_syscall,
  93. #include <asm/unistd.h>
  94. };