polyphony 0.85 → 0.86

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (230) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +4 -0
  3. data/Gemfile.lock +1 -1
  4. data/ext/polyphony/io_extensions.c +2 -3
  5. data/lib/polyphony/version.rb +1 -1
  6. data/polyphony.gemspec +1 -1
  7. data/test/test_backend.rb +1 -1
  8. data/test/test_signal.rb +3 -3
  9. data/vendor/liburing/.github/pull_request_template.md +86 -0
  10. data/vendor/liburing/.github/workflows/build.yml +85 -0
  11. data/vendor/liburing/.github/workflows/shellcheck.yml +20 -0
  12. data/vendor/liburing/.gitignore +149 -0
  13. data/vendor/liburing/COPYING +502 -0
  14. data/vendor/liburing/COPYING.GPL +339 -0
  15. data/vendor/liburing/LICENSE +7 -0
  16. data/vendor/liburing/Makefile +82 -0
  17. data/vendor/liburing/Makefile.common +5 -0
  18. data/vendor/liburing/Makefile.quiet +11 -0
  19. data/vendor/liburing/README +46 -0
  20. data/vendor/liburing/configure +486 -0
  21. data/vendor/liburing/debian/README.Debian +7 -0
  22. data/vendor/liburing/debian/changelog +27 -0
  23. data/vendor/liburing/debian/compat +1 -0
  24. data/vendor/liburing/debian/control +48 -0
  25. data/vendor/liburing/debian/copyright +49 -0
  26. data/vendor/liburing/debian/liburing-dev.install +4 -0
  27. data/vendor/liburing/debian/liburing-dev.manpages +6 -0
  28. data/vendor/liburing/debian/liburing1-udeb.install +1 -0
  29. data/vendor/liburing/debian/liburing1.install +1 -0
  30. data/vendor/liburing/debian/liburing1.symbols +32 -0
  31. data/vendor/liburing/debian/patches/series +1 -0
  32. data/vendor/liburing/debian/rules +81 -0
  33. data/vendor/liburing/debian/source/format +1 -0
  34. data/vendor/liburing/debian/source/local-options +2 -0
  35. data/vendor/liburing/debian/source/options +1 -0
  36. data/vendor/liburing/debian/watch +3 -0
  37. data/vendor/liburing/examples/Makefile +38 -0
  38. data/vendor/liburing/examples/io_uring-cp.c +282 -0
  39. data/vendor/liburing/examples/io_uring-test.c +112 -0
  40. data/vendor/liburing/examples/link-cp.c +193 -0
  41. data/vendor/liburing/examples/ucontext-cp.c +273 -0
  42. data/vendor/liburing/liburing.pc.in +12 -0
  43. data/vendor/liburing/liburing.spec +66 -0
  44. data/vendor/liburing/make-debs.sh +53 -0
  45. data/vendor/liburing/man/io_uring.7 +754 -0
  46. data/vendor/liburing/man/io_uring_cq_advance.3 +35 -0
  47. data/vendor/liburing/man/io_uring_cq_ready.3 +25 -0
  48. data/vendor/liburing/man/io_uring_cqe_get_data.3 +34 -0
  49. data/vendor/liburing/man/io_uring_cqe_seen.3 +32 -0
  50. data/vendor/liburing/man/io_uring_enter.2 +1483 -0
  51. data/vendor/liburing/man/io_uring_free_probe.3 +24 -0
  52. data/vendor/liburing/man/io_uring_get_probe.3 +29 -0
  53. data/vendor/liburing/man/io_uring_get_sqe.3 +38 -0
  54. data/vendor/liburing/man/io_uring_opcode_supported.3 +29 -0
  55. data/vendor/liburing/man/io_uring_prep_msg_ring.3 +58 -0
  56. data/vendor/liburing/man/io_uring_prep_read.3 +50 -0
  57. data/vendor/liburing/man/io_uring_prep_read_fixed.3 +54 -0
  58. data/vendor/liburing/man/io_uring_prep_readv.3 +51 -0
  59. data/vendor/liburing/man/io_uring_prep_readv2.3 +79 -0
  60. data/vendor/liburing/man/io_uring_prep_write.3 +50 -0
  61. data/vendor/liburing/man/io_uring_prep_write_fixed.3 +54 -0
  62. data/vendor/liburing/man/io_uring_prep_writev.3 +51 -0
  63. data/vendor/liburing/man/io_uring_prep_writev2.3 +78 -0
  64. data/vendor/liburing/man/io_uring_queue_exit.3 +27 -0
  65. data/vendor/liburing/man/io_uring_queue_init.3 +44 -0
  66. data/vendor/liburing/man/io_uring_register.2 +688 -0
  67. data/vendor/liburing/man/io_uring_register_buffers.3 +41 -0
  68. data/vendor/liburing/man/io_uring_register_files.3 +35 -0
  69. data/vendor/liburing/man/io_uring_setup.2 +534 -0
  70. data/vendor/liburing/man/io_uring_sq_ready.3 +25 -0
  71. data/vendor/liburing/man/io_uring_sq_space_left.3 +25 -0
  72. data/vendor/liburing/man/io_uring_sqe_set_data.3 +30 -0
  73. data/vendor/liburing/man/io_uring_sqe_set_flags.3 +60 -0
  74. data/vendor/liburing/man/io_uring_sqring_wait.3 +30 -0
  75. data/vendor/liburing/man/io_uring_submit.3 +29 -0
  76. data/vendor/liburing/man/io_uring_submit_and_wait.3 +34 -0
  77. data/vendor/liburing/man/io_uring_submit_and_wait_timeout.3 +49 -0
  78. data/vendor/liburing/man/io_uring_unregister_buffers.3 +26 -0
  79. data/vendor/liburing/man/io_uring_unregister_files.3 +26 -0
  80. data/vendor/liburing/man/io_uring_wait_cqe.3 +33 -0
  81. data/vendor/liburing/man/io_uring_wait_cqe_nr.3 +36 -0
  82. data/vendor/liburing/man/io_uring_wait_cqe_timeout.3 +39 -0
  83. data/vendor/liburing/man/io_uring_wait_cqes.3 +46 -0
  84. data/vendor/liburing/src/Makefile +89 -0
  85. data/vendor/liburing/src/arch/aarch64/syscall.h +95 -0
  86. data/vendor/liburing/src/arch/generic/lib.h +21 -0
  87. data/vendor/liburing/src/arch/generic/syscall.h +87 -0
  88. data/vendor/liburing/src/arch/syscall-defs.h +67 -0
  89. data/vendor/liburing/src/arch/x86/lib.h +32 -0
  90. data/vendor/liburing/src/arch/x86/syscall.h +160 -0
  91. data/vendor/liburing/src/include/liburing/barrier.h +81 -0
  92. data/vendor/liburing/src/include/liburing/io_uring.h +442 -0
  93. data/vendor/liburing/src/include/liburing.h +921 -0
  94. data/vendor/liburing/src/int_flags.h +8 -0
  95. data/vendor/liburing/src/lib.h +57 -0
  96. data/vendor/liburing/src/liburing.map +53 -0
  97. data/vendor/liburing/src/nolibc.c +48 -0
  98. data/vendor/liburing/src/queue.c +403 -0
  99. data/vendor/liburing/src/register.c +293 -0
  100. data/vendor/liburing/src/setup.c +332 -0
  101. data/vendor/liburing/src/syscall.c +47 -0
  102. data/vendor/liburing/src/syscall.h +103 -0
  103. data/vendor/liburing/test/232c93d07b74-test.c +306 -0
  104. data/vendor/liburing/test/35fa71a030ca-test.c +329 -0
  105. data/vendor/liburing/test/500f9fbadef8-test.c +89 -0
  106. data/vendor/liburing/test/7ad0e4b2f83c-test.c +93 -0
  107. data/vendor/liburing/test/8a9973408177-test.c +106 -0
  108. data/vendor/liburing/test/917257daa0fe-test.c +53 -0
  109. data/vendor/liburing/test/Makefile +244 -0
  110. data/vendor/liburing/test/a0908ae19763-test.c +58 -0
  111. data/vendor/liburing/test/a4c0b3decb33-test.c +180 -0
  112. data/vendor/liburing/test/accept-link.c +254 -0
  113. data/vendor/liburing/test/accept-reuse.c +164 -0
  114. data/vendor/liburing/test/accept-test.c +79 -0
  115. data/vendor/liburing/test/accept.c +477 -0
  116. data/vendor/liburing/test/across-fork.c +283 -0
  117. data/vendor/liburing/test/b19062a56726-test.c +53 -0
  118. data/vendor/liburing/test/b5837bd5311d-test.c +77 -0
  119. data/vendor/liburing/test/ce593a6c480a-test.c +136 -0
  120. data/vendor/liburing/test/close-opath.c +122 -0
  121. data/vendor/liburing/test/config +10 -0
  122. data/vendor/liburing/test/connect.c +398 -0
  123. data/vendor/liburing/test/cq-full.c +96 -0
  124. data/vendor/liburing/test/cq-overflow.c +294 -0
  125. data/vendor/liburing/test/cq-peek-batch.c +102 -0
  126. data/vendor/liburing/test/cq-ready.c +94 -0
  127. data/vendor/liburing/test/cq-size.c +64 -0
  128. data/vendor/liburing/test/d4ae271dfaae-test.c +96 -0
  129. data/vendor/liburing/test/d77a67ed5f27-test.c +65 -0
  130. data/vendor/liburing/test/defer.c +307 -0
  131. data/vendor/liburing/test/double-poll-crash.c +185 -0
  132. data/vendor/liburing/test/drop-submit.c +92 -0
  133. data/vendor/liburing/test/eeed8b54e0df-test.c +114 -0
  134. data/vendor/liburing/test/empty-eownerdead.c +45 -0
  135. data/vendor/liburing/test/eventfd-disable.c +151 -0
  136. data/vendor/liburing/test/eventfd-reg.c +76 -0
  137. data/vendor/liburing/test/eventfd-ring.c +97 -0
  138. data/vendor/liburing/test/eventfd.c +112 -0
  139. data/vendor/liburing/test/exec-target.c +6 -0
  140. data/vendor/liburing/test/exit-no-cleanup.c +117 -0
  141. data/vendor/liburing/test/fadvise.c +202 -0
  142. data/vendor/liburing/test/fallocate.c +249 -0
  143. data/vendor/liburing/test/fc2a85cb02ef-test.c +131 -0
  144. data/vendor/liburing/test/file-register.c +858 -0
  145. data/vendor/liburing/test/file-update.c +173 -0
  146. data/vendor/liburing/test/file-verify.c +629 -0
  147. data/vendor/liburing/test/files-exit-hang-poll.c +128 -0
  148. data/vendor/liburing/test/files-exit-hang-timeout.c +134 -0
  149. data/vendor/liburing/test/fixed-link.c +90 -0
  150. data/vendor/liburing/test/fpos.c +252 -0
  151. data/vendor/liburing/test/fsync.c +224 -0
  152. data/vendor/liburing/test/hardlink.c +136 -0
  153. data/vendor/liburing/test/helpers.c +135 -0
  154. data/vendor/liburing/test/helpers.h +67 -0
  155. data/vendor/liburing/test/io-cancel.c +550 -0
  156. data/vendor/liburing/test/io_uring_enter.c +296 -0
  157. data/vendor/liburing/test/io_uring_register.c +676 -0
  158. data/vendor/liburing/test/io_uring_setup.c +192 -0
  159. data/vendor/liburing/test/iopoll.c +372 -0
  160. data/vendor/liburing/test/lfs-openat-write.c +119 -0
  161. data/vendor/liburing/test/lfs-openat.c +275 -0
  162. data/vendor/liburing/test/link-timeout.c +1107 -0
  163. data/vendor/liburing/test/link.c +496 -0
  164. data/vendor/liburing/test/link_drain.c +229 -0
  165. data/vendor/liburing/test/madvise.c +195 -0
  166. data/vendor/liburing/test/mkdir.c +108 -0
  167. data/vendor/liburing/test/msg-ring.c +234 -0
  168. data/vendor/liburing/test/multicqes_drain.c +387 -0
  169. data/vendor/liburing/test/nop-all-sizes.c +99 -0
  170. data/vendor/liburing/test/nop.c +115 -0
  171. data/vendor/liburing/test/open-close.c +261 -0
  172. data/vendor/liburing/test/openat2.c +308 -0
  173. data/vendor/liburing/test/personality.c +204 -0
  174. data/vendor/liburing/test/pipe-eof.c +83 -0
  175. data/vendor/liburing/test/pipe-reuse.c +105 -0
  176. data/vendor/liburing/test/poll-cancel-ton.c +135 -0
  177. data/vendor/liburing/test/poll-cancel.c +228 -0
  178. data/vendor/liburing/test/poll-link.c +230 -0
  179. data/vendor/liburing/test/poll-many.c +208 -0
  180. data/vendor/liburing/test/poll-mshot-update.c +273 -0
  181. data/vendor/liburing/test/poll-ring.c +48 -0
  182. data/vendor/liburing/test/poll-v-poll.c +353 -0
  183. data/vendor/liburing/test/poll.c +109 -0
  184. data/vendor/liburing/test/pollfree.c +426 -0
  185. data/vendor/liburing/test/probe.c +135 -0
  186. data/vendor/liburing/test/read-write.c +876 -0
  187. data/vendor/liburing/test/register-restrictions.c +633 -0
  188. data/vendor/liburing/test/rename.c +135 -0
  189. data/vendor/liburing/test/ring-leak.c +173 -0
  190. data/vendor/liburing/test/ring-leak2.c +249 -0
  191. data/vendor/liburing/test/rsrc_tags.c +449 -0
  192. data/vendor/liburing/test/runtests-loop.sh +16 -0
  193. data/vendor/liburing/test/runtests.sh +170 -0
  194. data/vendor/liburing/test/rw_merge_test.c +97 -0
  195. data/vendor/liburing/test/self.c +91 -0
  196. data/vendor/liburing/test/send_recv.c +286 -0
  197. data/vendor/liburing/test/send_recvmsg.c +345 -0
  198. data/vendor/liburing/test/sendmsg_fs_cve.c +200 -0
  199. data/vendor/liburing/test/shared-wq.c +84 -0
  200. data/vendor/liburing/test/short-read.c +75 -0
  201. data/vendor/liburing/test/shutdown.c +165 -0
  202. data/vendor/liburing/test/sigfd-deadlock.c +74 -0
  203. data/vendor/liburing/test/skip-cqe.c +429 -0
  204. data/vendor/liburing/test/socket-rw-eagain.c +158 -0
  205. data/vendor/liburing/test/socket-rw-offset.c +157 -0
  206. data/vendor/liburing/test/socket-rw.c +145 -0
  207. data/vendor/liburing/test/splice.c +512 -0
  208. data/vendor/liburing/test/sq-full-cpp.cc +45 -0
  209. data/vendor/liburing/test/sq-full.c +45 -0
  210. data/vendor/liburing/test/sq-poll-dup.c +204 -0
  211. data/vendor/liburing/test/sq-poll-kthread.c +169 -0
  212. data/vendor/liburing/test/sq-poll-share.c +137 -0
  213. data/vendor/liburing/test/sq-space_left.c +159 -0
  214. data/vendor/liburing/test/sqpoll-cancel-hang.c +157 -0
  215. data/vendor/liburing/test/sqpoll-disable-exit.c +196 -0
  216. data/vendor/liburing/test/sqpoll-exit-hang.c +78 -0
  217. data/vendor/liburing/test/sqpoll-sleep.c +69 -0
  218. data/vendor/liburing/test/statx.c +172 -0
  219. data/vendor/liburing/test/stdout.c +232 -0
  220. data/vendor/liburing/test/submit-link-fail.c +154 -0
  221. data/vendor/liburing/test/submit-reuse.c +239 -0
  222. data/vendor/liburing/test/symlink.c +116 -0
  223. data/vendor/liburing/test/teardowns.c +58 -0
  224. data/vendor/liburing/test/thread-exit.c +143 -0
  225. data/vendor/liburing/test/timeout-new.c +252 -0
  226. data/vendor/liburing/test/timeout-overflow.c +204 -0
  227. data/vendor/liburing/test/timeout.c +1523 -0
  228. data/vendor/liburing/test/unlink.c +112 -0
  229. data/vendor/liburing/test/wakeup-hang.c +162 -0
  230. metadata +223 -2
