sys32.S 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. /*
  2. * Compat system call wrappers
  3. *
  4. * Copyright (C) 2012 ARM Ltd.
  5. * Authors: Will Deacon <will.deacon@arm.com>
  6. * Catalin Marinas <catalin.marinas@arm.com>
  7. *
  8. * This program is free software; you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License version 2 as
  10. * published by the Free Software Foundation.
  11. *
  12. * This program is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  19. */
  20. #include <linux/linkage.h>
  21. #include <asm/assembler.h>
  22. #include <asm/asm-offsets.h>
  23. /*
  24. * System call wrappers for the AArch32 compatibility layer.
  25. */
  26. compat_sys_fork_wrapper:
  27. mov x0, sp
  28. b compat_sys_fork
  29. ENDPROC(compat_sys_fork_wrapper)
  30. compat_sys_vfork_wrapper:
  31. mov x0, sp
  32. b compat_sys_vfork
  33. ENDPROC(compat_sys_vfork_wrapper)
  34. compat_sys_execve_wrapper:
  35. mov x3, sp
  36. b compat_sys_execve
  37. ENDPROC(compat_sys_execve_wrapper)
  38. compat_sys_clone_wrapper:
  39. mov x5, sp
  40. b compat_sys_clone
  41. ENDPROC(compat_sys_clone_wrapper)
  42. compat_sys_sigreturn_wrapper:
  43. mov x0, sp
  44. mov x27, #0 // prevent syscall restart handling (why)
  45. b compat_sys_sigreturn
  46. ENDPROC(compat_sys_sigreturn_wrapper)
  47. compat_sys_rt_sigreturn_wrapper:
  48. mov x0, sp
  49. mov x27, #0 // prevent syscall restart handling (why)
  50. b compat_sys_rt_sigreturn
  51. ENDPROC(compat_sys_rt_sigreturn_wrapper)
  52. compat_sys_sigaltstack_wrapper:
  53. ldr x2, [sp, #S_COMPAT_SP]
  54. b compat_do_sigaltstack
  55. ENDPROC(compat_sys_sigaltstack_wrapper)
  56. compat_sys_statfs64_wrapper:
  57. mov w3, #84
  58. cmp w1, #88
  59. csel w1, w3, w1, eq
  60. b compat_sys_statfs64
  61. ENDPROC(compat_sys_statfs64_wrapper)
  62. compat_sys_fstatfs64_wrapper:
  63. mov w3, #84
  64. cmp w1, #88
  65. csel w1, w3, w1, eq
  66. b compat_sys_fstatfs64
  67. ENDPROC(compat_sys_fstatfs64_wrapper)
  68. /*
  69. * Wrappers for AArch32 syscalls that either take 64-bit parameters
  70. * in registers or that take 32-bit parameters which require sign
  71. * extension.
  72. */
  73. compat_sys_lseek_wrapper:
  74. sxtw x1, w1
  75. b sys_lseek
  76. ENDPROC(compat_sys_lseek_wrapper)
  77. compat_sys_pread64_wrapper:
  78. orr x3, x4, x5, lsl #32
  79. b sys_pread64
  80. ENDPROC(compat_sys_pread64_wrapper)
  81. compat_sys_pwrite64_wrapper:
  82. orr x3, x4, x5, lsl #32
  83. b sys_pwrite64
  84. ENDPROC(compat_sys_pwrite64_wrapper)
  85. compat_sys_truncate64_wrapper:
  86. orr x1, x2, x3, lsl #32
  87. b sys_truncate
  88. ENDPROC(compat_sys_truncate64_wrapper)
  89. compat_sys_ftruncate64_wrapper:
  90. orr x1, x2, x3, lsl #32
  91. b sys_ftruncate
  92. ENDPROC(compat_sys_ftruncate64_wrapper)
  93. compat_sys_readahead_wrapper:
  94. orr x1, x2, x3, lsl #32
  95. mov w2, w4
  96. b sys_readahead
  97. ENDPROC(compat_sys_readahead_wrapper)
  98. compat_sys_lookup_dcookie:
  99. orr x0, x0, x1, lsl #32
  100. mov w1, w2
  101. mov w2, w3
  102. b sys_lookup_dcookie
  103. ENDPROC(compat_sys_lookup_dcookie)
  104. compat_sys_fadvise64_64_wrapper:
  105. mov w6, w1
  106. orr x1, x2, x3, lsl #32
  107. orr x2, x4, x5, lsl #32
  108. mov w3, w6
  109. b sys_fadvise64_64
  110. ENDPROC(compat_sys_fadvise64_64_wrapper)
  111. compat_sys_sync_file_range2_wrapper:
  112. orr x2, x2, x3, lsl #32
  113. orr x3, x4, x5, lsl #32
  114. b sys_sync_file_range2
  115. ENDPROC(compat_sys_sync_file_range2_wrapper)
  116. compat_sys_fallocate_wrapper:
  117. orr x2, x2, x3, lsl #32
  118. orr x3, x4, x5, lsl #32
  119. b sys_fallocate
  120. ENDPROC(compat_sys_fallocate_wrapper)
  121. compat_sys_fanotify_mark_wrapper:
  122. orr x2, x2, x3, lsl #32
  123. mov w3, w4
  124. mov w4, w5
  125. b sys_fanotify_mark
  126. ENDPROC(compat_sys_fanotify_mark_wrapper)
  127. #undef __SYSCALL
  128. #define __SYSCALL(x, y) .quad y // x
  129. /*
  130. * The system calls table must be 4KB aligned.
  131. */
  132. .align 12
  133. ENTRY(compat_sys_call_table)
  134. #include <asm/unistd32.h>