@@ -0,0 +1,87 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+
3
+ #ifndef __INTERNAL__LIBURING_SYSCALL_H
4
+ #error "This file should be included from src/syscall.h (liburing)"
5
+ #endif
6
+
7
+ #ifndef LIBURING_ARCH_GENERIC_SYSCALL_H
8
+ #define LIBURING_ARCH_GENERIC_SYSCALL_H
9
+
10
+ static inline int ____sys_io_uring_register(int fd, unsigned opcode,
11
+ const void *arg, unsigned nr_args)
12
+ {
13
+ int ret;
14
+ ret = syscall(__NR_io_uring_register, fd, opcode, arg, nr_args);
15
+ return (ret < 0) ? -errno : ret;
16
+ }
17
+
18
+ static inline int ____sys_io_uring_setup(unsigned entries,
19
+ struct io_uring_params *p)
20
+ {
21
+ int ret;
22
+ ret = syscall(__NR_io_uring_setup, entries, p);
23
+ return (ret < 0) ? -errno : ret;
24
+ }
25
+
26
+ static inline int ____sys_io_uring_enter2(int fd, unsigned to_submit,
27
+ unsigned min_complete, unsigned flags,
28
+ sigset_t *sig, int sz)
29
+ {
30
+ int ret;
31
+ ret = syscall(__NR_io_uring_enter, fd, to_submit, min_complete, flags,
32
+ sig, sz);
33
+ return (ret < 0) ? -errno : ret;
34
+ }
35
+
36
+ static inline int ____sys_io_uring_enter(int fd, unsigned to_submit,
37
+ unsigned min_complete, unsigned flags,
38
+ sigset_t *sig)
39
+ {
40
+ return ____sys_io_uring_enter2(fd, to_submit, min_complete, flags, sig,
41
+ _NSIG / 8);
42
+ }
43
+
44
+ static inline void *__sys_mmap(void *addr, size_t length, int prot, int flags,
45
+ int fd, off_t offset)
46
+ {
47
+ void *ret;
48
+ ret = mmap(addr, length, prot, flags, fd, offset);
49
+ return (ret == MAP_FAILED) ? ERR_PTR(-errno) : ret;
50
+ }
51
+
52
+ static inline int __sys_munmap(void *addr, size_t length)
53
+ {
54
+ int ret;
55
+ ret = munmap(addr, length);
56
+ return (ret < 0) ? -errno : ret;
57
+ }
58
+
59
+ static inline int __sys_madvise(void *addr, size_t length, int advice)
60
+ {
61
+ int ret;
62
+ ret = madvise(addr, length, advice);
63
+ return (ret < 0) ? -errno : ret;
64
+ }
65
+
66
+ static inline int __sys_getrlimit(int resource, struct rlimit *rlim)
67
+ {
68
+ int ret;
69
+ ret = getrlimit(resource, rlim);
70
+ return (ret < 0) ? -errno : ret;
71
+ }
72
+
73
+ static inline int __sys_setrlimit(int resource, const struct rlimit *rlim)
74
+ {
75
+ int ret;
76
+ ret = setrlimit(resource, rlim);
77
+ return (ret < 0) ? -errno : ret;
78
+ }
79
+
80
+ static inline int __sys_close(int fd)
81
+ {
82
+ int ret;
83
+ ret = close(fd);
84
+ return (ret < 0) ? -errno : ret;
85
+ }
86
+
87
+ #endif /* #ifndef LIBURING_ARCH_GENERIC_SYSCALL_H */
@@ -0,0 +1,67 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+
3
+ #ifndef LIBURING_ARCH_SYSCALL_DEFS_H
4
+ #define LIBURING_ARCH_SYSCALL_DEFS_H
5
+
6
+ static inline void *__sys_mmap(void *addr, size_t length, int prot, int flags,
7
+ int fd, off_t offset)
8
+ {
9
+ return (void *) __do_syscall6(__NR_mmap, addr, length, prot, flags, fd,
10
+ offset);
11
+ }
12
+
13
+ static inline int __sys_munmap(void *addr, size_t length)
14
+ {
15
+ return (int) __do_syscall2(__NR_munmap, addr, length);
16
+ }
17
+
18
+ static inline int __sys_madvise(void *addr, size_t length, int advice)
19
+ {
20
+ return (int) __do_syscall3(__NR_madvise, addr, length, advice);
21
+ }
22
+
23
+ static inline int __sys_getrlimit(int resource, struct rlimit *rlim)
24
+ {
25
+ return (int) __do_syscall2(__NR_getrlimit, resource, rlim);
26
+ }
27
+
28
+ static inline int __sys_setrlimit(int resource, const struct rlimit *rlim)
29
+ {
30
+ return (int) __do_syscall2(__NR_setrlimit, resource, rlim);
31
+ }
32
+
33
+ static inline int __sys_close(int fd)
34
+ {
35
+ return (int) __do_syscall1(__NR_close, fd);
36
+ }
37
+
38
+ static inline int ____sys_io_uring_register(int fd, unsigned opcode,
39
+ const void *arg, unsigned nr_args)
40
+ {
41
+ return (int) __do_syscall4(__NR_io_uring_register, fd, opcode, arg,
42
+ nr_args);
43
+ }
44
+
45
+ static inline int ____sys_io_uring_setup(unsigned entries,
46
+ struct io_uring_params *p)
47
+ {
48
+ return (int) __do_syscall2(__NR_io_uring_setup, entries, p);
49
+ }
50
+
51
+ static inline int ____sys_io_uring_enter2(int fd, unsigned to_submit,
52
+ unsigned min_complete, unsigned flags,
53
+ sigset_t *sig, int sz)
54
+ {
55
+ return (int) __do_syscall6(__NR_io_uring_enter, fd, to_submit,
56
+ min_complete, flags, sig, sz);
57
+ }
58
+
59
+ static inline int ____sys_io_uring_enter(int fd, unsigned to_submit,
60
+ unsigned min_complete, unsigned flags,
61
+ sigset_t *sig)
62
+ {
63
+ return ____sys_io_uring_enter2(fd, to_submit, min_complete, flags, sig,
64
+ _NSIG / 8);
65
+ }
66
+
67
+ #endif
@@ -0,0 +1,32 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+
3
+ #ifndef __INTERNAL__LIBURING_LIB_H
4
+ #error "This file should be included from src/lib.h (liburing)"
5
+ #endif
6
+
7
+ #ifndef LIBURING_ARCH_X86_LIB_H
8
+ #define LIBURING_ARCH_X86_LIB_H
9
+
10
+ #if defined(__x86_64__)
11
+
12
+ static inline long get_page_size(void)
13
+ {
14
+ return 4096;
15
+ }
16
+
17
+ #else /* #if defined(__x86_64__) */
18
+
19
+ /*
20
+ * For x86 (32-bit), fallback to libc wrapper.
21
+ * We can't use CONFIG_NOLIBC for x86 (32-bit) at the moment.
22
+ *
23
+ * TODO: Add x86 (32-bit) nolibc support.
24
+ */
25
+ #ifdef CONFIG_NOLIBC
26
+ #error "x86 (32-bit) is currently not supported for nolibc builds"
27
+ #endif
28
+ #include "../generic/lib.h"
29
+
30
+ #endif /* #if defined(__x86_64__) */
31
+
32
+ #endif /* #ifndef LIBURING_ARCH_X86_LIB_H */
@@ -0,0 +1,160 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+
3
+ #ifndef __INTERNAL__LIBURING_SYSCALL_H
4
+ #error "This file should be included from src/syscall.h (liburing)"
5
+ #endif
6
+
7
+ #ifndef LIBURING_ARCH_X86_SYSCALL_H
8
+ #define LIBURING_ARCH_X86_SYSCALL_H
9
+
10
+ #if defined(__x86_64__)
11
+ /**
12
+ * Note for syscall registers usage (x86-64):
13
+ * - %rax is the syscall number.
14
+ * - %rax is also the return value.
15
+ * - %rdi is the 1st argument.
16
+ * - %rsi is the 2nd argument.
17
+ * - %rdx is the 3rd argument.
18
+ * - %r10 is the 4th argument (**yes it's %r10, not %rcx!**).
19
+ * - %r8 is the 5th argument.
20
+ * - %r9 is the 6th argument.
21
+ *
22
+ * `syscall` instruction will clobber %r11 and %rcx.
23
+ *
24
+ * After the syscall returns to userspace:
25
+ * - %r11 will contain %rflags.
26
+ * - %rcx will contain the return address.
27
+ *
28
+ * IOW, after the syscall returns to userspace:
29
+ * %r11 == %rflags and %rcx == %rip.
30
+ */
31
+
32
+ #define __do_syscall0(NUM) ({ \
33
+ intptr_t rax; \
34
+ \
35
+ __asm__ volatile( \
36
+ "syscall" \
37
+ : "=a"(rax) /* %rax */ \
38
+ : "a"(NUM) /* %rax */ \
39
+ : "rcx", "r11", "memory" \
40
+ ); \
41
+ rax; \
42
+ })
43
+
44
+ #define __do_syscall1(NUM, ARG1) ({ \
45
+ intptr_t rax; \
46
+ \
47
+ __asm__ volatile( \
48
+ "syscall" \
49
+ : "=a"(rax) /* %rax */ \
50
+ : "a"((NUM)), /* %rax */ \
51
+ "D"((ARG1)) /* %rdi */ \
52
+ : "rcx", "r11", "memory" \
53
+ ); \
54
+ rax; \
55
+ })
56
+
57
+ #define __do_syscall2(NUM, ARG1, ARG2) ({ \
58
+ intptr_t rax; \
59
+ \
60
+ __asm__ volatile( \
61
+ "syscall" \
62
+ : "=a"(rax) /* %rax */ \
63
+ : "a"((NUM)), /* %rax */ \
64
+ "D"((ARG1)), /* %rdi */ \
65
+ "S"((ARG2)) /* %rsi */ \
66
+ : "rcx", "r11", "memory" \
67
+ ); \
68
+ rax; \
69
+ })
70
+
71
+ #define __do_syscall3(NUM, ARG1, ARG2, ARG3) ({ \
72
+ intptr_t rax; \
73
+ \
74
+ __asm__ volatile( \
75
+ "syscall" \
76
+ : "=a"(rax) /* %rax */ \
77
+ : "a"((NUM)), /* %rax */ \
78
+ "D"((ARG1)), /* %rdi */ \
79
+ "S"((ARG2)), /* %rsi */ \
80
+ "d"((ARG3)) /* %rdx */ \
81
+ : "rcx", "r11", "memory" \
82
+ ); \
83
+ rax; \
84
+ })
85
+
86
+ #define __do_syscall4(NUM, ARG1, ARG2, ARG3, ARG4) ({ \
87
+ intptr_t rax; \
88
+ register __typeof__(ARG4) __r10 __asm__("r10") = (ARG4); \
89
+ \
90
+ __asm__ volatile( \
91
+ "syscall" \
92
+ : "=a"(rax) /* %rax */ \
93
+ : "a"((NUM)), /* %rax */ \
94
+ "D"((ARG1)), /* %rdi */ \
95
+ "S"((ARG2)), /* %rsi */ \
96
+ "d"((ARG3)), /* %rdx */ \
97
+ "r"(__r10) /* %r10 */ \
98
+ : "rcx", "r11", "memory" \
99
+ ); \
100
+ rax; \
101
+ })
102
+
103
+ #define __do_syscall5(NUM, ARG1, ARG2, ARG3, ARG4, ARG5) ({ \
104
+ intptr_t rax; \
105
+ register __typeof__(ARG4) __r10 __asm__("r10") = (ARG4); \
106
+ register __typeof__(ARG5) __r8 __asm__("r8") = (ARG5); \
107
+ \
108
+ __asm__ volatile( \
109
+ "syscall" \
110
+ : "=a"(rax) /* %rax */ \
111
+ : "a"((NUM)), /* %rax */ \
112
+ "D"((ARG1)), /* %rdi */ \
113
+ "S"((ARG2)), /* %rsi */ \
114
+ "d"((ARG3)), /* %rdx */ \
115
+ "r"(__r10), /* %r10 */ \
116
+ "r"(__r8) /* %r8 */ \
117
+ : "rcx", "r11", "memory" \
118
+ ); \
119
+ rax; \
120
+ })
121
+
122
+ #define __do_syscall6(NUM, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6) ({ \
123
+ intptr_t rax; \
124
+ register __typeof__(ARG4) __r10 __asm__("r10") = (ARG4); \
125
+ register __typeof__(ARG5) __r8 __asm__("r8") = (ARG5); \
126
+ register __typeof__(ARG6) __r9 __asm__("r9") = (ARG6); \
127
+ \
128
+ __asm__ volatile( \
129
+ "syscall" \
130
+ : "=a"(rax) /* %rax */ \
131
+ : "a"((NUM)), /* %rax */ \
132
+ "D"((ARG1)), /* %rdi */ \
133
+ "S"((ARG2)), /* %rsi */ \
134
+ "d"((ARG3)), /* %rdx */ \
135
+ "r"(__r10), /* %r10 */ \
136
+ "r"(__r8), /* %r8 */ \
137
+ "r"(__r9) /* %r9 */ \
138
+ : "rcx", "r11", "memory" \
139
+ ); \
140
+ rax; \
141
+ })
142
+
143
+ #include "../syscall-defs.h"
144
+
145
+ #else /* #if defined(__x86_64__) */
146
+
147
+ /*
148
+ * For x86 (32-bit), fallback to libc wrapper.
149
+ * We can't use CONFIG_NOLIBC for x86 (32-bit) at the moment.
150
+ *
151
+ * TODO: Add x86 (32-bit) nolibc support.
152
+ */
153
+ #ifdef CONFIG_NOLIBC
154
+ #error "x86 (32-bit) is currently not supported for nolibc builds"
155
+ #endif
156
+ #include "../generic/syscall.h"
157
+
158
+ #endif /* #if defined(__x86_64__) */
159
+
160
+ #endif /* #ifndef LIBURING_ARCH_X86_SYSCALL_H */
@@ -0,0 +1,81 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ #ifndef LIBURING_BARRIER_H
3
+ #define LIBURING_BARRIER_H
4
+
5
+ /*
6
+ From the kernel documentation file refcount-vs-atomic.rst:
7
+
8
+ A RELEASE memory ordering guarantees that all prior loads and
9
+ stores (all po-earlier instructions) on the same CPU are completed
10
+ before the operation. It also guarantees that all po-earlier
11
+ stores on the same CPU and all propagated stores from other CPUs
12
+ must propagate to all other CPUs before the release operation
13
+ (A-cumulative property). This is implemented using
14
+ :c:func:`smp_store_release`.
15
+
16
+ An ACQUIRE memory ordering guarantees that all post loads and
17
+ stores (all po-later instructions) on the same CPU are
18
+ completed after the acquire operation. It also guarantees that all
19
+ po-later stores on the same CPU must propagate to all other CPUs
20
+ after the acquire operation executes. This is implemented using
21
+ :c:func:`smp_acquire__after_ctrl_dep`.
22
+ */
23
+
24
+ #ifdef __cplusplus
25
+ #include <atomic>
26
+
27
+ template <typename T>
28
+ static inline void IO_URING_WRITE_ONCE(T &var, T val)
29
+ {
30
+ std::atomic_store_explicit(reinterpret_cast<std::atomic<T> *>(&var),
31
+ val, std::memory_order_relaxed);
32
+ }
33
+ template <typename T>
34
+ static inline T IO_URING_READ_ONCE(const T &var)
35
+ {
36
+ return std::atomic_load_explicit(
37
+ reinterpret_cast<const std::atomic<T> *>(&var),
38
+ std::memory_order_relaxed);
39
+ }
40
+
41
+ template <typename T>
42
+ static inline void io_uring_smp_store_release(T *p, T v)
43
+ {
44
+ std::atomic_store_explicit(reinterpret_cast<std::atomic<T> *>(p), v,
45
+ std::memory_order_release);
46
+ }
47
+
48
+ template <typename T>
49
+ static inline T io_uring_smp_load_acquire(const T *p)
50
+ {
51
+ return std::atomic_load_explicit(
52
+ reinterpret_cast<const std::atomic<T> *>(p),
53
+ std::memory_order_acquire);
54
+ }
55
+
56
+ static inline void io_uring_smp_mb()
57
+ {
58
+ std::atomic_thread_fence(std::memory_order_seq_cst);
59
+ }
60
+ #else
61
+ #include <stdatomic.h>
62
+
63
+ #define IO_URING_WRITE_ONCE(var, val) \
64
+ atomic_store_explicit((_Atomic __typeof__(var) *)&(var), \
65
+ (val), memory_order_relaxed)
66
+ #define IO_URING_READ_ONCE(var) \
67
+ atomic_load_explicit((_Atomic __typeof__(var) *)&(var), \
68
+ memory_order_relaxed)
69
+
70
+ #define io_uring_smp_store_release(p, v) \
71
+ atomic_store_explicit((_Atomic __typeof__(*(p)) *)(p), (v), \
72
+ memory_order_release)
73
+ #define io_uring_smp_load_acquire(p) \
74
+ atomic_load_explicit((_Atomic __typeof__(*(p)) *)(p), \
75
+ memory_order_acquire)
76
+
77
+ #define io_uring_smp_mb() \
78
+ atomic_thread_fence(memory_order_seq_cst)
79
+ #endif
80
+
81
+ #endif /* defined(LIBURING_BARRIER_H) */