From c23a457e72abe608715ac76f076f47dc42af07a5 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Thu, 30 May 2024 20:31:44 +0200 Subject: Merging upstream version 1.74.1+dfsg1. Signed-off-by: Daniel Baumann --- vendor/rustix/.cargo-checksum.json | 2 +- vendor/rustix/Cargo.toml | 31 +- vendor/rustix/README.md | 7 +- vendor/rustix/benches/mod.rs | 32 +- vendor/rustix/build.rs | 15 +- vendor/rustix/src/backend/libc/c.rs | 21 +- vendor/rustix/src/backend/libc/conv.rs | 11 +- vendor/rustix/src/backend/libc/event/epoll.rs | 26 +- vendor/rustix/src/backend/libc/event/mod.rs | 2 +- vendor/rustix/src/backend/libc/event/poll_fd.rs | 9 +- vendor/rustix/src/backend/libc/event/syscalls.rs | 26 +- vendor/rustix/src/backend/libc/event/types.rs | 22 +- vendor/rustix/src/backend/libc/fs/inotify.rs | 31 +- vendor/rustix/src/backend/libc/fs/makedev.rs | 12 +- vendor/rustix/src/backend/libc/fs/mod.rs | 10 +- vendor/rustix/src/backend/libc/fs/syscalls.rs | 111 ++-- vendor/rustix/src/backend/libc/fs/types.rs | 97 +++- vendor/rustix/src/backend/libc/io/errno.rs | 28 +- vendor/rustix/src/backend/libc/io/syscalls.rs | 57 +-- vendor/rustix/src/backend/libc/io/types.rs | 9 + .../rustix/src/backend/libc/io/windows_syscalls.rs | 29 +- vendor/rustix/src/backend/libc/mm/types.rs | 39 +- vendor/rustix/src/backend/libc/mount/types.rs | 31 +- vendor/rustix/src/backend/libc/net/addr.rs | 32 +- vendor/rustix/src/backend/libc/net/ext.rs | 17 +- vendor/rustix/src/backend/libc/net/msghdr.rs | 23 +- .../rustix/src/backend/libc/net/read_sockaddr.rs | 24 +- vendor/rustix/src/backend/libc/net/send_recv.rs | 19 +- vendor/rustix/src/backend/libc/net/syscalls.rs | 106 +++- .../rustix/src/backend/libc/net/write_sockaddr.rs | 28 +- vendor/rustix/src/backend/libc/pipe/syscalls.rs | 12 +- vendor/rustix/src/backend/libc/pipe/types.rs | 6 + vendor/rustix/src/backend/libc/process/syscalls.rs | 33 +- vendor/rustix/src/backend/libc/process/types.rs | 5 - vendor/rustix/src/backend/libc/pty/syscalls.rs | 27 +- vendor/rustix/src/backend/libc/rand/types.rs | 3 + vendor/rustix/src/backend/libc/termios/syscalls.rs | 70 +-- vendor/rustix/src/backend/libc/thread/futex.rs | 43 ++ vendor/rustix/src/backend/libc/thread/mod.rs | 2 + vendor/rustix/src/backend/libc/thread/syscalls.rs | 122 ++++- vendor/rustix/src/backend/libc/time/syscalls.rs | 2 +- vendor/rustix/src/backend/libc/time/types.rs | 17 +- .../rustix/src/backend/linux_raw/arch/aarch64.rs | 268 ++++++++++ vendor/rustix/src/backend/linux_raw/arch/arm.rs | 265 ++++++++++ .../src/backend/linux_raw/arch/asm/aarch64.rs | 268 ---------- .../rustix/src/backend/linux_raw/arch/asm/arm.rs | 265 ---------- .../rustix/src/backend/linux_raw/arch/asm/mips.rs | 543 -------------------- .../src/backend/linux_raw/arch/asm/mips32r6.rs | 543 -------------------- .../src/backend/linux_raw/arch/asm/mips64.rs | 466 ----------------- .../src/backend/linux_raw/arch/asm/mips64r6.rs | 470 ----------------- .../rustix/src/backend/linux_raw/arch/asm/mod.rs | 24 - .../src/backend/linux_raw/arch/asm/powerpc64.rs | 413 --------------- .../src/backend/linux_raw/arch/asm/riscv64.rs | 265 ---------- .../rustix/src/backend/linux_raw/arch/asm/thumb.rs | 322 ------------ .../rustix/src/backend/linux_raw/arch/asm/x86.rs | 490 ------------------ .../src/backend/linux_raw/arch/asm/x86_64.rs | 293 ----------- vendor/rustix/src/backend/linux_raw/arch/mips.rs | 543 ++++++++++++++++++++ .../rustix/src/backend/linux_raw/arch/mips32r6.rs | 543 ++++++++++++++++++++ vendor/rustix/src/backend/linux_raw/arch/mips64.rs | 466 +++++++++++++++++ .../rustix/src/backend/linux_raw/arch/mips64r6.rs | 470 +++++++++++++++++ vendor/rustix/src/backend/linux_raw/arch/mod.rs | 19 + .../rustix/src/backend/linux_raw/arch/powerpc64.rs | 413 +++++++++++++++ .../rustix/src/backend/linux_raw/arch/riscv64.rs | 265 ++++++++++ vendor/rustix/src/backend/linux_raw/arch/thumb.rs | 322 ++++++++++++ vendor/rustix/src/backend/linux_raw/arch/x86.rs | 489 ++++++++++++++++++ vendor/rustix/src/backend/linux_raw/arch/x86_64.rs | 293 +++++++++++ vendor/rustix/src/backend/linux_raw/c.rs | 34 +- vendor/rustix/src/backend/linux_raw/conv.rs | 20 +- vendor/rustix/src/backend/linux_raw/elf.rs | 181 ------- vendor/rustix/src/backend/linux_raw/event/epoll.rs | 22 +- vendor/rustix/src/backend/linux_raw/event/mod.rs | 1 + .../rustix/src/backend/linux_raw/event/poll_fd.rs | 5 +- .../rustix/src/backend/linux_raw/event/syscalls.rs | 24 +- vendor/rustix/src/backend/linux_raw/event/types.rs | 3 + vendor/rustix/src/backend/linux_raw/fs/inotify.rs | 13 +- vendor/rustix/src/backend/linux_raw/fs/mod.rs | 8 + vendor/rustix/src/backend/linux_raw/fs/syscalls.rs | 135 +++-- vendor/rustix/src/backend/linux_raw/fs/types.rs | 55 +- vendor/rustix/src/backend/linux_raw/io/errno.rs | 28 +- vendor/rustix/src/backend/linux_raw/io/syscalls.rs | 70 +-- vendor/rustix/src/backend/linux_raw/io/types.rs | 9 + .../src/backend/linux_raw/io_uring/syscalls.rs | 3 +- vendor/rustix/src/backend/linux_raw/mm/types.rs | 21 + vendor/rustix/src/backend/linux_raw/mod.rs | 11 +- vendor/rustix/src/backend/linux_raw/mount/types.rs | 31 +- vendor/rustix/src/backend/linux_raw/net/addr.rs | 4 +- vendor/rustix/src/backend/linux_raw/net/msghdr.rs | 39 +- .../rustix/src/backend/linux_raw/net/send_recv.rs | 6 + .../rustix/src/backend/linux_raw/net/syscalls.rs | 139 +++-- .../src/backend/linux_raw/net/write_sockaddr.rs | 4 +- vendor/rustix/src/backend/linux_raw/param/auxv.rs | 258 +++++----- vendor/rustix/src/backend/linux_raw/param/init.rs | 149 ++++++ .../src/backend/linux_raw/param/libc_auxv.rs | 47 +- vendor/rustix/src/backend/linux_raw/param/mod.rs | 11 +- .../src/backend/linux_raw/param/mustang_auxv.rs | 159 ------ .../rustix/src/backend/linux_raw/pid/syscalls.rs | 3 +- .../rustix/src/backend/linux_raw/pipe/syscalls.rs | 15 +- vendor/rustix/src/backend/linux_raw/pipe/types.rs | 6 + .../rustix/src/backend/linux_raw/prctl/syscalls.rs | 3 +- .../src/backend/linux_raw/process/syscalls.rs | 37 +- .../rustix/src/backend/linux_raw/process/types.rs | 10 - .../rustix/src/backend/linux_raw/pty/syscalls.rs | 38 +- .../rustix/src/backend/linux_raw/rand/syscalls.rs | 3 +- vendor/rustix/src/backend/linux_raw/rand/types.rs | 3 + .../src/backend/linux_raw/runtime/syscalls.rs | 17 +- vendor/rustix/src/backend/linux_raw/runtime/tls.rs | 39 +- .../src/backend/linux_raw/system/syscalls.rs | 3 +- .../src/backend/linux_raw/termios/syscalls.rs | 39 +- .../rustix/src/backend/linux_raw/thread/futex.rs | 4 + vendor/rustix/src/backend/linux_raw/thread/mod.rs | 4 +- .../src/backend/linux_raw/thread/syscalls.rs | 5 +- .../rustix/src/backend/linux_raw/time/syscalls.rs | 3 +- vendor/rustix/src/backend/linux_raw/time/types.rs | 14 +- .../rustix/src/backend/linux_raw/ugid/syscalls.rs | 3 +- vendor/rustix/src/backend/linux_raw/vdso.rs | 27 +- .../rustix/src/backend/linux_raw/vdso_wrappers.rs | 9 +- vendor/rustix/src/bitcast.rs | 4 +- vendor/rustix/src/check_types.rs | 6 +- vendor/rustix/src/event/kqueue.rs | 20 +- vendor/rustix/src/event/mod.rs | 18 +- vendor/rustix/src/event/port.rs | 5 +- vendor/rustix/src/ffi.rs | 7 +- vendor/rustix/src/fs/abs.rs | 36 +- vendor/rustix/src/fs/at.rs | 27 +- vendor/rustix/src/fs/fcntl.rs | 2 +- vendor/rustix/src/fs/fd.rs | 6 +- vendor/rustix/src/fs/ioctl.rs | 52 +- vendor/rustix/src/fs/mod.rs | 4 +- vendor/rustix/src/fs/mount.rs | 10 + vendor/rustix/src/fs/raw_dir.rs | 6 +- vendor/rustix/src/fs/seek_from.rs | 29 +- vendor/rustix/src/fs/statx.rs | 29 ++ vendor/rustix/src/fs/xattr.rs | 3 + vendor/rustix/src/io/errno.rs | 25 - vendor/rustix/src/io/ioctl.rs | 23 +- vendor/rustix/src/io_uring.rs | 89 +++- vendor/rustix/src/ioctl/bsd.rs | 24 + vendor/rustix/src/ioctl/linux.rs | 83 +++ vendor/rustix/src/ioctl/mod.rs | 338 ++++++++++++ vendor/rustix/src/ioctl/patterns.rs | 202 ++++++++ vendor/rustix/src/lib.rs | 85 +-- vendor/rustix/src/maybe_polyfill/no_std/mod.rs | 11 +- .../src/maybe_polyfill/no_std/net/ip_addr.rs | 2 +- .../src/maybe_polyfill/no_std/os/fd/owned.rs | 36 ++ vendor/rustix/src/maybe_polyfill/std/mod.rs | 10 +- vendor/rustix/src/net/send_recv/msg.rs | 12 +- vendor/rustix/src/net/socket.rs | 9 +- vendor/rustix/src/net/sockopt.rs | 398 +++++++++++++++ vendor/rustix/src/net/types.rs | 567 ++++++++++----------- vendor/rustix/src/param/init.rs | 4 +- vendor/rustix/src/param/mod.rs | 4 +- vendor/rustix/src/path/arg.rs | 140 ++++- vendor/rustix/src/pid.rs | 20 +- vendor/rustix/src/pipe.rs | 20 +- vendor/rustix/src/prctl.rs | 3 + vendor/rustix/src/process/chdir.rs | 10 +- vendor/rustix/src/process/exit.rs | 6 +- vendor/rustix/src/process/id.rs | 6 +- vendor/rustix/src/process/ioctl.rs | 35 +- vendor/rustix/src/process/membarrier.rs | 49 +- vendor/rustix/src/process/mod.rs | 4 +- vendor/rustix/src/process/pidfd.rs | 7 +- vendor/rustix/src/process/pidfd_getfd.rs | 9 +- vendor/rustix/src/process/prctl.rs | 7 +- vendor/rustix/src/process/procctl.rs | 3 + vendor/rustix/src/process/wait.rs | 16 +- vendor/rustix/src/procfs.rs | 29 +- vendor/rustix/src/pty.rs | 42 +- vendor/rustix/src/rand/getrandom.rs | 1 - vendor/rustix/src/runtime.rs | 79 ++- vendor/rustix/src/system.rs | 26 +- vendor/rustix/src/termios/ioctl.rs | 17 +- vendor/rustix/src/termios/tty.rs | 11 +- vendor/rustix/src/termios/types.rs | 12 + vendor/rustix/src/thread/futex.rs | 2 +- vendor/rustix/src/thread/id.rs | 9 +- vendor/rustix/src/thread/libcap.rs | 3 + vendor/rustix/src/thread/mod.rs | 9 +- vendor/rustix/src/thread/prctl.rs | 38 +- vendor/rustix/src/thread/setns.rs | 10 +- vendor/rustix/src/utils.rs | 34 ++ vendor/rustix/src/weak.rs | 34 +- 182 files changed, 8405 insertions(+), 6214 deletions(-) create mode 100644 vendor/rustix/src/backend/libc/thread/futex.rs create mode 100644 vendor/rustix/src/backend/linux_raw/arch/aarch64.rs create mode 100644 vendor/rustix/src/backend/linux_raw/arch/arm.rs delete mode 100644 vendor/rustix/src/backend/linux_raw/arch/asm/aarch64.rs delete mode 100644 vendor/rustix/src/backend/linux_raw/arch/asm/arm.rs delete mode 100644 vendor/rustix/src/backend/linux_raw/arch/asm/mips.rs delete mode 100644 vendor/rustix/src/backend/linux_raw/arch/asm/mips32r6.rs delete mode 100644 vendor/rustix/src/backend/linux_raw/arch/asm/mips64.rs delete mode 100644 vendor/rustix/src/backend/linux_raw/arch/asm/mips64r6.rs delete mode 100644 vendor/rustix/src/backend/linux_raw/arch/asm/mod.rs delete mode 100644 vendor/rustix/src/backend/linux_raw/arch/asm/powerpc64.rs delete mode 100644 vendor/rustix/src/backend/linux_raw/arch/asm/riscv64.rs delete mode 100644 vendor/rustix/src/backend/linux_raw/arch/asm/thumb.rs delete mode 100644 vendor/rustix/src/backend/linux_raw/arch/asm/x86.rs delete mode 100644 vendor/rustix/src/backend/linux_raw/arch/asm/x86_64.rs create mode 100644 vendor/rustix/src/backend/linux_raw/arch/mips.rs create mode 100644 vendor/rustix/src/backend/linux_raw/arch/mips32r6.rs create mode 100644 vendor/rustix/src/backend/linux_raw/arch/mips64.rs create mode 100644 vendor/rustix/src/backend/linux_raw/arch/mips64r6.rs create mode 100644 vendor/rustix/src/backend/linux_raw/arch/powerpc64.rs create mode 100644 vendor/rustix/src/backend/linux_raw/arch/riscv64.rs create mode 100644 vendor/rustix/src/backend/linux_raw/arch/thumb.rs create mode 100644 vendor/rustix/src/backend/linux_raw/arch/x86.rs create mode 100644 vendor/rustix/src/backend/linux_raw/arch/x86_64.rs delete mode 100644 vendor/rustix/src/backend/linux_raw/elf.rs create mode 100644 vendor/rustix/src/backend/linux_raw/param/init.rs delete mode 100644 vendor/rustix/src/backend/linux_raw/param/mustang_auxv.rs create mode 100644 vendor/rustix/src/ioctl/bsd.rs create mode 100644 vendor/rustix/src/ioctl/linux.rs create mode 100644 vendor/rustix/src/ioctl/mod.rs create mode 100644 vendor/rustix/src/ioctl/patterns.rs (limited to 'vendor/rustix') diff --git a/vendor/rustix/.cargo-checksum.json b/vendor/rustix/.cargo-checksum.json index 01994bd27..5c53c42f8 100644 --- a/vendor/rustix/.cargo-checksum.json +++ b/vendor/rustix/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"CODE_OF_CONDUCT.md":"f210602311e3f74b32f46237fd55f4ce36d798e85e3db1432ec667f63a7ffc44","CONTRIBUTING.md":"fb570c76cf924cd75b77bed52b0dbe1e87ce224dc3428c48d98301710dcc331e","COPYRIGHT":"377c2e7c53250cc5905c0b0532d35973392af16ffb9596a41d99d202cf3617c9","Cargo.toml":"63bed0f7d3eb2eff11ad1d4ed658f9bfa1541eecafd7b99aebc683c4a9f92596","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-Apache-2.0_WITH_LLVM-exception":"268872b9816f90fd8e85db5a28d33f8150ebb8dd016653fb39ef1f94f2686bc5","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","ORG_CODE_OF_CONDUCT.md":"a62b69bf86e605ee1bcbb2f0a12ba79e4cebb6983a7b6491949750aecc4f2178","README.md":"20e6d4bc5a33c81e9a4a04abe8ac611658deb4ab0794cd792f0568f287b68da7","SECURITY.md":"4d75afb09dd28eb5982e3a1f768ee398d90204669ceef3240a16b31dcf04148a","benches/mod.rs":"7abf49bced798168a4f57916654305a6c5d048d12e0ad43d30ab14f24b5e527a","build.rs":"36956bd7e6b5a2d5e66e9a91eae41d76bd75b4a25d5427dc22ad48307ef25cc1","src/backend/libc/c.rs":"63b26c669135e7717ed1ff579ace2b238e815164b96a78be031b732645a271d9","src/backend/libc/conv.rs":"71cb0f653fa95705bcea2173840b78dd02f94735db970f8081231320e0478cb9","src/backend/libc/event/epoll.rs":"598e246866f46834f57d5385439d4c40654f899d3b9f252b6f72eeb18628d661","src/backend/libc/event/mod.rs":"7f8547c599b8263eb791890bbe4a0b22fe2676d007ffdcc3e07b2e48d1c994db","src/backend/libc/event/poll_fd.rs":"d342bb16fd8a7ea695e7264c76d8c1d00ab2182ff70ed57a98c25afe9aa16819","src/backend/libc/event/syscalls.rs":"85c7bf53182d606c466af7ceadb2f9bdd7bbdf8b00a7dd5b02e099a3f6bb83ee","src/backend/libc/event/types.rs":"5a520d60f67bf07be9229177ce872dc70bf366760a2b81fecba6d522b2179868","src/backend/libc/event/windows_syscalls.rs":"ebfac665c6676c4b803134ab8806be8aa2e96bdbc7799a19c544cd9069b35787","src/backend/libc/fs/dir.rs":"4ff9b5f3b6fad06cfb641cf74511c4b80186b426e8c2d67a1b6cba08466b5d4f","src/backend/libc/fs/inotify.rs":"4e0e1f31ed6a53cbc56119bb974a464acd9c7797d2699a29cb399311ce49323d","src/backend/libc/fs/makedev.rs":"797e7e31dd363b8f649f370424e23a210be4536b580a78cb0f4c5d375da0aab0","src/backend/libc/fs/mod.rs":"5fa5a19401054cbf8d339192508aa7ad60fb2b0543256dbfbda128c05dedf645","src/backend/libc/fs/syscalls.rs":"1657b2a1f385ca96787648b89cd777657baeeacd96c4f752260b7a97c1fff1a1","src/backend/libc/fs/types.rs":"39a6c7ca6e755a050efe167b9cfd7146898f18ac5b1b40878107f5a9378b2d17","src/backend/libc/io/errno.rs":"01783934c204b775c12a4da055405ab543f63e5b127b55e305efc47708c7f679","src/backend/libc/io/mod.rs":"746647bd864e4ec7717925b6d176cebdb392b7d015070244cc48d92780351dd6","src/backend/libc/io/syscalls.rs":"fd71e78eef9f2ae247fb7d5c92c54d4c32161784dc258848db458f89023faf41","src/backend/libc/io/types.rs":"2248c2ba2c4b6ecbbb9f6c8dc2814734e8cd05e664c2aab409a243e034ff338b","src/backend/libc/io/windows_syscalls.rs":"73d3e609d30dfbb1a032f3ac667b3c65cb8a05a1d54c90bbb253021c85fd496a","src/backend/libc/io_uring/mod.rs":"2c6478857a0751625edabd61acb841819bfba1093b1faeded15693c805d84952","src/backend/libc/io_uring/syscalls.rs":"5af8146d5971c833e6fd657f652c618b31f854e1b0811864fba9b658cb633e19","src/backend/libc/mm/mod.rs":"8aa966faf3853d1a93d0ed91f7e5f4a53539b0287b25a5bfe489fa1d07f7cfd7","src/backend/libc/mm/syscalls.rs":"858e5bb3bc850b6a2d5ce69b3c8e40ab7cf75d392fe3a022119e5edd0c538db5","src/backend/libc/mm/types.rs":"db3b5af83e07a68eaa7f70e04871e818acd5542c135e92b4a38af555e076540e","src/backend/libc/mod.rs":"e572b4461d4fe9a399b5db9c8395d6559ffe69586c76506d53d5d7fb37bb87cf","src/backend/libc/mount/mod.rs":"8aa966faf3853d1a93d0ed91f7e5f4a53539b0287b25a5bfe489fa1d07f7cfd7","src/backend/libc/mount/syscalls.rs":"1bc87501a078616d0190d2e85de55f3f968b8cb79d49bd9eb839a350eed26089","src/backend/libc/mount/types.rs":"6744dc82723d2e08af1d69b7421642bc1b687d89f9116643df9d2e7a9b1d1c39","src/backend/libc/net/addr.rs":"72f504c3a97eaa49d3013db30b55c5c8f711a097b98023ffcbb527d04cf0a014","src/backend/libc/net/ext.rs":"d1274fd3ab84bbb8b73f45efe6dbd63f82b09d889a6b2aae07f15970dbb6c6c2","src/backend/libc/net/mod.rs":"605b818c6f4c536c96e052d9b843eeca79dccd1d3cf1c8b87e60c8539b8122b4","src/backend/libc/net/msghdr.rs":"67f7ed2c41e843bf2c00c9fef4280af24cf2e897c3b31e0a916415237c8f88e4","src/backend/libc/net/read_sockaddr.rs":"62b8a444cb9a0a9031d462f96f401db14b851551dd3dc58eec06570d7fec06c2","src/backend/libc/net/send_recv.rs":"eb8b0b3d291a176b5a2e4818b683819aee395d860bd566b898c2e1ba4e115886","src/backend/libc/net/syscalls.rs":"add5e53e685f9cb417e56359ee0ccbaa4b04a3769377b5b44ad728fe52e17463","src/backend/libc/net/write_sockaddr.rs":"68aa587ff61c1d3c77ce2ab905bc5765b305d545335b321ef923a4f1c50c3683","src/backend/libc/param/auxv.rs":"fdc85b7c33bcd05a16471e42eb4228c48c98c642443635ba5fc3e9a45438d6d3","src/backend/libc/param/mod.rs":"5234b8f1bcb886cca6ea003d411d75eaeebe58deedd80e3441354bf46ed85d4d","src/backend/libc/pid/mod.rs":"2c6478857a0751625edabd61acb841819bfba1093b1faeded15693c805d84952","src/backend/libc/pid/syscalls.rs":"49ea679b96c0741d048e82964038f9a931bc3cf3a0b59c7db3df89629b9c49e6","src/backend/libc/pipe/mod.rs":"8aa966faf3853d1a93d0ed91f7e5f4a53539b0287b25a5bfe489fa1d07f7cfd7","src/backend/libc/pipe/syscalls.rs":"0bf55fdd9f4e351ec8fbd8cf895ed44f513d230ffd51929229c68d87ff2b18ab","src/backend/libc/pipe/types.rs":"ba9f7827ebbf4c2488ccd612beb59b66ced3be2e14a467660bc60aa0332be11d","src/backend/libc/prctl/mod.rs":"2c6478857a0751625edabd61acb841819bfba1093b1faeded15693c805d84952","src/backend/libc/prctl/syscalls.rs":"8a2684f444a7555098dce2b92270d81cefdae902716c6e5d59bd7b0657e8a29d","src/backend/libc/process/cpu_set.rs":"b3d36b01b53b0b6c61a20ed8a69d48eccdd90cc17f82f2926ef1e844f002d0b7","src/backend/libc/process/mod.rs":"d7dc401255bad2e55ffff365339cdc3aad306861d269ad727a817d3cd7763166","src/backend/libc/process/syscalls.rs":"b47392bd1aad96ca93ce421d8877e8b6e6da725db7bb521936ca07e4d1bec114","src/backend/libc/process/types.rs":"e8e54a21e7450157a8471571727c1c7af169ede372329c0e5d82a2e0193ba76e","src/backend/libc/process/wait.rs":"0cc556aed976b4bbb3965f74fd76b8216c755fce25043b7b21ce54afa07c9773","src/backend/libc/pty/mod.rs":"2c6478857a0751625edabd61acb841819bfba1093b1faeded15693c805d84952","src/backend/libc/pty/syscalls.rs":"c4ec64720854f3b83307f67dfc75ab911b3a0378cc2e519054aae045d181f445","src/backend/libc/rand/mod.rs":"8aa966faf3853d1a93d0ed91f7e5f4a53539b0287b25a5bfe489fa1d07f7cfd7","src/backend/libc/rand/syscalls.rs":"78c7201e6bcb75e9cab9486d1878861319f865de2b2c46437be68690bd17bf13","src/backend/libc/rand/types.rs":"7d473c7ee8f19fbcec31f61b28ba6a68e1233f64f37b3b496d396c0197af63e1","src/backend/libc/system/mod.rs":"38563ea68829ca5a4b1b0695ac8a5c05718e85bdc88a36dc805efdfce45d3909","src/backend/libc/system/syscalls.rs":"846dfb59afe40bbfc78e57afa76f0616d62d25da2daadcd872aea6fa32aafc3b","src/backend/libc/system/types.rs":"6871e16aee14fe2ae03cea798c3e509ffe44778a9c0e5608fd73e2e015876d7e","src/backend/libc/termios/mod.rs":"2c6478857a0751625edabd61acb841819bfba1093b1faeded15693c805d84952","src/backend/libc/termios/syscalls.rs":"a7a31994e9bea74cbcbfb66a7d66253d6aca74d8657201a483b82ee4fe5ec7fc","src/backend/libc/thread/mod.rs":"0de5f67a684b9fd7628d3009d2ea5fd51b8770e8b387eed14f59152157844287","src/backend/libc/thread/syscalls.rs":"fe4dfeb072972eac5e2a8de05d7f5c33fd2580a4ce486c5003497d717bbfd176","src/backend/libc/time/mod.rs":"38563ea68829ca5a4b1b0695ac8a5c05718e85bdc88a36dc805efdfce45d3909","src/backend/libc/time/syscalls.rs":"3b0b99271d898ebe173b12fa00f8013fce69e9fa4564428b68d4867c52729597","src/backend/libc/time/types.rs":"e93f3bd1ce4b8696b44c2be6d6308300185a5cc32abc5e3e84ffd9bf6b4597f0","src/backend/libc/ugid/mod.rs":"2c6478857a0751625edabd61acb841819bfba1093b1faeded15693c805d84952","src/backend/libc/ugid/syscalls.rs":"8edf91b8790add23902c9f5418da6b0723a371677f29f490e0c8af852f0f1a0c","src/backend/libc/winsock_c.rs":"3bf3884fd250eca806ffdf96da68e29c133a697810b78b333ea449e523e58562","src/backend/linux_raw/arch/asm/aarch64.rs":"67011427b3cecd29ee716113d952e70d63574c96d1d3ea3c75d46250bde9ca44","src/backend/linux_raw/arch/asm/arm.rs":"7760d51aef17a69a797eb96fd61f7fade0d55bc87ec9a3e77fa6bb6aebaecdbb","src/backend/linux_raw/arch/asm/mips.rs":"d00c84cfdb4e37bdee9a2daa0a7b3298afbb4ebe288702203cb43d9c2617012d","src/backend/linux_raw/arch/asm/mips32r6.rs":"6c2661361ba0ac5caa8458f502c6cca266ce59a43ab552b7882c07cb64b9d149","src/backend/linux_raw/arch/asm/mips64.rs":"ab5455c9b2511ba6b67a66873cd8b53bf77471249fd2779d6437ebb4934087b5","src/backend/linux_raw/arch/asm/mips64r6.rs":"a67262dc9cbd583ecfff93953726dabfd6574714d4646aff27582ff034a28cb9","src/backend/linux_raw/arch/asm/mod.rs":"1ac43073fc3d28879ab46d9220344785db4ef761a21d0357e4fe564157e6f1a6","src/backend/linux_raw/arch/asm/powerpc64.rs":"dcd12314184441f5f7705bea6b829103c7abc9062db366ae5584023a38252a36","src/backend/linux_raw/arch/asm/riscv64.rs":"58a58203e9cac2ed21e4a7b26692c5d56d3c2bcddb3f60a648efd18a02129f3c","src/backend/linux_raw/arch/asm/thumb.rs":"82b88c9a3b6837f28a738cc760fc2403e7014abdb2c35d2bdbc8073235ae2863","src/backend/linux_raw/arch/asm/x86.rs":"bfe81e7c527cdbcc98e4ec10c96f64ce543bb4d7ebdeb5ab020794f09e75545d","src/backend/linux_raw/arch/asm/x86_64.rs":"7c893ca306b3b8a5980c525dc5fa23187a0526bc9f7ac637204d88a1d596df5d","src/backend/linux_raw/arch/mod.rs":"31b3753c763ce3d2dd92db926123fc5eb6e0ba66a09f5574b6ebb11c836dcf6b","src/backend/linux_raw/c.rs":"389243294a968dbd3ca3b4e60ea6323c76ef4b963d0b2a360956d9c9c167c7a5","src/backend/linux_raw/conv.rs":"027816a35e624a90b141ce3f84e8634f9626f9da41130a0f777a60484776318e","src/backend/linux_raw/elf.rs":"ff5017040b29a8cf8d5077a0c73943bfa5e3862eaab37ee1c3b08a1122968bbe","src/backend/linux_raw/event/epoll.rs":"6c27660b015889140ad11657ad08dc32dd52fbc6b0d0a6571885792040e19156","src/backend/linux_raw/event/mod.rs":"72e46b04637e2d1d2a6b97af616144995399e489d1fe916faf835d72fc8c64cd","src/backend/linux_raw/event/poll_fd.rs":"8495da1687b15f7880a576ac8d197c941627a53874f0823467a3e4e3ad5640f2","src/backend/linux_raw/event/syscalls.rs":"f996db9f1f9f2b9bdaf33ef3a80a63ab9b1a65ae956700fd88d355e046ce2890","src/backend/linux_raw/event/types.rs":"4edf9c7c399c91f359bc2370a407fa5ab537a84eed26c593ce5bf6dd82c6c6a0","src/backend/linux_raw/fs/dir.rs":"d871468c08ea22868f308ce53feb1dbab8740d577441a4f3aadd358baa843d27","src/backend/linux_raw/fs/inotify.rs":"c05e201e4f562256388c933cd3f24a3c3a578bd19513284856bb3eb1218906c0","src/backend/linux_raw/fs/makedev.rs":"c6b4505c4bcbbc2460e80f3097eb15e2c8ef38d6c6e7abd78e39c53c372139e2","src/backend/linux_raw/fs/mod.rs":"e22bf30f312f6a05f1e79f7834c33a3c9821514da05fa4786fc31867203a4c74","src/backend/linux_raw/fs/syscalls.rs":"8d8639d24f1d42abbbee6f1d9db77d1c2f49867d9eac52f3f93331b9a2389445","src/backend/linux_raw/fs/types.rs":"3cf024ce2515c151a25ea25f19a21fb61b0deac58f88db841f88b2938fd07034","src/backend/linux_raw/io/errno.rs":"8d6a8d702ddec05c0ec5b518b9c4d6c9b54d390ea9b362e60f2032284c40b112","src/backend/linux_raw/io/mod.rs":"7ae2324427892cca6f5ab53858d847b165f790a72ec25f3d99fb15f0506c9f27","src/backend/linux_raw/io/syscalls.rs":"b079441386e5eb835b258871ae813dcd39fd8aeef4fc96bee187a45b0544bda7","src/backend/linux_raw/io/types.rs":"59d031dd1e769ecbaedaaa3ffc513a7f7154fc48abbb46023166fa38a46f0c61","src/backend/linux_raw/io_uring/mod.rs":"2c6478857a0751625edabd61acb841819bfba1093b1faeded15693c805d84952","src/backend/linux_raw/io_uring/syscalls.rs":"b87fa95c16b2d3ca8fd5d72368bda37b8b8ddbb19df3a884efc6eeec393c86d1","src/backend/linux_raw/mm/mod.rs":"8aa966faf3853d1a93d0ed91f7e5f4a53539b0287b25a5bfe489fa1d07f7cfd7","src/backend/linux_raw/mm/syscalls.rs":"369abe984aa972d8083fee20d764a8d57df242c66f897066367416f2fcc832a3","src/backend/linux_raw/mm/types.rs":"74dd9772c7208d6ad2d3830277eb1f67d5b2392553be23c8a64181c21ca1dc37","src/backend/linux_raw/mod.rs":"eb94a0ff0f7dad9e114d19bcd9bf5b320b9e8570ce74277756aaf038c815e23f","src/backend/linux_raw/mount/mod.rs":"8aa966faf3853d1a93d0ed91f7e5f4a53539b0287b25a5bfe489fa1d07f7cfd7","src/backend/linux_raw/mount/syscalls.rs":"3947261b5d46b9737f02dc5352c3a3a35c63c461fd75bcd8ae6619dfc0bfb54d","src/backend/linux_raw/mount/types.rs":"4241f270fc362834dd2cee3eb360e5b5d2bb0300eb07f0ca1bc81363e501c65c","src/backend/linux_raw/net/addr.rs":"fa6c4ea03ed465188bdb2113a9815549084b501c35654b46a00de226c7ea5463","src/backend/linux_raw/net/mod.rs":"bc9c9c4a8c06b1fb8c57555261176dfb1f3e858a1d89cd2f88e1f31fc126c001","src/backend/linux_raw/net/msghdr.rs":"6c0e1dfc0c9f79e69d3a645f0b4228bf6b29fed920af5f1efa6bbacd0a681c51","src/backend/linux_raw/net/read_sockaddr.rs":"24075ac4c05fab5fe44aae4445cdd12ec7e474f047150baa9b768741d6b9693d","src/backend/linux_raw/net/send_recv.rs":"aa5107094a1e5c6ce57bc2956d0ac63f24a7e61270f61ab2a353f9c832da0e4e","src/backend/linux_raw/net/syscalls.rs":"76c162e5cfa81621b1c2689695efd72066633fa7deedf83b71c255f0c4b176f7","src/backend/linux_raw/net/write_sockaddr.rs":"69ee7d6f754126f9399250d51bcdb306ab6a9ae816bc8fe21d0a9cabd49052ef","src/backend/linux_raw/param/auxv.rs":"890976e7ba6ff456326e3e325b9594b75ee4173bcd7eadc7929ff1b65520b118","src/backend/linux_raw/param/libc_auxv.rs":"16e8ffc7eab03c4aade2bb01908731ce15526041ae5e1767315b90c9f64eaa2a","src/backend/linux_raw/param/mod.rs":"db21fc1b0ea5568b8649890fa38a878bfcdcf7398f6cf1640176b37bcc6ce990","src/backend/linux_raw/param/mustang_auxv.rs":"0adbb54a06b8c7b2df17462d98e1fe72bec02e4e577313add0cb7363262f0d6b","src/backend/linux_raw/pid/mod.rs":"2c6478857a0751625edabd61acb841819bfba1093b1faeded15693c805d84952","src/backend/linux_raw/pid/syscalls.rs":"ce3ca4c72096479340364d16f09918e192ffd3a0436a26eb61aad7e7dac3cdcd","src/backend/linux_raw/pipe/mod.rs":"8aa966faf3853d1a93d0ed91f7e5f4a53539b0287b25a5bfe489fa1d07f7cfd7","src/backend/linux_raw/pipe/syscalls.rs":"ec53a8b3ac23fc3fc2983615e34a210077947dbdf9b6a55477844fdae7e6b306","src/backend/linux_raw/pipe/types.rs":"73db762965df510bf3c908f906acf3a6df182d98d4ba1ebe45a52a4b51751e7e","src/backend/linux_raw/prctl/mod.rs":"2c6478857a0751625edabd61acb841819bfba1093b1faeded15693c805d84952","src/backend/linux_raw/prctl/syscalls.rs":"01aa9cd77341dcd1efab9f3ac28447d0fbc41ed44d65e52301b347fdd1627e50","src/backend/linux_raw/process/cpu_set.rs":"dfdcbdf35aff6a3e08e7d38193bf18c12ca8aa64eb0dc417667be82dcc0f7c55","src/backend/linux_raw/process/mod.rs":"fb393c70a9c63ef9a6bf1fb5a2dc94f07d6b0b6987cc5231c15c607015dafd68","src/backend/linux_raw/process/syscalls.rs":"06313394d332fe385ce2053ae2980cb939665c1d091867d131adf18bd9e7a5dc","src/backend/linux_raw/process/types.rs":"d66049cfbdb27e31586f0ff2e53b6adbe0ebb296a876372e9d0d805d10ac5f51","src/backend/linux_raw/process/wait.rs":"921aee4b0048746087f52615a98edc2aa0fb4b53d6df44be4533098df55d1b05","src/backend/linux_raw/pty/mod.rs":"2c6478857a0751625edabd61acb841819bfba1093b1faeded15693c805d84952","src/backend/linux_raw/pty/syscalls.rs":"8e0c6bb4a488440b39e5df9aa343bdffa6b28a0213246bc699f8b9676a170fa5","src/backend/linux_raw/rand/mod.rs":"8aa966faf3853d1a93d0ed91f7e5f4a53539b0287b25a5bfe489fa1d07f7cfd7","src/backend/linux_raw/rand/syscalls.rs":"fb401466368de62ec4ff76bc230f9246623b003fe7452912e1365f443d3eeeb3","src/backend/linux_raw/rand/types.rs":"787a59629343688cac0fdabd1b7552b400b9188073a1e0394eacc6e0997e1bfe","src/backend/linux_raw/reg.rs":"39b6234971122d247054bda8c2dc3b44493be30482635baa9e2fcbe048e78cbd","src/backend/linux_raw/runtime/mod.rs":"b2cae8cce3822c3c92942f06ea0b68464040dcac33c6f0f7ee392c6269993347","src/backend/linux_raw/runtime/syscalls.rs":"21497bfe3d0f82de278f07bf53a11a04ffaa595b4ff1af92627940ff2029b8fc","src/backend/linux_raw/runtime/tls.rs":"2b8fc61a33ca9b47f854afbb8e3f8b20f9f9416b8884aefe46388c8173c8ae47","src/backend/linux_raw/system/mod.rs":"8aa966faf3853d1a93d0ed91f7e5f4a53539b0287b25a5bfe489fa1d07f7cfd7","src/backend/linux_raw/system/syscalls.rs":"a9bec6662f122b1ec310d417bd9ddc16df13b50de6526d2170aa4d72292c2b14","src/backend/linux_raw/system/types.rs":"1ceab8d738a71043473b26e97fa3fd79d588a86d4774cbc9b9e1d4f1447a016e","src/backend/linux_raw/termios/mod.rs":"2c6478857a0751625edabd61acb841819bfba1093b1faeded15693c805d84952","src/backend/linux_raw/termios/syscalls.rs":"6c85a0cb459ad473f60ab640e3813b65a8e943bc4a86e09d9db6021cb8b0e2cb","src/backend/linux_raw/thread/futex.rs":"3a130db9f6176dc95fdc14ce61a6bcdcc2c28e82a29ddae3e05f347a189fdd14","src/backend/linux_raw/thread/mod.rs":"f7132a68c9db1b4a796781b9e8d0ac268a1ddb713e510bfd43425564ec9b39c4","src/backend/linux_raw/thread/syscalls.rs":"5845d1c0a3548f87a114493c345e18dc32875bd7d35a6abcf1241ced9b024c09","src/backend/linux_raw/time/mod.rs":"672724f55b7b7be6a7452bb1cc2d28b5f0aaa840a2856fe363acce624e1beefc","src/backend/linux_raw/time/syscalls.rs":"a7870ef9daaf3fb2ac50f853df6dbcd935a3b2d70e720b80184208f602a918e6","src/backend/linux_raw/time/types.rs":"50d84ee6288f06bf4b526781c84e7252f3c09ecdb0626856d94a1a61c2e2c579","src/backend/linux_raw/ugid/mod.rs":"2c6478857a0751625edabd61acb841819bfba1093b1faeded15693c805d84952","src/backend/linux_raw/ugid/syscalls.rs":"844b2bed42b9a3c06845dbae1d020bbab5757d23ea3ad7a440e3cd87ff993f72","src/backend/linux_raw/vdso.rs":"a5abab80f023088162fd81dc306b6bd86bd61b2018a191b384f57facb1d48d0a","src/backend/linux_raw/vdso_wrappers.rs":"7b5711e13d0d7112d57876014b932adfca13c0e1260150dd5f43152170366e82","src/bitcast.rs":"fe6bdc7fc31fa3b360c44a841c9a0f143629172729c6aaeae76841c74c122ff3","src/check_types.rs":"fe4fc1a0930a25037dac954e7843a4d4c321dd7d1acb25916cdc9cfd4b37974b","src/clockid.rs":"1d2e1cfcf23160b55d6b046d235edf2eb2408f072a8bdef3e3a3871885abdd5a","src/cstr.rs":"9e3fcd57d6af382a9a4f24b97a29eeb05a3ccd5c8fefd666884f6e4438b3c4a3","src/event/eventfd.rs":"81cbd08f7bdf40a6ce1ca692b63da1dc8ba925282990668d9d68f1203e839fa1","src/event/kqueue.rs":"b267ca1badc43d977e2c5435092f161caab50ea04e258772dbebe1f02f3f5966","src/event/mod.rs":"6010c924a0a079945eec796465a7108119d512db74709ea0105ed19051c0f55a","src/event/poll.rs":"0ee583dbd457a573a82a06c04a2a24bd2c76e751d27a435507d55338e2871327","src/event/port.rs":"da588ff0f694bb1f99e288708bfc07353bd1274020c13dce30df5d7f3b42b0f3","src/ffi.rs":"0c6b9a6f20ffb31a827412c0381c6fff09e68265f29d94c5470940e22c5334a2","src/fs/abs.rs":"1bd62a3aa971468ca7a51a3fbbb59188852b7bc099b55dcb8ce2b1344db5f877","src/fs/at.rs":"d5bd107c89c16d3ead53d6281973e188497c9e35a49c5f2ad89916552071e05f","src/fs/constants.rs":"24076a01f8bfc126b0905e9bc0521d2c3a3abc6c3b8c86ddb1e545070d097127","src/fs/copy_file_range.rs":"d3b644374390d482b2ff749a2459458872b57d0dcf9670368739b7833509a7c2","src/fs/cwd.rs":"9f429a79ace6e17455634da09216ee0ad3d067a4541518b3193ae6a8d9ff1e26","src/fs/dir.rs":"347a52f4ca9ac6321c52e802e97ec90d1b4c62ec955c8996fc17f8f5aed69966","src/fs/fadvise.rs":"beef66ebe1310fb92628240b2cde68f744c78e50f6ff61bb1404bd4868d9cae8","src/fs/fcntl.rs":"bc8e12ba9c01abeac2d89af63e2618c08366e9bf8d093a3d8c399426c786db60","src/fs/fcntl_apple.rs":"e2f23f038083621bcdecc98d02ce1023508afaecdb2ed0fba5c8b70f955301e5","src/fs/fcopyfile.rs":"ec95929cbbe02cf49233a785e5238931bb107b7903cc5bc95e4231de960995f2","src/fs/fd.rs":"6b64b27b4727e00ae1a44cf04f9627326679ecc2d7ea274195e1204aa60c2d50","src/fs/file_type.rs":"fefd865f91011f66126213b0994773d99e373b468c31e866002228c98c64ad85","src/fs/getpath.rs":"28f6970fc1bbc37bb35c84724b59eac436ea7407a4522e18c2bdacb1fdd2edd9","src/fs/id.rs":"1b5c8a8baf9a9bb1f895f97189cea4e5982a0d35b192afeec6340a6c6222e0cb","src/fs/ioctl.rs":"1b222e725402d775813877b73f40f8ac2b513439485d326fbd49e3f4ebedce3b","src/fs/makedev.rs":"85520b484cb7c15ab71ea1c368578ea3b7e484d82f8510db92b6ce9f7ca341ae","src/fs/memfd_create.rs":"15a8f28e040cffd8c24c7903483440f88853b2e538ad48d80f3c00b4b2befdea","src/fs/mod.rs":"8a3ab65aa3fa9a66ea55ef1ec3db72cab938b2b0deb4e079dd6efd737f91d480","src/fs/mount.rs":"be6d26c58d49913838ad32c206187c2c6e7e1ca9e5da0990dfe87aaa2d7851b3","src/fs/openat2.rs":"4a95c15dab533a41201b5fa25c8a212956b7571d58cad696bdaf45af8aef96db","src/fs/raw_dir.rs":"6314094d92d6a51ab14d9d67e72427f3bb778543f2bb12632fd02cf439d52c2d","src/fs/seek_from.rs":"d7616a45e8a449df28b075ddded4d7c95d6c4575d6fe0cf0ca7b6625e9dc7eeb","src/fs/sendfile.rs":"e3b2058741cf4b1698f34d84bb37130cf2b72806d522a16fe541e832cde136cb","src/fs/statx.rs":"239d447477f8ac368c8ddf9975c71509c47881f647f59cd941ac07954d8a77f9","src/fs/sync.rs":"a3b23543834281f347b0f873bd38154d31d404871188ac08f2b20b9196234cfd","src/fs/xattr.rs":"1d4d7f144716ac8fcae6b728ea23d27db8d3d1d7d2ec3dc31a1dea8e9d6a7eff","src/io/close.rs":"0aa3cd05a8fed8e5244f97b8b6c2e7f65ed93a4e5435c6329852bb3da7514440","src/io/dup.rs":"a8a59c5d345dc54c57ded890720c33eb78c4d53917c71e8bb6317f7ed122cb87","src/io/errno.rs":"11b40196e7ae2c3f7dfa4a329573fb73676a5a7f90767bc5a49e8d4f379643b5","src/io/fcntl.rs":"c0f7bd7fce1119b0c1d0085b7ab77d5df02470ae3e06035428a2452dacbec296","src/io/ioctl.rs":"69d85054f32523c9b88b9bbee536d3299cfddba0e08f608d950e8a7cc4464e07","src/io/is_read_write.rs":"1bfb9ee5d58e0b29b44af12fe2668c7bccc841358698dcde47f1519ff9bb73b4","src/io/mod.rs":"75f1d0646be1d4c7c08b5887d8119b0103be8c25c43ccd4e0e97015508c0bb8f","src/io/read_write.rs":"54ba528b11601af1338bb0c71a41b256a0033076d30b3946c3fd0bdfa61dd021","src/io_uring.rs":"7093958a57bdaadd75f1800f07e359fd97c6f99c3fa01d263b4b1e57d44b2c4f","src/lib.rs":"2af15f86a2250abd5ef582bd6feedd45ec6740573a0518ae9422f5fb1f2d8a23","src/maybe_polyfill/no_std/io/mod.rs":"77889bb5c5a4f2e50e38379cdaa5d0fef4b0cafc3da056735df01f6deae75747","src/maybe_polyfill/no_std/mod.rs":"d4d98cf838b65dc3ceb0f6d4a950d9348695c3084448bd844e47b909960bbb47","src/maybe_polyfill/no_std/net/ip_addr.rs":"080dd17c44b395b46b0d9e70da76f376540f92ece65f79e3d242c0a272d3b451","src/maybe_polyfill/no_std/net/mod.rs":"b0ee611c454679226a15bf647e7779995f3fe9c8e0507930a0d0613eb414b7c2","src/maybe_polyfill/no_std/net/socket_addr.rs":"bfeb32d32c176cde76323abcffebfc47e9898fb8d7ce3668c602dc8451086a2d","src/maybe_polyfill/no_std/os/fd/mod.rs":"d9dfe2a2c25be727847bcdfe6f4898685af2521850298178ca8d46a8e2ceee88","src/maybe_polyfill/no_std/os/fd/owned.rs":"4ce3234f8ab2cc8a7b749531336f4f6b6297eff0e20a01190be2c10409a0c066","src/maybe_polyfill/no_std/os/fd/raw.rs":"9cedb353580b932879ddc4dee9936212fefb6d42530dc5cec519a0779d5dee33","src/maybe_polyfill/no_std/os/mod.rs":"27dab639a765827644005d5f2fcc7c825310606b889cc8dd83f54c9528350dc0","src/maybe_polyfill/no_std/os/windows/io/mod.rs":"5bbcc05c83fee5026dd744a994e0458469466d5be39081baa62df07753b92fd2","src/maybe_polyfill/no_std/os/windows/io/raw.rs":"4c32609a489dd938a49328b5637cb3bafb96437f2f9f269ab66d7d3cb90247f6","src/maybe_polyfill/no_std/os/windows/io/socket.rs":"c658f42f24eff44a661f2adfd24a11af80fe9897f3e2af4dc5d2c64808308d65","src/maybe_polyfill/no_std/os/windows/mod.rs":"fdb416f8f231a4e778b5f985b9ae712ece5e1a1402963ad1a5f6a8b9843795f4","src/maybe_polyfill/std/mod.rs":"dd6e219564e224fa7cc9fdab2e45935f13ad062da53d0b6d259a695c7aec1847","src/mm/madvise.rs":"3c262b3713a73fafcedf1b04bb12c048bb11d47ca43c959e5dfa48c27651f4f0","src/mm/mmap.rs":"fc32e308a24c6f351d74306943d67a68093a0b6555b4bdf6cd755bf43795f406","src/mm/mod.rs":"b3a6cb838986d45825b912355cedead761211a494ca6f89b2367a2d2157e340e","src/mm/msync.rs":"9dcfe5f54235e9314a595edb8d548ac79d222bbcc58bb3263cf7e96d603b23ad","src/mm/userfaultfd.rs":"8073443bd181ff0b3ba4d0b1ae67370b4864035a0c8b4898cd709dc47c518ae7","src/mount/fsopen.rs":"160e384e9175fd98669cda1cf3590bb195c2ba7e1c724e9ea06e692595e58ba1","src/mount/mod.rs":"5f0c9df4727592695deb1cd63ae1de021b03dcd9d0d1b68e1f34d12a7136cb19","src/mount/mount_unmount.rs":"8ad11675e5d762d33fbefbed06a6a9f9e52a9b689bd06662446152614321ab77","src/mount/types.rs":"601ae3e10b7dc496fed7f3b40a80e81c6edd7bf13189d7be45c3212d4c684c39","src/net/mod.rs":"a6bc55f9e086caf46a7c00783498d73a328a66f2a991f1ec65d5f13931377b0f","src/net/send_recv/mod.rs":"f33e39c7b228cd8109823b0a0a1aa397cddad504d49e69b36f74c5b84e5070e5","src/net/send_recv/msg.rs":"f4854380a7ead4696f427409836d6fc9edd916e38248a350c6208e655b0663a7","src/net/socket.rs":"6bb087ab208a1e06d535fa11e2aa4a9f96da6e73b697fca93e2a3c89178c4434","src/net/socket_addr_any.rs":"d07f9e9ef8873aa5bfd85f669952299286ef6f2cc5b9fea383856432e61b850f","src/net/socketpair.rs":"56f4885c31d2664cd16e18a9a88792a4912fedd953cec36dba67e8581fd57921","src/net/sockopt.rs":"b72ffea1f6e3efd315e7d72fceefc5071d7e6a9c14c999755fd15ad0ae466ddd","src/net/types.rs":"61c0e5aaf636734832018dc80541772741e6c8447befcc1d6e1bdbe4815cd70c","src/net/wsa.rs":"6e546b42f50a851fc833c57cda76cfb347203ed4b0dea574a3d325bf5a2ebf80","src/param/auxv.rs":"988872f9bec2e12f35765ae8963cbb9535d4acaedd4c9a4d07ced6feb70e0aaa","src/param/init.rs":"671d8974f0d9b82e79076d1f4deabe0273a874a329f74b8aad26e07b86791ba3","src/param/mod.rs":"53ee190cf5266a2e057af9412acc50359369470a04dbfe2e6e92a90de15aff57","src/path/arg.rs":"4a4bf9b59334900b51ac250365b2a1838670f83a6df9c9c3f6a35bd7d4784170","src/path/dec_int.rs":"fad9793b89eac526953b994cbed6b614f01c25108f9763e19fb98029feda93a4","src/path/mod.rs":"6b1b949c94bcc47e0f08a3f8e8db5b61ff497d0dfd3e0655f51c01d3e4b7dfd6","src/pid.rs":"2ef7ac7944d8a2e4c1e764d78c5b7e223704243b78c3c15348e9ea0fe1638117","src/pipe.rs":"e57b6f40af317e07d49f0a5ca98016cd358d8de2989be9a04775b6937ab05fb2","src/prctl.rs":"a1c85a401538d614f5539871f9a03f9a345b24cfbc845e953deb9f8b96986e2a","src/process/chdir.rs":"9d0397bc91bad5bf1c0afec5b3e6dd9cb7de6e54c3d0b760b33a4996a4cb1b25","src/process/chroot.rs":"2b5f6124eb19f26ad2705174f7ad50cdc0a5d15abd59ffcf55421228d82130b4","src/process/exit.rs":"98d55e9a419737cd88327d8eb484b892e2a12706e5dd05e5e43552af8b6a806a","src/process/id.rs":"402475cba98cc7e724943bfd218862f76c08b8d200a7b38bb5067bba2a837ef1","src/process/ioctl.rs":"6b9527094ad3617057e95268d515bce032656642e7ee55fcc686e4a9cbf01499","src/process/kill.rs":"7b879e5cff8a064acd0e7488f4e21bd4e4a8506ce380688b72cc48d283ff9c89","src/process/membarrier.rs":"77b1080dc50cf0bf48959bd2388c519f0b73ac231cc329be43f04525217b7e94","src/process/mod.rs":"21e5e4f55e81c447d76970442473678f6345d12a61b3227caf09460cfb82e0e4","src/process/pidfd.rs":"948b88cd986c17074fc895f277eec49066a52ab461fa341b7119ce648b28fcb6","src/process/pidfd_getfd.rs":"14aab7cc5578ca4753a7a42dcc8b4ea03748564b542675a50bae8e128348b23e","src/process/prctl.rs":"3f949bbc03c00cb68fab7db8c1bda71741f8d9439b9e25a8521d7cbb0693491d","src/process/priority.rs":"f135482e71ea8aa0daf92b9f238051178a4c904070fa8409622f94155df3c544","src/process/procctl.rs":"7668f8302515316cc70addfe8da4af47ea8872d4acacd72d1c87c0ecb627e8e9","src/process/rlimit.rs":"10b79de3ced0e64059a94c879742d46a35a6176c776d8eed75031d5e6340283d","src/process/sched.rs":"7c3bfc5be624e7d7f5e043c3ee0b0566fcab3d684d61c272e7b4233410ab1c42","src/process/sched_yield.rs":"6565faa3928b66ddc74a65e893e15edfa4b9be4f7e5f5f68527501a7f6bc3350","src/process/umask.rs":"1a0f31a842303c978e3f05ec191e2b5e96104c09c6596473b42b1fac34898a50","src/process/wait.rs":"5bceb8b2d6144aadc203ed3d7dd24536e0ad4bbef45c3fb9369559dd9284693d","src/procfs.rs":"55d19dfe0dbff098639b7e559defddfd52bdd73a0cd7fde2e026a702c4e4b70b","src/pty.rs":"602c58dcfa248a5e7f9389851a52f99dfb0e115fc9a70f732d69b0a1d127fae5","src/rand/getrandom.rs":"15255b5c5f76cf61ac4fac8b7ac6621049f2b5d2549ec319cdd69ab1ae4d07d2","src/rand/mod.rs":"cab59332aadd9b679f5b22cbb222d48ee028af5eb9fd4a4d43922da659b895d7","src/runtime.rs":"952cea05413e3ba1fa4fdc4755bf1d0fc0c21a5c8878f2cccc6a533119c193f8","src/signal.rs":"c071b4f011deef19a679d7a832d5408a3cd68627161d6510008d6312266a2611","src/static_assertions.rs":"39986672f489949be1d6469f0c30fb7d2eaa21bdaa2702a8c150b2b150bf5535","src/stdio.rs":"a5de2d7d9c3c5a901f88b6acf4754687c958a2f3a93c7945c2b8fcb948d468af","src/system.rs":"853b3ddaa10b90226f6d9a0ef7890739ce2fbd150c362c912df6afd19664253c","src/termios/ioctl.rs":"fd1db1ee473e884eedc5858e7697d4a00b6ed7d878af85abdb76771225bd2e48","src/termios/mod.rs":"b44b7caa60b6f458657ed58a0e0eca41bb4e6d6be4b0f042bbb8ab7056cebe4b","src/termios/tc.rs":"e41312d15464b83b2457c2502fc3f3b9998cfb02ba68739026dd4285cc7130ac","src/termios/tty.rs":"a3ebab3b73db76fb5594be1bb4ec888a28a63637f8cd0211fdb1b3b645cc2ca2","src/termios/types.rs":"c30ab7e4e32ffe896b75eda882c7672b5d8b36d9d87f3a1e4bf31f213a43d0e2","src/thread/clock.rs":"469326c822dfb63405ee8537552cedde0b344978280e6645bbadd47dedc71e18","src/thread/futex.rs":"4e78c84589b535ca9ca633633696ef212393a98f2890b181acaa8f908fbc5ae2","src/thread/id.rs":"f25a6dbcff0e0e7a429ce5e8406afcba3b74f10ad3065c015f8e728fd6880e53","src/thread/libcap.rs":"ee1f320d860a3decbec8052897d9e9484591e4b0b64b3b5b419f4d43d144422e","src/thread/mod.rs":"6fc33eb022c4ab7f950dfb4fae6ab70b1acbcdbeacd909ae1848e7e54076c310","src/thread/prctl.rs":"f6da23203fc2087cd3b36b910901cd6cd86d5ac6f2fcb09feb1270d6c486a1a7","src/thread/setns.rs":"ba37cbedcd5b6ef1e09422fbb8caa9fd94e25ebf6930fc7ccc778944cd078cb3","src/time/clock.rs":"e59a29f1bed8c31c3d5b6fad60f2d4fa6cab8dd8e86148bb3693a5e3a1ce735f","src/time/mod.rs":"43afee938c80d124d04d4ba190c03f4d21d1e3bfc154fff309211e4f6eabe940","src/time/timerfd.rs":"f17092b84553741aa2d2b44c6992b5d2c8c96cc2c2007fc9a2c6b2064485e53f","src/timespec.rs":"79c7af1bfb12b56fd482b778dd783d82c6f3233b26bb11ae3dceb454036b1da7","src/ugid.rs":"6616c6e35b7e43aee5b150f1efae7a50711e0947943c9a96833dbe214ad9e85f","src/utils.rs":"337626dd40ebae8cf0cac74dd9efc6974f30522bea305fe99799a9848950771e","src/weak.rs":"22070a3fa6e526d851bac81c551aa5cb4f9e609687075999c6d50973eeec3a98"},"package":"1ee020b1716f0a80e2ace9b03441a749e402e86712f15f16fe8a8f75afac732f"} \ No newline at end of file +{"files":{"CODE_OF_CONDUCT.md":"f210602311e3f74b32f46237fd55f4ce36d798e85e3db1432ec667f63a7ffc44","CONTRIBUTING.md":"fb570c76cf924cd75b77bed52b0dbe1e87ce224dc3428c48d98301710dcc331e","COPYRIGHT":"377c2e7c53250cc5905c0b0532d35973392af16ffb9596a41d99d202cf3617c9","Cargo.toml":"7a5aed49d976d82bee1f69df0c99e9c5ef0995c4b8a6bb9d50de9ec52019ce99","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-Apache-2.0_WITH_LLVM-exception":"268872b9816f90fd8e85db5a28d33f8150ebb8dd016653fb39ef1f94f2686bc5","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","ORG_CODE_OF_CONDUCT.md":"a62b69bf86e605ee1bcbb2f0a12ba79e4cebb6983a7b6491949750aecc4f2178","README.md":"cbf71e9852fbab808eca12411e9dea24f898c6c259422c75f0afc5840db8f22e","SECURITY.md":"4d75afb09dd28eb5982e3a1f768ee398d90204669ceef3240a16b31dcf04148a","benches/mod.rs":"e260e67273aa0a37cffdc5cd451699335b8ee656c17275a0d0f2b4563c6018ca","build.rs":"15fa8ef2de968e5efba61f6017dfb2bbe2c14e5a647014c0b57d0de860af3e5c","src/backend/libc/c.rs":"112c419aa77ed4dae188f9b1df9822b6984a77e48fd9a7dbfca2ee44bd8e12d3","src/backend/libc/conv.rs":"c4b4a6fdcf2f9295ab0498229a780942b031a2847ddf2466f90884bfb30255f8","src/backend/libc/event/epoll.rs":"b74f268a6c189f6617abb7683a0c8b40834fd80de9b60efca4b6823887f396b7","src/backend/libc/event/mod.rs":"4514349e9b409aaa0cdc5a6485507eb03f531a065a6fe142c6dc07b538541532","src/backend/libc/event/poll_fd.rs":"06e2ce2fb30a45b90279ae753a67085e9f818a1b16d99cc92c525e2c46d61d51","src/backend/libc/event/syscalls.rs":"295a930521b345192caaf916b39189299f81f5f7c9f1aaed235baf3bf6f2f5fa","src/backend/libc/event/types.rs":"09e813690f44752708485e5a5ee59a43834a4a3e9577f2739b310c3ea8b4b64e","src/backend/libc/event/windows_syscalls.rs":"ebfac665c6676c4b803134ab8806be8aa2e96bdbc7799a19c544cd9069b35787","src/backend/libc/fs/dir.rs":"4ff9b5f3b6fad06cfb641cf74511c4b80186b426e8c2d67a1b6cba08466b5d4f","src/backend/libc/fs/inotify.rs":"5f56d6a98fbba82369d392680f2e4750f2985b44979aa6356b906ad21e828619","src/backend/libc/fs/makedev.rs":"89c679a0ef18dd41b3c6223bce0f329ad35bf6cadbf16e47b33fad3f312ba4a6","src/backend/libc/fs/mod.rs":"576b6fcce723fcd5fc76637abd3b3565b00ca0bac309b63aecd6b8ee005fa81d","src/backend/libc/fs/syscalls.rs":"95182e261d01245b2b803ae7cbddb6b13a852e39499e73b27f7e133faecf174c","src/backend/libc/fs/types.rs":"1b7ccb8a7908e9250b79d82cc5347ed61dd1cd46059ff305cba299676b3c34ce","src/backend/libc/io/errno.rs":"74a28780c2c570c0dd3bf36258115c071f6c94cc4912cbc71c469f630f3575d0","src/backend/libc/io/mod.rs":"746647bd864e4ec7717925b6d176cebdb392b7d015070244cc48d92780351dd6","src/backend/libc/io/syscalls.rs":"380d9be17ec7e46fdc24682aeae6410dcd8b10fd129090b479bb8ee405d9b5c6","src/backend/libc/io/types.rs":"8df53d41d72a39f334ed124707cb501e83b3624b769c80b78c62bd45179bc04a","src/backend/libc/io/windows_syscalls.rs":"fab3fa099aa89cea56a6edc651dd37750e581534f4f45b04a7e425f130b08468","src/backend/libc/io_uring/mod.rs":"2c6478857a0751625edabd61acb841819bfba1093b1faeded15693c805d84952","src/backend/libc/io_uring/syscalls.rs":"5af8146d5971c833e6fd657f652c618b31f854e1b0811864fba9b658cb633e19","src/backend/libc/mm/mod.rs":"8aa966faf3853d1a93d0ed91f7e5f4a53539b0287b25a5bfe489fa1d07f7cfd7","src/backend/libc/mm/syscalls.rs":"858e5bb3bc850b6a2d5ce69b3c8e40ab7cf75d392fe3a022119e5edd0c538db5","src/backend/libc/mm/types.rs":"118d7febf1dd559fccbb1275fc450216f2b7c8901fc393a4684a2a86b554af26","src/backend/libc/mod.rs":"e572b4461d4fe9a399b5db9c8395d6559ffe69586c76506d53d5d7fb37bb87cf","src/backend/libc/mount/mod.rs":"8aa966faf3853d1a93d0ed91f7e5f4a53539b0287b25a5bfe489fa1d07f7cfd7","src/backend/libc/mount/syscalls.rs":"1bc87501a078616d0190d2e85de55f3f968b8cb79d49bd9eb839a350eed26089","src/backend/libc/mount/types.rs":"8e2b66822cd1148e5fe4023f5608f36afb0d47bad454db9560fbca4b0dbd2b6f","src/backend/libc/net/addr.rs":"b6644e0169c6681084704e9ca231863364d81e3d3cb5d3689e0df8acf7b4ec16","src/backend/libc/net/ext.rs":"0ec74196ace553c9bff355e2e35ad3b70cab46e32f8f7194715e4528fe1f54bc","src/backend/libc/net/mod.rs":"605b818c6f4c536c96e052d9b843eeca79dccd1d3cf1c8b87e60c8539b8122b4","src/backend/libc/net/msghdr.rs":"f82825d40d8872e2e804cde32bbcc68bef43a5f48ad857fb1030550c4eb44838","src/backend/libc/net/read_sockaddr.rs":"4f9998daed06db74ddd25148c56b0a2b0636e0cfe457e19279f7f044b8b8bbdc","src/backend/libc/net/send_recv.rs":"1487ddff61de085915d9ac2e721a15a39307110b3008acffd2653810f00474a3","src/backend/libc/net/syscalls.rs":"bf19b7a9eaf67366e738f1c8f4535bfe097033ca326628529c83d62075125ec9","src/backend/libc/net/write_sockaddr.rs":"14e941b5a11e4d7a17182860c47b1ee972b56ff7f0aadbcc6ab2c8740b13cea9","src/backend/libc/param/auxv.rs":"fdc85b7c33bcd05a16471e42eb4228c48c98c642443635ba5fc3e9a45438d6d3","src/backend/libc/param/mod.rs":"5234b8f1bcb886cca6ea003d411d75eaeebe58deedd80e3441354bf46ed85d4d","src/backend/libc/pid/mod.rs":"2c6478857a0751625edabd61acb841819bfba1093b1faeded15693c805d84952","src/backend/libc/pid/syscalls.rs":"49ea679b96c0741d048e82964038f9a931bc3cf3a0b59c7db3df89629b9c49e6","src/backend/libc/pipe/mod.rs":"8aa966faf3853d1a93d0ed91f7e5f4a53539b0287b25a5bfe489fa1d07f7cfd7","src/backend/libc/pipe/syscalls.rs":"8affde100f6a9dfc762b79d1e48be5c1039be414f8ef7d5a6acaba882a68d259","src/backend/libc/pipe/types.rs":"1e797beb383bb2e4038f1de21bea204caec4a4922b25a6ef84dbbe6e953e78b0","src/backend/libc/prctl/mod.rs":"2c6478857a0751625edabd61acb841819bfba1093b1faeded15693c805d84952","src/backend/libc/prctl/syscalls.rs":"8a2684f444a7555098dce2b92270d81cefdae902716c6e5d59bd7b0657e8a29d","src/backend/libc/process/cpu_set.rs":"b3d36b01b53b0b6c61a20ed8a69d48eccdd90cc17f82f2926ef1e844f002d0b7","src/backend/libc/process/mod.rs":"d7dc401255bad2e55ffff365339cdc3aad306861d269ad727a817d3cd7763166","src/backend/libc/process/syscalls.rs":"b0b66f4ab88bf92fa906a2691de932fcc5ca6d29052e8cc782ba293318845c24","src/backend/libc/process/types.rs":"5b2d6ba1ba1e5f0db9dc07335df140f957fbe8ce9db5ddb74d2341fc986fe962","src/backend/libc/process/wait.rs":"0cc556aed976b4bbb3965f74fd76b8216c755fce25043b7b21ce54afa07c9773","src/backend/libc/pty/mod.rs":"2c6478857a0751625edabd61acb841819bfba1093b1faeded15693c805d84952","src/backend/libc/pty/syscalls.rs":"ff7068696e23103bbb75fc7e32db09941b864f132e9fbab407e7a5216d0059c4","src/backend/libc/rand/mod.rs":"8aa966faf3853d1a93d0ed91f7e5f4a53539b0287b25a5bfe489fa1d07f7cfd7","src/backend/libc/rand/syscalls.rs":"78c7201e6bcb75e9cab9486d1878861319f865de2b2c46437be68690bd17bf13","src/backend/libc/rand/types.rs":"7763e6b40e4b9df825fdd2aa5ba1770da999137d04776561167116c58f8fa618","src/backend/libc/system/mod.rs":"38563ea68829ca5a4b1b0695ac8a5c05718e85bdc88a36dc805efdfce45d3909","src/backend/libc/system/syscalls.rs":"846dfb59afe40bbfc78e57afa76f0616d62d25da2daadcd872aea6fa32aafc3b","src/backend/libc/system/types.rs":"6871e16aee14fe2ae03cea798c3e509ffe44778a9c0e5608fd73e2e015876d7e","src/backend/libc/termios/mod.rs":"2c6478857a0751625edabd61acb841819bfba1093b1faeded15693c805d84952","src/backend/libc/termios/syscalls.rs":"94ac755d74b93fd2904a25862e74585848713770d15038c6b29ed743f565b0ab","src/backend/libc/thread/futex.rs":"b666828653b12634bbd7fd709acf69641b648ec40962a1d4f904c5db14d2eff5","src/backend/libc/thread/mod.rs":"fa710053974d7f16a6c49242ee6c10a3b9e1143452b9daeaed8837302a679fff","src/backend/libc/thread/syscalls.rs":"120cb13fe7ffdef7a52ca1d141d31bf189176e9f5862f87bb171d54370a682a9","src/backend/libc/time/mod.rs":"38563ea68829ca5a4b1b0695ac8a5c05718e85bdc88a36dc805efdfce45d3909","src/backend/libc/time/syscalls.rs":"f82e0725c5af8a52e61ee83aad2c77694f2f7a72ac1e6eb284109a70ac6edc38","src/backend/libc/time/types.rs":"d4e55d2b9fb8de772c8bf5bba157472c49a12c25502e62a9c599a2e6d3196a5b","src/backend/libc/ugid/mod.rs":"2c6478857a0751625edabd61acb841819bfba1093b1faeded15693c805d84952","src/backend/libc/ugid/syscalls.rs":"8edf91b8790add23902c9f5418da6b0723a371677f29f490e0c8af852f0f1a0c","src/backend/libc/winsock_c.rs":"3bf3884fd250eca806ffdf96da68e29c133a697810b78b333ea449e523e58562","src/backend/linux_raw/arch/aarch64.rs":"2a255c9135bc8a321c180f52b88eb2b158bc9170cd222149caeae63c24587d44","src/backend/linux_raw/arch/arm.rs":"165bccb5883d0136e55d42091183765f83d86e9d37a7cb2cec9ae8af32774db6","src/backend/linux_raw/arch/mips.rs":"24af364aa93fd4b9917639d473336490a143f0d1723b09f388e72d534160ee51","src/backend/linux_raw/arch/mips32r6.rs":"e436a2ade34f2f7c58b8924462b07a2499dfc951e1e1318d51759444fb8b658e","src/backend/linux_raw/arch/mips64.rs":"897da9ddc877963ad59464d7f81dc59df8a7e91251e6adea14cfd946e2740a1c","src/backend/linux_raw/arch/mips64r6.rs":"3c08aea13c1139fb0dfbe74ca3d0147f007c3aa2eda641afb82c46f6aa4f6cd1","src/backend/linux_raw/arch/mod.rs":"37eaeea601d39be00d170856a31a8ec6a27b0d3ac22ab3ee642ab0e45dee237d","src/backend/linux_raw/arch/powerpc64.rs":"dfb001f8636a5e46d728900b0804fe6c374e5e18a6f0e76d7d62e0c07da74477","src/backend/linux_raw/arch/riscv64.rs":"41d33242d941030f46077dc2b1bc4c7913fe7630d693a5a7eef966bcf38f9d8b","src/backend/linux_raw/arch/thumb.rs":"2fd979ab421248c0a4c592bc0cefee63edc26528f469b71b63eaed35356e42e8","src/backend/linux_raw/arch/x86.rs":"81c73c0a13925854b54db754f533dec565b1db2d9586e210a2450c6f5915171d","src/backend/linux_raw/arch/x86_64.rs":"e929036a1f3cf93ba538f4523b241605cc7b5e61f84ffe6d9d5cdbcb6f73e543","src/backend/linux_raw/c.rs":"a75bef457e00f9584389bc670ced30c3153fce290c0660674b55b1bcc49eef72","src/backend/linux_raw/conv.rs":"bd1a3254b0d540536443fe73c2be2d2b4f955a282026bd028de3dfc387e7821e","src/backend/linux_raw/event/epoll.rs":"9a53e7e0fdb3c1ece8b1fae75e7a11578fd3495122a7e00dc6debd67f4dfa2f4","src/backend/linux_raw/event/mod.rs":"8ae516c22aa6c1a8a7f568a3c95329d6a4b4fe26ba19aa5cf075a92ffdee9d75","src/backend/linux_raw/event/poll_fd.rs":"78d040f7ce0574fc18cebf6b7766c210a3254abdbafe175f51c6b460fa19c514","src/backend/linux_raw/event/syscalls.rs":"52a784855ede12e5e1ccacc7a39fd2e2712ab3270c757924dbf488432d7b7d03","src/backend/linux_raw/event/types.rs":"2ffdcb728587dbc25d302527f4a52296b96013d5199c946291b059ba4f7d466f","src/backend/linux_raw/fs/dir.rs":"d871468c08ea22868f308ce53feb1dbab8740d577441a4f3aadd358baa843d27","src/backend/linux_raw/fs/inotify.rs":"d1c79249e2faddff46ac1c2c460f6e00032d7629c17e294acb00d5914fa09ffc","src/backend/linux_raw/fs/makedev.rs":"c6b4505c4bcbbc2460e80f3097eb15e2c8ef38d6c6e7abd78e39c53c372139e2","src/backend/linux_raw/fs/mod.rs":"8689e46f9c4c3e1190ae5fe39176c573cccac10b3739472128ca237f41e2686a","src/backend/linux_raw/fs/syscalls.rs":"cdaef997f619da52866e7428cc24f9e5c815fdc0ff53a381a9857dc39e9c2e90","src/backend/linux_raw/fs/types.rs":"0012ca496df786dc0e53f31d29e7c5505702aa89effe8d614a6299f707fbdd1f","src/backend/linux_raw/io/errno.rs":"8f15d735435b722466696094aed8b612b8526658ab7e079f386037cf8a3b1a6e","src/backend/linux_raw/io/mod.rs":"7ae2324427892cca6f5ab53858d847b165f790a72ec25f3d99fb15f0506c9f27","src/backend/linux_raw/io/syscalls.rs":"026f99b397ae521ac4b2ba41acec6547018073a9da5fa355aa8f9ac61298c172","src/backend/linux_raw/io/types.rs":"0cfffdc2fc9c33faa4055f9686db5922676f17d5c069362bae3745f39da3594a","src/backend/linux_raw/io_uring/mod.rs":"2c6478857a0751625edabd61acb841819bfba1093b1faeded15693c805d84952","src/backend/linux_raw/io_uring/syscalls.rs":"0f7c9cb7ccddf5687e4b9e5b23558871a452a29ac6095a0184a06c47b9b18eb6","src/backend/linux_raw/mm/mod.rs":"8aa966faf3853d1a93d0ed91f7e5f4a53539b0287b25a5bfe489fa1d07f7cfd7","src/backend/linux_raw/mm/syscalls.rs":"369abe984aa972d8083fee20d764a8d57df242c66f897066367416f2fcc832a3","src/backend/linux_raw/mm/types.rs":"9aca15c809df0322bd7a3e7b47b63220bb2727a34b38ce599d69e684d867da68","src/backend/linux_raw/mod.rs":"a0a14bac204a57ea0bb2937f74f22f5bd5992288287727cea7c7c7c4d930f2ca","src/backend/linux_raw/mount/mod.rs":"8aa966faf3853d1a93d0ed91f7e5f4a53539b0287b25a5bfe489fa1d07f7cfd7","src/backend/linux_raw/mount/syscalls.rs":"3947261b5d46b9737f02dc5352c3a3a35c63c461fd75bcd8ae6619dfc0bfb54d","src/backend/linux_raw/mount/types.rs":"8d39c4d6e555c88de5da3115a301562fafdcb3942aa69a0e01d42de8edb1c78f","src/backend/linux_raw/net/addr.rs":"fbb6c071a8ebc2c557c7013d36d4b540c1ff6ed63103d0a8abcacd8977fbf5c8","src/backend/linux_raw/net/mod.rs":"bc9c9c4a8c06b1fb8c57555261176dfb1f3e858a1d89cd2f88e1f31fc126c001","src/backend/linux_raw/net/msghdr.rs":"3198339ccd00224aefdba74e9144818fe387222066a387a9dfd95fd8c48cf9d9","src/backend/linux_raw/net/read_sockaddr.rs":"24075ac4c05fab5fe44aae4445cdd12ec7e474f047150baa9b768741d6b9693d","src/backend/linux_raw/net/send_recv.rs":"0ae37eac8b545cc1cdc149c601ed831d5c9acc3d229f9436029f3ba443a880f8","src/backend/linux_raw/net/syscalls.rs":"2e0532ade90118af2c1c6f48d01d90df06d719fdaf3d356df567927f2a47dabb","src/backend/linux_raw/net/write_sockaddr.rs":"0eeeb7ec8dadf95503a2f89fdc933b8f9c7e45e03fdb343ce490b6cc8eec0f96","src/backend/linux_raw/param/auxv.rs":"ed9e040cc3fbdd39862ab7388d33d6598e1ac72ba3350d1356d4c09e3e641c7e","src/backend/linux_raw/param/init.rs":"8616665e4db7d8b44fe8f8552c4ef16164bbdc0354e285f72372cabb90fe47a3","src/backend/linux_raw/param/libc_auxv.rs":"6f6aa41d463554a6fba09aa7b32e328c3ce70b74739fca0c8437610f1d923362","src/backend/linux_raw/param/mod.rs":"2e6a1a1c00351b9c88bd615aa923f71d76208df5626dd9bea03067f28f81dc31","src/backend/linux_raw/pid/mod.rs":"2c6478857a0751625edabd61acb841819bfba1093b1faeded15693c805d84952","src/backend/linux_raw/pid/syscalls.rs":"eef6aa01830ddd510b83f507da2002c03e58318b73744be2c06ebbe33c4f194f","src/backend/linux_raw/pipe/mod.rs":"8aa966faf3853d1a93d0ed91f7e5f4a53539b0287b25a5bfe489fa1d07f7cfd7","src/backend/linux_raw/pipe/syscalls.rs":"366c730fc3e991bddb9f5a15b8c3917a8e6ace6d1d5a9113b2749e476faf6f83","src/backend/linux_raw/pipe/types.rs":"9d4bd3da7cd078d42574ad7d6b7554e301a1a7e97b292a77993a6d263726ef1e","src/backend/linux_raw/prctl/mod.rs":"2c6478857a0751625edabd61acb841819bfba1093b1faeded15693c805d84952","src/backend/linux_raw/prctl/syscalls.rs":"a18b224307e0d27bda9b7b85c75cd6c7ddfe39f5ce52efb7bb0bf0585b757343","src/backend/linux_raw/process/cpu_set.rs":"dfdcbdf35aff6a3e08e7d38193bf18c12ca8aa64eb0dc417667be82dcc0f7c55","src/backend/linux_raw/process/mod.rs":"fb393c70a9c63ef9a6bf1fb5a2dc94f07d6b0b6987cc5231c15c607015dafd68","src/backend/linux_raw/process/syscalls.rs":"375d0a61b1c8099d82bf75c9652abb766c6ed8963a292c83e1b6473573eae241","src/backend/linux_raw/process/types.rs":"6811ba822bc12a1a6336649151b4adb1f5d3365684a31c07f01953ea9547743d","src/backend/linux_raw/process/wait.rs":"921aee4b0048746087f52615a98edc2aa0fb4b53d6df44be4533098df55d1b05","src/backend/linux_raw/pty/mod.rs":"2c6478857a0751625edabd61acb841819bfba1093b1faeded15693c805d84952","src/backend/linux_raw/pty/syscalls.rs":"ae09c4aecc0ae87b1ca58d82efc58007b9dddaae78460d615f48da19d1cd0f89","src/backend/linux_raw/rand/mod.rs":"8aa966faf3853d1a93d0ed91f7e5f4a53539b0287b25a5bfe489fa1d07f7cfd7","src/backend/linux_raw/rand/syscalls.rs":"a84f70251672e92f253838bf05e989434f67373233e88d21d8835cbb792b1fe3","src/backend/linux_raw/rand/types.rs":"b7217c98f2da4ecf89225f36eb52c396ba2a73debdeca739ba864a9030b6a23d","src/backend/linux_raw/reg.rs":"39b6234971122d247054bda8c2dc3b44493be30482635baa9e2fcbe048e78cbd","src/backend/linux_raw/runtime/mod.rs":"b2cae8cce3822c3c92942f06ea0b68464040dcac33c6f0f7ee392c6269993347","src/backend/linux_raw/runtime/syscalls.rs":"fc9c9edbe07dd7644ab75c51a1597a31467a3421301503a072bef93e6df07643","src/backend/linux_raw/runtime/tls.rs":"8d3c5c1e84fce4e3808997176fd40110afd9ce7589f5291ef682caa81549210f","src/backend/linux_raw/system/mod.rs":"8aa966faf3853d1a93d0ed91f7e5f4a53539b0287b25a5bfe489fa1d07f7cfd7","src/backend/linux_raw/system/syscalls.rs":"4689360343c414bbf99516478076b512bcdad8c9a33aa76756185eae81c84412","src/backend/linux_raw/system/types.rs":"1ceab8d738a71043473b26e97fa3fd79d588a86d4774cbc9b9e1d4f1447a016e","src/backend/linux_raw/termios/mod.rs":"2c6478857a0751625edabd61acb841819bfba1093b1faeded15693c805d84952","src/backend/linux_raw/termios/syscalls.rs":"c8bcd3cd180ea4a78842551a4095e5d18f4c5ea029c2286f636e1237f22bfd0f","src/backend/linux_raw/thread/futex.rs":"0aa0f9f5be6a79de81e82c9f11f1bf8831f682a4b2f6cb29669e1591636f084e","src/backend/linux_raw/thread/mod.rs":"6ad4a4b90b9234e79900b27ebbe8837e3a7a36aec532912e3e253edce5225067","src/backend/linux_raw/thread/syscalls.rs":"0e3dca63be7322e1e9c58456b28eb8548abb9f08b4436b87b139e891c01c446d","src/backend/linux_raw/time/mod.rs":"672724f55b7b7be6a7452bb1cc2d28b5f0aaa840a2856fe363acce624e1beefc","src/backend/linux_raw/time/syscalls.rs":"451da0bbb66accdf58ee7f2f8746a93b22ee985907a08717a3d3b1650457d878","src/backend/linux_raw/time/types.rs":"56cb936dc36af759e06d0b7bcfa7db02818dff6084c1d1d9a538a6d5945032d5","src/backend/linux_raw/ugid/mod.rs":"2c6478857a0751625edabd61acb841819bfba1093b1faeded15693c805d84952","src/backend/linux_raw/ugid/syscalls.rs":"8c86d251db33b399a1d1cbb8e87afe650b78db84f444d3251309b7a0480b54f7","src/backend/linux_raw/vdso.rs":"d6daee00f7b790970b490a4182a24c143372faa8ccbbfde56db570519481a3a7","src/backend/linux_raw/vdso_wrappers.rs":"60bbde4bed863e067e7c6804b03f2620d06d7459fb3cd1560d4ab1a0cd99df69","src/bitcast.rs":"67b2d5b65afa37730003e96c37b3e890fe51eb2438a69673d75bae7d9b036aa2","src/check_types.rs":"bc31f9b293bfbf272284ed4d0da24e941206a1ac3f18d3abb0b1a61f1ede1dae","src/clockid.rs":"1d2e1cfcf23160b55d6b046d235edf2eb2408f072a8bdef3e3a3871885abdd5a","src/cstr.rs":"9e3fcd57d6af382a9a4f24b97a29eeb05a3ccd5c8fefd666884f6e4438b3c4a3","src/event/eventfd.rs":"81cbd08f7bdf40a6ce1ca692b63da1dc8ba925282990668d9d68f1203e839fa1","src/event/kqueue.rs":"f13f40b97c4413902115408fc2f340e7c82bba42d2468015b007e8ac6ef23132","src/event/mod.rs":"c581952b280963c685473ea36cbf156d5c0c0b74eab80a6ce4f1de42bda4f9be","src/event/poll.rs":"0ee583dbd457a573a82a06c04a2a24bd2c76e751d27a435507d55338e2871327","src/event/port.rs":"4e51ff150e5d17cbd44aa64a38b99c15e26eaaf2e350768b5dcacdfde4fa5212","src/ffi.rs":"c2b8b38c02d72749aceb715c496726caba1f1fa989ad3856d0103a2fafed89ed","src/fs/abs.rs":"d5cd89622f45386dc6a44356dfa5cce7a493a2a69b398c22096e5426b73a6cca","src/fs/at.rs":"dc65a4a70c718e56b3f1d7e8520a99ef57aecb0f2b0fe7e2d9248f9648729ba5","src/fs/constants.rs":"24076a01f8bfc126b0905e9bc0521d2c3a3abc6c3b8c86ddb1e545070d097127","src/fs/copy_file_range.rs":"d3b644374390d482b2ff749a2459458872b57d0dcf9670368739b7833509a7c2","src/fs/cwd.rs":"9f429a79ace6e17455634da09216ee0ad3d067a4541518b3193ae6a8d9ff1e26","src/fs/dir.rs":"347a52f4ca9ac6321c52e802e97ec90d1b4c62ec955c8996fc17f8f5aed69966","src/fs/fadvise.rs":"beef66ebe1310fb92628240b2cde68f744c78e50f6ff61bb1404bd4868d9cae8","src/fs/fcntl.rs":"2085102d05d0ba963e100ab3e3f19dac4ff27d142fbf798626d20a2a596ba96d","src/fs/fcntl_apple.rs":"e2f23f038083621bcdecc98d02ce1023508afaecdb2ed0fba5c8b70f955301e5","src/fs/fcopyfile.rs":"ec95929cbbe02cf49233a785e5238931bb107b7903cc5bc95e4231de960995f2","src/fs/fd.rs":"7ea8cc7da291004d3f19ce6b91af1245d7c385807217076747533e9768a5c1ed","src/fs/file_type.rs":"fefd865f91011f66126213b0994773d99e373b468c31e866002228c98c64ad85","src/fs/getpath.rs":"28f6970fc1bbc37bb35c84724b59eac436ea7407a4522e18c2bdacb1fdd2edd9","src/fs/id.rs":"1b5c8a8baf9a9bb1f895f97189cea4e5982a0d35b192afeec6340a6c6222e0cb","src/fs/ioctl.rs":"e798eb41bbc201c375bc295ad2928c2467b45b4fbbff3c82236dccbc0d6391a5","src/fs/makedev.rs":"85520b484cb7c15ab71ea1c368578ea3b7e484d82f8510db92b6ce9f7ca341ae","src/fs/memfd_create.rs":"15a8f28e040cffd8c24c7903483440f88853b2e538ad48d80f3c00b4b2befdea","src/fs/mod.rs":"ecd20bf01d651b1866b198c4fc0dc8e7d681eb581e28708c8a0abd062de137ce","src/fs/mount.rs":"c96cacbe65aff4c43fc2f5be03baf2b523bda151ade1828b691de1d040d3b2e6","src/fs/openat2.rs":"4a95c15dab533a41201b5fa25c8a212956b7571d58cad696bdaf45af8aef96db","src/fs/raw_dir.rs":"c24d1f963a753397a52fb2f8c49650e067dfc3a297988c0737e458f33a454b3a","src/fs/seek_from.rs":"a9efa0feb9ac789cf47667e91efee2e3f2dcde16cb3b7a928c99da640fa0e0d6","src/fs/sendfile.rs":"e3b2058741cf4b1698f34d84bb37130cf2b72806d522a16fe541e832cde136cb","src/fs/statx.rs":"2884f75e77f9a1c59dbf55cdcd38429104af0364cbbadc550f4840c6fcf19c54","src/fs/sync.rs":"a3b23543834281f347b0f873bd38154d31d404871188ac08f2b20b9196234cfd","src/fs/xattr.rs":"b976eece822f69e768d91e61d86ee990ea18097b20f7ebeedaaf718c61b48962","src/io/close.rs":"0aa3cd05a8fed8e5244f97b8b6c2e7f65ed93a4e5435c6329852bb3da7514440","src/io/dup.rs":"a8a59c5d345dc54c57ded890720c33eb78c4d53917c71e8bb6317f7ed122cb87","src/io/errno.rs":"58a4d20ba0924e4d514e3c876fbe08982f1623187642ae14780815e65989c8c8","src/io/fcntl.rs":"c0f7bd7fce1119b0c1d0085b7ab77d5df02470ae3e06035428a2452dacbec296","src/io/ioctl.rs":"a47a5ec14607142f2c2ffcb93d016b8e86c8b15ba94b56b35382b545db62ea34","src/io/is_read_write.rs":"1bfb9ee5d58e0b29b44af12fe2668c7bccc841358698dcde47f1519ff9bb73b4","src/io/mod.rs":"75f1d0646be1d4c7c08b5887d8119b0103be8c25c43ccd4e0e97015508c0bb8f","src/io/read_write.rs":"54ba528b11601af1338bb0c71a41b256a0033076d30b3946c3fd0bdfa61dd021","src/io_uring.rs":"9ac767310d9bf50a7419c212180b0a0bcc4c7f25903fb6e4c31161be277f6fb7","src/ioctl/bsd.rs":"e33772530b1b2d1e7d61ce53d9267e68d88f7f5df13301f90412d89a46c6faaa","src/ioctl/linux.rs":"286833dd01aa72c0b06e1d734e2d84303455626f5d7ea4a71619411e75a1e965","src/ioctl/mod.rs":"f90f5e91a7362ba94261f2e1c75ecf1f21722a722cc279bc1dddcb840b72cd42","src/ioctl/patterns.rs":"ce7a10d1d4f6bc96c054871f383937ccec5452866ff1ef524a7a811a37b28702","src/lib.rs":"0e8f18006a86e69bee387c91f7598c4b81ca33425dee7c97fa433dd7a7c729e2","src/maybe_polyfill/no_std/io/mod.rs":"77889bb5c5a4f2e50e38379cdaa5d0fef4b0cafc3da056735df01f6deae75747","src/maybe_polyfill/no_std/mod.rs":"ec94a4aab4bc475785e469d10fd6bc95667e1d47d958e9cff3a19049d88c8c80","src/maybe_polyfill/no_std/net/ip_addr.rs":"046327ee244f758f2bc31d3be305d8cd0dfd8342aac1add8259e999b4b46c4a7","src/maybe_polyfill/no_std/net/mod.rs":"b0ee611c454679226a15bf647e7779995f3fe9c8e0507930a0d0613eb414b7c2","src/maybe_polyfill/no_std/net/socket_addr.rs":"bfeb32d32c176cde76323abcffebfc47e9898fb8d7ce3668c602dc8451086a2d","src/maybe_polyfill/no_std/os/fd/mod.rs":"d9dfe2a2c25be727847bcdfe6f4898685af2521850298178ca8d46a8e2ceee88","src/maybe_polyfill/no_std/os/fd/owned.rs":"283c656a4d40b60d137c9412a04d22878e9849056311a7464061af8523c81c08","src/maybe_polyfill/no_std/os/fd/raw.rs":"9cedb353580b932879ddc4dee9936212fefb6d42530dc5cec519a0779d5dee33","src/maybe_polyfill/no_std/os/mod.rs":"27dab639a765827644005d5f2fcc7c825310606b889cc8dd83f54c9528350dc0","src/maybe_polyfill/no_std/os/windows/io/mod.rs":"5bbcc05c83fee5026dd744a994e0458469466d5be39081baa62df07753b92fd2","src/maybe_polyfill/no_std/os/windows/io/raw.rs":"4c32609a489dd938a49328b5637cb3bafb96437f2f9f269ab66d7d3cb90247f6","src/maybe_polyfill/no_std/os/windows/io/socket.rs":"c658f42f24eff44a661f2adfd24a11af80fe9897f3e2af4dc5d2c64808308d65","src/maybe_polyfill/no_std/os/windows/mod.rs":"fdb416f8f231a4e778b5f985b9ae712ece5e1a1402963ad1a5f6a8b9843795f4","src/maybe_polyfill/std/mod.rs":"7c16c86cc73e226e65ead598e4018238b22000a345040b706bf1e1b3eba115fc","src/mm/madvise.rs":"3c262b3713a73fafcedf1b04bb12c048bb11d47ca43c959e5dfa48c27651f4f0","src/mm/mmap.rs":"fc32e308a24c6f351d74306943d67a68093a0b6555b4bdf6cd755bf43795f406","src/mm/mod.rs":"b3a6cb838986d45825b912355cedead761211a494ca6f89b2367a2d2157e340e","src/mm/msync.rs":"9dcfe5f54235e9314a595edb8d548ac79d222bbcc58bb3263cf7e96d603b23ad","src/mm/userfaultfd.rs":"8073443bd181ff0b3ba4d0b1ae67370b4864035a0c8b4898cd709dc47c518ae7","src/mount/fsopen.rs":"160e384e9175fd98669cda1cf3590bb195c2ba7e1c724e9ea06e692595e58ba1","src/mount/mod.rs":"5f0c9df4727592695deb1cd63ae1de021b03dcd9d0d1b68e1f34d12a7136cb19","src/mount/mount_unmount.rs":"8ad11675e5d762d33fbefbed06a6a9f9e52a9b689bd06662446152614321ab77","src/mount/types.rs":"601ae3e10b7dc496fed7f3b40a80e81c6edd7bf13189d7be45c3212d4c684c39","src/net/mod.rs":"a6bc55f9e086caf46a7c00783498d73a328a66f2a991f1ec65d5f13931377b0f","src/net/send_recv/mod.rs":"f33e39c7b228cd8109823b0a0a1aa397cddad504d49e69b36f74c5b84e5070e5","src/net/send_recv/msg.rs":"19caae23209c8de1939687055c230d832a3e45c1dc92cc4fc785edcd7789e849","src/net/socket.rs":"bc825a94831557bf4c2cabd8ef5ae21ffe0986c24f9ada564eefa66270f69ae9","src/net/socket_addr_any.rs":"d07f9e9ef8873aa5bfd85f669952299286ef6f2cc5b9fea383856432e61b850f","src/net/socketpair.rs":"56f4885c31d2664cd16e18a9a88792a4912fedd953cec36dba67e8581fd57921","src/net/sockopt.rs":"3587396e3a595d5e0b5335506b1f506ccfe00219b3ae34092c12f0a4b4a822db","src/net/types.rs":"efe80f74de928ef88f57adcf65310db165eb58015e34d3d9c4e13fec81c4061a","src/net/wsa.rs":"6e546b42f50a851fc833c57cda76cfb347203ed4b0dea574a3d325bf5a2ebf80","src/param/auxv.rs":"988872f9bec2e12f35765ae8963cbb9535d4acaedd4c9a4d07ced6feb70e0aaa","src/param/init.rs":"a31c0e5cea61a1a999767fe74f87c0d59eeb6bce66578b842fe0e0c32be27a55","src/param/mod.rs":"25b10acd5b1da8faa6f5204e6b0379b38bfab667916e886cca64bea01a42dec2","src/path/arg.rs":"ca42e3283e52461b048923f527473847094d61c8f900a090cdef8a220d04e3d5","src/path/dec_int.rs":"fad9793b89eac526953b994cbed6b614f01c25108f9763e19fb98029feda93a4","src/path/mod.rs":"6b1b949c94bcc47e0f08a3f8e8db5b61ff497d0dfd3e0655f51c01d3e4b7dfd6","src/pid.rs":"26bddad73b279de3e496d2ae8d3304e652a0072da82558f688a702c8b05e5c95","src/pipe.rs":"84b90fc1c7f657738c40ffe10715054b69b6f5294015e49a9bb31afa6975e137","src/prctl.rs":"c9daa9397460a27ed6e31fc454fc40dff83720312a002b66f4c178fc005379ec","src/process/chdir.rs":"2c1ebf9bcf8141a98fca814fa88a659674b54f3b6325276fdd52e4f97746b0b0","src/process/chroot.rs":"2b5f6124eb19f26ad2705174f7ad50cdc0a5d15abd59ffcf55421228d82130b4","src/process/exit.rs":"48de66e5504a00cb375d8f415ce63b6225a3f5204268d40726a7d0fbba43f587","src/process/id.rs":"d815b4985336cb0d56efe27e329b9979d7891fba0f32ee52b6732105c593658c","src/process/ioctl.rs":"5b920ab0a7c9e7b5d50235ce4065304ee272f4edb3252bd7d625f1c0d9d78a10","src/process/kill.rs":"7b879e5cff8a064acd0e7488f4e21bd4e4a8506ce380688b72cc48d283ff9c89","src/process/membarrier.rs":"d6c8821ec73019040c926f4e1018f399c286e87074ab9c6692370c88772af044","src/process/mod.rs":"0ef104be820068409648ed83739a51a7dcf07612088f9a6ed6c7ebdb6ad54092","src/process/pidfd.rs":"4be2fba21430ba84244e11c636c91201bc1d1dffff3e63a4da84cc96f501786b","src/process/pidfd_getfd.rs":"cbc42a1548280ae76c3c66e851fd53cc2a3d4c089cb5798c17a2cdf654f0e229","src/process/prctl.rs":"818c7512af581e933d0136b5034966be790fef1bd007c0f0519ebab360ea8da7","src/process/priority.rs":"f135482e71ea8aa0daf92b9f238051178a4c904070fa8409622f94155df3c544","src/process/procctl.rs":"3a1c705ea6405dd1d653f6fec374167c3228ff85cbf8de38629ac32b1e9babbb","src/process/rlimit.rs":"10b79de3ced0e64059a94c879742d46a35a6176c776d8eed75031d5e6340283d","src/process/sched.rs":"7c3bfc5be624e7d7f5e043c3ee0b0566fcab3d684d61c272e7b4233410ab1c42","src/process/sched_yield.rs":"6565faa3928b66ddc74a65e893e15edfa4b9be4f7e5f5f68527501a7f6bc3350","src/process/umask.rs":"1a0f31a842303c978e3f05ec191e2b5e96104c09c6596473b42b1fac34898a50","src/process/wait.rs":"1af98ca39d8816233d2ff8b2ba562afff23265e31fcff2fdd4b2556fdc0cb505","src/procfs.rs":"be94a10adf18c57b555f89814471f598426d2c1be09aad3b4bafc95330ebf174","src/pty.rs":"b68e7420b993c2c454a1b965e9852fc546c6f1b6e63f9cfecf81be50935d502c","src/rand/getrandom.rs":"1c8166a02a74f5593bb4673ef907524df04cbc1568020a5ab2ff7f4aa1283f8b","src/rand/mod.rs":"cab59332aadd9b679f5b22cbb222d48ee028af5eb9fd4a4d43922da659b895d7","src/runtime.rs":"3d3707d74d56520a8317a4f2b0fc0b3dcaed4d18e4bdb3a431015702893d535a","src/signal.rs":"c071b4f011deef19a679d7a832d5408a3cd68627161d6510008d6312266a2611","src/static_assertions.rs":"39986672f489949be1d6469f0c30fb7d2eaa21bdaa2702a8c150b2b150bf5535","src/stdio.rs":"a5de2d7d9c3c5a901f88b6acf4754687c958a2f3a93c7945c2b8fcb948d468af","src/system.rs":"714bcc2a26ea19ac3f019198d7a25e455aaeaec850c1d173706a082fed3ee031","src/termios/ioctl.rs":"a1ac967f7811a482f8bb53847c37c8359f518cd26da9df7b816ba678a0139623","src/termios/mod.rs":"b44b7caa60b6f458657ed58a0e0eca41bb4e6d6be4b0f042bbb8ab7056cebe4b","src/termios/tc.rs":"e41312d15464b83b2457c2502fc3f3b9998cfb02ba68739026dd4285cc7130ac","src/termios/tty.rs":"d59d1fd32dd1db4ad9492d9d55da563bd0477919ee954260d2be274e4516749e","src/termios/types.rs":"8b76a0eeecdd36f2f2056b73d4ecd9ddc22da205d8c87b85e8a4f957c37e511e","src/thread/clock.rs":"469326c822dfb63405ee8537552cedde0b344978280e6645bbadd47dedc71e18","src/thread/futex.rs":"985f9a0dce1e2a4892ae7f26bd1bf119ceae3f9fa6b4707e166624fc1cee76d4","src/thread/id.rs":"ad72db4fea9fccb728310bbfd01ef8c00f6cc60fa2a750f6349646a134f7009b","src/thread/libcap.rs":"a3e316e6d0f58b075125fa939b9b824e1595de20a23d341a36999416b0d10d36","src/thread/mod.rs":"98634ece0b882f123ad887017692f2a4d94a23a1dec278ed660b3497cac5cceb","src/thread/prctl.rs":"ebb271914bcf4f9bf4251434e283e4f06c52a3a38628462dadf02bec84a81b99","src/thread/setns.rs":"730badd8db8ce7b905767b341211f1226eeeb38019727bf994eb64f2531b7b7f","src/time/clock.rs":"e59a29f1bed8c31c3d5b6fad60f2d4fa6cab8dd8e86148bb3693a5e3a1ce735f","src/time/mod.rs":"43afee938c80d124d04d4ba190c03f4d21d1e3bfc154fff309211e4f6eabe940","src/time/timerfd.rs":"f17092b84553741aa2d2b44c6992b5d2c8c96cc2c2007fc9a2c6b2064485e53f","src/timespec.rs":"79c7af1bfb12b56fd482b778dd783d82c6f3233b26bb11ae3dceb454036b1da7","src/ugid.rs":"6616c6e35b7e43aee5b150f1efae7a50711e0947943c9a96833dbe214ad9e85f","src/utils.rs":"9ae76f8a41d6cc350cdd58c9084b5c3a5a708eeecd769783debdbcbaef442182","src/weak.rs":"c7cf03bf2aeba494b1999ab32183fa8c603ab72e254c0e312a67f168877e410d"},"package":"747c788e9ce8e92b12cd485c49ddf90723550b654b32508f979b71a7b1ecda4f"} \ No newline at end of file diff --git a/vendor/rustix/Cargo.toml b/vendor/rustix/Cargo.toml index 8b9e45319..728c75d8c 100644 --- a/vendor/rustix/Cargo.toml +++ b/vendor/rustix/Cargo.toml @@ -13,7 +13,7 @@ edition = "2021" rust-version = "1.63" name = "rustix" -version = "0.38.6" +version = "0.38.14" authors = [ "Dan Gohman ", "Jakub Konka ", @@ -78,7 +78,7 @@ optional = true package = "rustc-std-workspace-alloc" [dependencies.bitflags] -version = "2.3.3" +version = "2.4.0" default-features = false [dependencies.compiler_builtins] @@ -99,7 +99,7 @@ default-features = false version = "1.0" [dev-dependencies.libc] -version = "0.2.147" +version = "0.2.148" [dev-dependencies.libc_errno] version = "0.3.1" @@ -139,6 +139,7 @@ all-apis = [ "thread", "time", ] +alloc = [] cc = [] default = [ "std", @@ -175,18 +176,25 @@ pty = [ rand = [] runtime = ["linux-raw-sys/prctl"] rustc-dep-of-std = [ - "core", - "alloc", - "compiler_builtins", + "dep:core", + "dep:alloc", + "dep:compiler_builtins", "linux-raw-sys/rustc-dep-of-std", "bitflags/rustc-dep-of-std", + "compiler_builtins?/rustc-dep-of-std", +] +std = [ + "bitflags/std", + "alloc", + "libc?/std", + "libc_errno?/std", ] -std = ["bitflags/std"] stdio = [] system = ["linux-raw-sys/system"] termios = [] thread = ["linux-raw-sys/prctl"] time = [] +use-explicitly-provided-auxv = [] use-libc = [ "libc_errno", "libc", @@ -206,9 +214,10 @@ default-features = false version = "0.4" [target."cfg(all(not(rustix_use_libc), not(miri), target_os = \"linux\", target_endian = \"little\", any(target_arch = \"arm\", all(target_arch = \"aarch64\", target_pointer_width = \"64\"), target_arch = \"riscv64\", all(rustix_use_experimental_asm, target_arch = \"powerpc64\"), all(rustix_use_experimental_asm, target_arch = \"mips\"), all(rustix_use_experimental_asm, target_arch = \"mips32r6\"), all(rustix_use_experimental_asm, target_arch = \"mips64\"), all(rustix_use_experimental_asm, target_arch = \"mips64r6\"), target_arch = \"x86\", all(target_arch = \"x86_64\", target_pointer_width = \"64\"))))".dependencies.libc] -version = "0.2.147" +version = "0.2.148" features = ["extra_traits"] optional = true +default-features = false [target."cfg(all(not(rustix_use_libc), not(miri), target_os = \"linux\", target_endian = \"little\", any(target_arch = \"arm\", all(target_arch = \"aarch64\", target_pointer_width = \"64\"), target_arch = \"riscv64\", all(rustix_use_experimental_asm, target_arch = \"powerpc64\"), all(rustix_use_experimental_asm, target_arch = \"mips\"), all(rustix_use_experimental_asm, target_arch = \"mips32r6\"), all(rustix_use_experimental_asm, target_arch = \"mips64\"), all(rustix_use_experimental_asm, target_arch = \"mips64r6\"), target_arch = \"x86\", all(target_arch = \"x86_64\", target_pointer_width = \"64\"))))".dependencies.libc_errno] version = "0.3.1" @@ -217,18 +226,20 @@ default-features = false package = "errno" [target."cfg(all(not(rustix_use_libc), not(miri), target_os = \"linux\", target_endian = \"little\", any(target_arch = \"arm\", all(target_arch = \"aarch64\", target_pointer_width = \"64\"), target_arch = \"riscv64\", all(rustix_use_experimental_asm, target_arch = \"powerpc64\"), all(rustix_use_experimental_asm, target_arch = \"mips\"), all(rustix_use_experimental_asm, target_arch = \"mips32r6\"), all(rustix_use_experimental_asm, target_arch = \"mips64\"), all(rustix_use_experimental_asm, target_arch = \"mips64r6\"), target_arch = \"x86\", all(target_arch = \"x86_64\", target_pointer_width = \"64\"))))".dependencies.linux-raw-sys] -version = "0.4.3" +version = "0.4.7" features = [ "general", "errno", "ioctl", "no_std", + "elf", ] default-features = false [target."cfg(all(not(windows), any(rustix_use_libc, miri, not(all(target_os = \"linux\", target_endian = \"little\", any(target_arch = \"arm\", all(target_arch = \"aarch64\", target_pointer_width = \"64\"), target_arch = \"riscv64\", all(rustix_use_experimental_asm, target_arch = \"powerpc64\"), all(rustix_use_experimental_asm, target_arch = \"mips\"), all(rustix_use_experimental_asm, target_arch = \"mips32r6\"), all(rustix_use_experimental_asm, target_arch = \"mips64\"), all(rustix_use_experimental_asm, target_arch = \"mips64r6\"), target_arch = \"x86\", all(target_arch = \"x86_64\", target_pointer_width = \"64\")))))))".dependencies.libc] -version = "0.2.147" +version = "0.2.148" features = ["extra_traits"] +default-features = false [target."cfg(all(not(windows), any(rustix_use_libc, miri, not(all(target_os = \"linux\", target_endian = \"little\", any(target_arch = \"arm\", all(target_arch = \"aarch64\", target_pointer_width = \"64\"), target_arch = \"riscv64\", all(rustix_use_experimental_asm, target_arch = \"powerpc64\"), all(rustix_use_experimental_asm, target_arch = \"mips\"), all(rustix_use_experimental_asm, target_arch = \"mips32r6\"), all(rustix_use_experimental_asm, target_arch = \"mips64\"), all(rustix_use_experimental_asm, target_arch = \"mips64r6\"), target_arch = \"x86\", all(target_arch = \"x86_64\", target_pointer_width = \"64\")))))))".dependencies.libc_errno] version = "0.3.1" diff --git a/vendor/rustix/README.md b/vendor/rustix/README.md index 985a60fde..96def6e1f 100644 --- a/vendor/rustix/README.md +++ b/vendor/rustix/README.md @@ -77,7 +77,7 @@ by default. The rest of the API is conditional with cargo feature flags: | | | `use-libc` | Enable the libc backend. -[`rustix::event`]: https://docs.rs/rustix/*/rustix/fs/index.html +[`rustix::event`]: https://docs.rs/rustix/*/rustix/event/index.html [`rustix::fs`]: https://docs.rs/rustix/*/rustix/fs/index.html [`rustix::io_uring`]: https://docs.rs/rustix/*/rustix/io_uring/index.html [`rustix::mm`]: https://docs.rs/rustix/*/rustix/mm/index.html @@ -107,8 +107,8 @@ struct that's 64-bit even on 32-bit platforms. ## Similar crates -`rustix` is similar to [`nix`], [`simple_libc`], [`unix`], [`nc`], and -[`uapi`]. `rustix` is architected for [I/O safety] with most APIs using +`rustix` is similar to [`nix`], [`simple_libc`], [`unix`], [`nc`], [`uapi`], +and [`rusl`]. `rustix` is architected for [I/O safety] with most APIs using [`OwnedFd`] and [`AsFd`] to manipulate file descriptors rather than `File` or even `c_int`, and supporting multiple backends so that it can use direct syscalls while still being usable on all platforms `libc` supports. Like `nix`, @@ -155,6 +155,7 @@ version of this crate. [`nc`]: https://crates.io/crates/nc [`simple_libc`]: https://crates.io/crates/simple_libc [`uapi`]: https://crates.io/crates/uapi +[`rusl`]: https://lib.rs/crates/rusl [`relibc`]: https://github.com/redox-os/relibc [`syscall`]: https://crates.io/crates/syscall [`sc`]: https://crates.io/crates/sc diff --git a/vendor/rustix/benches/mod.rs b/vendor/rustix/benches/mod.rs index 97828d431..cd3cb323b 100644 --- a/vendor/rustix/benches/mod.rs +++ b/vendor/rustix/benches/mod.rs @@ -4,7 +4,7 @@ //! the "fs", "time", and "process" cargo features. //! //! ```sh -//! RUSTFLAGS=--cfg=criterion cargo bench --features=fs,time,process +//! RUSTFLAGS=--cfg=criterion cargo bench --features=fs,time,process,stdio //! ``` #[cfg(any( @@ -12,6 +12,7 @@ not(feature = "fs"), not(feature = "process"), not(feature = "time"), + not(feature = "stdio"), windows, target_os = "emscripten", target_os = "redox", @@ -19,7 +20,7 @@ ))] fn main() { unimplemented!( - "Add --cfg=criterion to RUSTFLAGS and enable the \"fs\", \"time\", and \"process\" cargo \ + "Add --cfg=criterion to RUSTFLAGS and enable the \"fs\", \"time\", \"process\", and \"stdio\" cargo \ features." ) } @@ -29,6 +30,7 @@ fn main() { not(feature = "fs"), not(feature = "process"), not(feature = "time"), + not(feature = "stdio"), windows, target_os = "emscripten", target_os = "redox", @@ -41,6 +43,7 @@ use criterion::{criterion_group, criterion_main}; not(feature = "fs"), not(feature = "process"), not(feature = "time"), + not(feature = "stdio"), windows, target_os = "emscripten", target_os = "redox", @@ -107,6 +110,27 @@ mod suite { }); } + pub(super) fn simple_fstat(c: &mut Criterion) { + use rustix::fs::fstat; + + c.bench_function("simple fstat", |b| { + b.iter(|| { + fstat(rustix::stdio::stdin()).unwrap(); + }) + }); + } + + pub(super) fn simple_fstat_libc(c: &mut Criterion) { + c.bench_function("simple fstat libc", |b| { + b.iter(|| { + let mut s = std::mem::MaybeUninit::::uninit(); + unsafe { + assert_eq!(libc::fstat(libc::STDIN_FILENO, s.as_mut_ptr()), 0); + } + }) + }); + } + #[cfg(not(target_os = "wasi"))] pub(super) fn simple_clock_gettime(c: &mut Criterion) { use rustix::time::{clock_gettime, ClockId}; @@ -160,6 +184,7 @@ mod suite { not(feature = "fs"), not(feature = "process"), not(feature = "time"), + not(feature = "stdio"), windows, target_os = "emscripten", target_os = "redox", @@ -171,6 +196,8 @@ criterion_group!( suite::simple_statat_libc, suite::simple_statat_libc_cstr, suite::simple_statat_cstr, + suite::simple_fstat, + suite::simple_fstat_libc, suite::simple_clock_gettime, suite::simple_clock_gettime_libc, suite::simple_getpid, @@ -181,6 +208,7 @@ criterion_group!( not(feature = "fs"), not(feature = "process"), not(feature = "time"), + not(feature = "stdio"), windows, target_os = "emscripten", target_os = "redox", diff --git a/vendor/rustix/build.rs b/vendor/rustix/build.rs index cf7cf6edf..28891caea 100644 --- a/vendor/rustix/build.rs +++ b/vendor/rustix/build.rs @@ -2,7 +2,7 @@ use std::env::var; use std::io::Write; /// The directory for inline asm. -const ASM_PATH: &str = "src/backend/linux_raw/arch/asm"; +const ASM_PATH: &str = "src/backend/linux_raw/arch"; fn main() { // Don't rerun this on changes other than build.rs, as we only depend on @@ -34,6 +34,9 @@ fn main() { // enable the libc backend even if rustix is depended on transitively. let cfg_use_libc = var("CARGO_CFG_RUSTIX_USE_LIBC").is_ok(); + // Check for `--features=rustc-dep-of-std`. + let rustc_dep_of_std = var("CARGO_FEATURE_RUSTC_DEP_OF_STD").is_ok(); + // Check for eg. `RUSTFLAGS=--cfg=rustix_use_experimental_features`. This // is a rustc flag rather than a cargo feature flag because it's // experimental and not something we want accidentally enabled via @@ -52,7 +55,10 @@ fn main() { // If experimental features are enabled, auto-detect and use available // features. - if rustix_use_experimental_features { + if rustc_dep_of_std { + use_feature("rustc_attrs"); + use_feature("core_intrinsics"); + } else if rustix_use_experimental_features { use_feature_or_nothing("rustc_attrs"); use_feature_or_nothing("core_intrinsics"); } @@ -71,6 +77,11 @@ fn main() { use_feature("static_assertions"); } + // WASI support can utilize wasi_ext if present. + if os == "wasi" { + use_feature_or_nothing("wasi_ext"); + } + // If the libc backend is requested, or if we're not on a platform for // which we have linux_raw support, use the libc backend. // diff --git a/vendor/rustix/src/backend/libc/c.rs b/vendor/rustix/src/backend/libc/c.rs index f9e94416c..eb89fa43a 100644 --- a/vendor/rustix/src/backend/libc/c.rs +++ b/vendor/rustix/src/backend/libc/c.rs @@ -1,3 +1,5 @@ +//! Libc and supplemental types and constants. + #![allow(unused_imports)] // Import everything from libc, but we'll add some stuff and override some @@ -12,6 +14,10 @@ pub(crate) const PROC_SUPER_MAGIC: u32 = 0x0000_9fa0; #[cfg(all(linux_kernel, target_env = "musl"))] pub(crate) const NFS_SUPER_MAGIC: u32 = 0x0000_6969; +#[cfg(feature = "process")] +#[cfg(not(any(target_os = "espidf", target_os = "wasi")))] +pub(crate) const EXIT_SIGNALED_SIGABRT: c_int = 128 + SIGABRT as c_int; + // TODO: Upstream these. #[cfg(all(linux_kernel, feature = "net"))] pub(crate) const ETH_P_TSN: c_int = linux_raw_sys::if_ether::ETH_P_TSN as _; @@ -77,6 +83,9 @@ pub(crate) const IUCLC: tcflag_t = linux_raw_sys::general::IUCLC as _; #[cfg(all(linux_kernel, feature = "termios"))] pub(crate) const XCASE: tcflag_t = linux_raw_sys::general::XCASE as _; +#[cfg(target_os = "aix")] +pub(crate) const MSG_DONTWAIT: c_int = libc::MSG_NONBLOCK; + // On PowerPC, the regular `termios` has the `termios2` fields and there is no // `termios2`. linux-raw-sys has aliases `termios2` to `termios` to cover this // difference, but we still need to manually import it since `libc` doesn't @@ -104,13 +113,15 @@ pub(super) use libc::open64 as open; pub(super) use libc::posix_fallocate64 as posix_fallocate; #[cfg(any(all(linux_like, not(target_os = "android")), target_os = "aix"))] pub(super) use libc::{blkcnt64_t as blkcnt_t, rlim64_t as rlim_t}; +// TODO: AIX has `stat64x`, `fstat64x`, `lstat64x`, and `stat64xat`; add them +// to the upstream libc crate and implement rustix's `statat` etc. with them. #[cfg(target_os = "aix")] pub(super) use libc::{ - blksize64_t as blksize_t, fstat64 as fstat, fstatat, fstatfs64 as fstatfs, - fstatvfs64 as fstatvfs, ftruncate64 as ftruncate, getrlimit64 as getrlimit, ino_t, - lseek64 as lseek, mmap, off64_t as off_t, openat, posix_fadvise64 as posix_fadvise, preadv, - pwritev, rlimit64 as rlimit, setrlimit64 as setrlimit, statfs64 as statfs, - statvfs64 as statvfs, RLIM_INFINITY, + blksize64_t as blksize_t, fstat64 as fstat, fstatfs64 as fstatfs, fstatvfs64 as fstatvfs, + ftruncate64 as ftruncate, getrlimit64 as getrlimit, ino_t, lseek64 as lseek, mmap, + off64_t as off_t, openat, posix_fadvise64 as posix_fadvise, preadv, pwritev, + rlimit64 as rlimit, setrlimit64 as setrlimit, statfs64 as statfs, statvfs64 as statvfs, + RLIM_INFINITY, }; #[cfg(linux_like)] pub(super) use libc::{ diff --git a/vendor/rustix/src/backend/libc/conv.rs b/vendor/rustix/src/backend/libc/conv.rs index baf2a05ed..19bf0a7db 100644 --- a/vendor/rustix/src/backend/libc/conv.rs +++ b/vendor/rustix/src/backend/libc/conv.rs @@ -3,7 +3,7 @@ //! for converting between rustix's types and libc types. use super::c; -#[cfg(not(any(windows, target_os = "espidf")))] +#[cfg(all(feature = "alloc", not(any(windows, target_os = "espidf"))))] use super::fd::IntoRawFd; use super::fd::{AsRawFd, BorrowedFd, FromRawFd, LibcFd, OwnedFd, RawFd}; #[cfg(not(windows))] @@ -27,7 +27,10 @@ pub(super) fn borrowed_fd(fd: BorrowedFd<'_>) -> LibcFd { fd.as_raw_fd() as LibcFd } -#[cfg(not(any(windows, target_os = "espidf", target_os = "redox")))] +#[cfg(all( + feature = "alloc", + not(any(windows, target_os = "espidf", target_os = "redox")) +))] #[inline] pub(super) fn owned_fd(fd: OwnedFd) -> LibcFd { fd.into_raw_fd() as LibcFd @@ -133,7 +136,7 @@ pub(super) fn ret_discarded_fd(raw: LibcFd) -> io::Result<()> { } } -#[cfg(not(any(windows, target_os = "wasi")))] +#[cfg(all(feature = "alloc", not(any(windows, target_os = "wasi"))))] #[inline] pub(super) fn ret_discarded_char_ptr(raw: *mut c::c_char) -> io::Result<()> { if raw.is_null() { @@ -205,6 +208,7 @@ pub(crate) fn msg_iov_len(len: usize) -> c::c_int { bsd, solarish, target_env = "musl", + target_os = "aix", target_os = "emscripten", target_os = "fuchsia", target_os = "haiku", @@ -221,6 +225,7 @@ pub(crate) fn msg_control_len(len: usize) -> c::socklen_t { solarish, windows, target_env = "musl", + target_os = "aix", target_os = "emscripten", target_os = "espidf", target_os = "fuchsia", diff --git a/vendor/rustix/src/backend/libc/event/epoll.rs b/vendor/rustix/src/backend/libc/event/epoll.rs index c59a38cd4..a6087a167 100644 --- a/vendor/rustix/src/backend/libc/event/epoll.rs +++ b/vendor/rustix/src/backend/libc/event/epoll.rs @@ -92,6 +92,9 @@ bitflags! { pub struct CreateFlags: u32 { /// `EPOLL_CLOEXEC` const CLOEXEC = bitcast!(c::EPOLL_CLOEXEC); + + /// + const _ = !0; } } @@ -145,6 +148,9 @@ bitflags! { /// `EPOLLEXCLUSIVE` #[cfg(not(target_os = "android"))] const EXCLUSIVE = bitcast!(c::EPOLLEXCLUSIVE); + + /// + const _ = !0; } } @@ -160,11 +166,11 @@ pub fn create(flags: CreateFlags) -> io::Result { unsafe { ret_owned_fd(c::epoll_create1(bitflags_bits!(flags))) } } -/// `epoll_ctl(self, EPOLL_CTL_ADD, data, event)`—Adds an element to an -/// epoll object. +/// `epoll_ctl(self, EPOLL_CTL_ADD, data, event)`—Adds an element to an epoll +/// object. /// -/// This registers interest in any of the events set in `events` occurring -/// on the file descriptor associated with `data`. +/// This registers interest in any of the events set in `events` occurring on +/// the file descriptor associated with `data`. /// /// If [`delete`] is not called on the I/O source passed into this function /// before the I/O source is `close`d, then the `epoll` will act as if the I/O @@ -198,8 +204,8 @@ pub fn add( } } -/// `epoll_ctl(self, EPOLL_CTL_MOD, target, event)`—Modifies an element in -/// a given epoll object. +/// `epoll_ctl(self, EPOLL_CTL_MOD, target, event)`—Modifies an element in a +/// given epoll object. /// /// This sets the events of interest with `target` to `events`. #[doc(alias = "epoll_ctl")] @@ -229,8 +235,8 @@ pub fn modify( } } -/// `epoll_ctl(self, EPOLL_CTL_DEL, target, NULL)`—Removes an element in -/// a given epoll object. +/// `epoll_ctl(self, EPOLL_CTL_DEL, target, NULL)`—Removes an element in a +/// given epoll object. #[doc(alias = "epoll_ctl")] pub fn delete(epoll: impl AsFd, source: impl AsFd) -> io::Result<()> { // SAFETY: We're calling `epoll_ctl` via FFI and we know how it @@ -341,8 +347,8 @@ impl EventData { /// Return the value as a `u64`. /// - /// If the stored value was a pointer, the pointer is zero-extended to - /// a `u64`. + /// If the stored value was a pointer, the pointer is zero-extended to a + /// `u64`. #[inline] pub fn u64(self) -> u64 { unsafe { self.as_u64 } diff --git a/vendor/rustix/src/backend/libc/event/mod.rs b/vendor/rustix/src/backend/libc/event/mod.rs index 6aed4612a..44e8a090a 100644 --- a/vendor/rustix/src/backend/libc/event/mod.rs +++ b/vendor/rustix/src/backend/libc/event/mod.rs @@ -5,5 +5,5 @@ pub(crate) mod types; #[cfg_attr(windows, path = "windows_syscalls.rs")] pub(crate) mod syscalls; -#[cfg(linux_kernel)] +#[cfg(all(feature = "alloc", linux_kernel))] pub mod epoll; diff --git a/vendor/rustix/src/backend/libc/event/poll_fd.rs b/vendor/rustix/src/backend/libc/event/poll_fd.rs index a06812aaa..3f795d5aa 100644 --- a/vendor/rustix/src/backend/libc/event/poll_fd.rs +++ b/vendor/rustix/src/backend/libc/event/poll_fd.rs @@ -47,6 +47,9 @@ bitflags! { not(any(target_arch = "sparc", target_arch = "sparc64"))), )] const RDHUP = c::POLLRDHUP; + + /// + const _ = !0; } } @@ -112,7 +115,7 @@ impl<'fd> PollFd<'fd> { /// Returns the ready events. #[inline] pub fn revents(&self) -> PollFlags { - // Use `unwrap()` here because in theory we know we know all the bits + // Use `.unwrap()` here because in theory we know we know all the bits // the OS might set here, but OS's have added extensions in the past. PollFlags::from_bits(self.pollfd.revents).unwrap() } @@ -123,7 +126,7 @@ impl<'fd> AsFd for PollFd<'fd> { #[inline] fn as_fd(&self) -> BorrowedFd<'_> { // SAFETY: Our constructors and `set_fd` require `pollfd.fd` to be - // valid for the `fd lifetime. + // valid for the `'fd` lifetime. unsafe { BorrowedFd::borrow_raw(self.pollfd.fd) } } } @@ -133,7 +136,7 @@ impl<'fd> AsSocket for PollFd<'fd> { #[inline] fn as_socket(&self) -> BorrowedFd<'_> { // SAFETY: Our constructors and `set_fd` require `pollfd.fd` to be - // valid for the `fd lifetime. + // valid for the `'fd` lifetime. unsafe { BorrowedFd::borrow_raw(self.pollfd.fd as RawFd) } } } diff --git a/vendor/rustix/src/backend/libc/event/syscalls.rs b/vendor/rustix/src/backend/libc/event/syscalls.rs index eac88d4bb..f2dcdf5ad 100644 --- a/vendor/rustix/src/backend/libc/event/syscalls.rs +++ b/vendor/rustix/src/backend/libc/event/syscalls.rs @@ -5,7 +5,7 @@ use crate::backend::conv::ret_c_int; #[cfg(any(apple, netbsdlike, target_os = "dragonfly", target_os = "solaris"))] use crate::backend::conv::ret_owned_fd; use crate::event::PollFd; -#[cfg(any(linux_kernel, bsd, solarish))] +#[cfg(any(linux_kernel, bsd, solarish, target_os = "espidf"))] use crate::fd::OwnedFd; use crate::io; #[cfg(any(bsd, solarish))] @@ -15,12 +15,22 @@ use { crate::backend::conv::ret, crate::event::port::Event, crate::utils::as_mut_ptr, core::ptr::null_mut, }; -#[cfg(any(linux_kernel, target_os = "freebsd", target_os = "illumos"))] +#[cfg(any( + linux_kernel, + target_os = "freebsd", + target_os = "illumos", + target_os = "espidf" +))] use {crate::backend::conv::ret_owned_fd, crate::event::EventfdFlags}; -#[cfg(bsd)] +#[cfg(all(feature = "alloc", bsd))] use {crate::event::kqueue::Event, crate::utils::as_ptr, core::ptr::null}; -#[cfg(any(linux_kernel, target_os = "freebsd", target_os = "illumos"))] +#[cfg(any( + linux_kernel, + target_os = "freebsd", + target_os = "illumos", + target_os = "espidf" +))] pub(crate) fn eventfd(initval: u32, flags: EventfdFlags) -> io::Result { #[cfg(linux_kernel)] unsafe { @@ -45,18 +55,18 @@ pub(crate) fn eventfd(initval: u32, flags: EventfdFlags) -> io::Result ret_owned_fd(eventfd(initval, bitflags_bits!(flags))) } - #[cfg(target_os = "illumos")] + #[cfg(any(target_os = "illumos", target_os = "espidf"))] unsafe { ret_owned_fd(c::eventfd(initval, bitflags_bits!(flags))) } } -#[cfg(bsd)] +#[cfg(all(feature = "alloc", bsd))] pub(crate) fn kqueue() -> io::Result { unsafe { ret_owned_fd(c::kqueue()) } } -#[cfg(bsd)] +#[cfg(all(feature = "alloc", bsd))] pub(crate) unsafe fn kevent( kq: BorrowedFd<'_>, changelist: &[Event], @@ -137,7 +147,7 @@ pub(crate) fn port_get( Ok(Event(unsafe { event.assume_init() })) } -#[cfg(solarish)] +#[cfg(all(feature = "alloc", solarish))] pub(crate) fn port_getn( port: BorrowedFd<'_>, timeout: Option<&mut c::timespec>, diff --git a/vendor/rustix/src/backend/libc/event/types.rs b/vendor/rustix/src/backend/libc/event/types.rs index 632b1be63..af052a434 100644 --- a/vendor/rustix/src/backend/libc/event/types.rs +++ b/vendor/rustix/src/backend/libc/event/types.rs @@ -1,7 +1,19 @@ #[cfg(any(linux_kernel, target_os = "freebsd", target_os = "illumos"))] -use {crate::backend::c, bitflags::bitflags}; +use crate::backend::c; +#[cfg(any( + linux_kernel, + target_os = "freebsd", + target_os = "illumos", + target_os = "espidf" +))] +use bitflags::bitflags; -#[cfg(any(linux_kernel, target_os = "freebsd", target_os = "illumos"))] +#[cfg(any( + linux_kernel, + target_os = "freebsd", + target_os = "illumos", + target_os = "espidf" +))] bitflags! { /// `EFD_*` flags for use with [`eventfd`]. /// @@ -10,10 +22,16 @@ bitflags! { #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] pub struct EventfdFlags: u32 { /// `EFD_CLOEXEC` + #[cfg(not(target_os = "espidf"))] const CLOEXEC = bitcast!(c::EFD_CLOEXEC); /// `EFD_NONBLOCK` + #[cfg(not(target_os = "espidf"))] const NONBLOCK = bitcast!(c::EFD_NONBLOCK); /// `EFD_SEMAPHORE` + #[cfg(not(target_os = "espidf"))] const SEMAPHORE = bitcast!(c::EFD_SEMAPHORE); + + /// + const _ = !0; } } diff --git a/vendor/rustix/src/backend/libc/fs/inotify.rs b/vendor/rustix/src/backend/libc/fs/inotify.rs index 05d4d904f..fea2fad06 100644 --- a/vendor/rustix/src/backend/libc/fs/inotify.rs +++ b/vendor/rustix/src/backend/libc/fs/inotify.rs @@ -17,6 +17,9 @@ bitflags! { const CLOEXEC = bitcast!(c::IN_CLOEXEC); /// `IN_NONBLOCK` const NONBLOCK = bitcast!(c::IN_NONBLOCK); + + /// + const _ = !0; } } @@ -71,6 +74,9 @@ bitflags! { const ONESHOT = c::IN_ONESHOT; /// `IN_ONLYDIR` const ONLYDIR = c::IN_ONLYDIR; + + /// + const _ = !0; } } @@ -98,22 +104,23 @@ pub fn inotify_add_watch( path: P, flags: WatchFlags, ) -> io::Result { - let path = path.as_cow_c_str().unwrap(); - // SAFETY: The fd and path we are passing is guaranteed valid by the type - // system. - unsafe { - ret_c_int(c::inotify_add_watch( - borrowed_fd(inot), - c_str(&path), - flags.bits(), - )) - } + path.into_with_c_str(|path| { + // SAFETY: The fd and path we are passing is guaranteed valid by the type + // system. + unsafe { + ret_c_int(c::inotify_add_watch( + borrowed_fd(inot), + c_str(path), + flags.bits(), + )) + } + }) } /// `inotify_rm_watch(self, wd)`—Removes a watch from this inotify /// -/// The watch descriptor provided should have previously been returned -/// by [`inotify_add_watch`] and not previously have been removed. +/// The watch descriptor provided should have previously been returned by +/// [`inotify_add_watch`] and not previously have been removed. #[doc(alias = "inotify_rm_watch")] pub fn inotify_remove_watch(inot: BorrowedFd<'_>, wd: i32) -> io::Result<()> { // Android's `inotify_rm_watch` takes `u32` despite that diff --git a/vendor/rustix/src/backend/libc/fs/makedev.rs b/vendor/rustix/src/backend/libc/fs/makedev.rs index 640d5005b..aa1210283 100644 --- a/vendor/rustix/src/backend/libc/fs/makedev.rs +++ b/vendor/rustix/src/backend/libc/fs/makedev.rs @@ -30,8 +30,8 @@ pub(crate) fn makedev(maj: u32, min: u32) -> Dev { #[cfg(all(target_os = "android", target_pointer_width = "32"))] #[inline] pub(crate) fn makedev(maj: u32, min: u32) -> Dev { - // 32-bit Android's `dev_t` is 32-bit, but its `st_dev` is 64-bit, - // so we do it ourselves. + // 32-bit Android's `dev_t` is 32-bit, but its `st_dev` is 64-bit, so we do + // it ourselves. ((u64::from(maj) & 0xffff_f000_u64) << 32) | ((u64::from(maj) & 0x0000_0fff_u64) << 8) | ((u64::from(min) & 0xffff_ff00_u64) << 12) @@ -86,8 +86,8 @@ pub(crate) fn major(dev: Dev) -> u32 { #[cfg(all(target_os = "android", target_pointer_width = "32"))] #[inline] pub(crate) fn major(dev: Dev) -> u32 { - // 32-bit Android's `dev_t` is 32-bit, but its `st_dev` is 64-bit, - // so we do it ourselves. + // 32-bit Android's `dev_t` is 32-bit, but its `st_dev` is 64-bit, so we do + // it ourselves. (((dev >> 31 >> 1) & 0xffff_f000) | ((dev >> 8) & 0x0000_0fff)) as u32 } @@ -125,8 +125,8 @@ pub(crate) fn minor(dev: Dev) -> u32 { #[cfg(all(target_os = "android", target_pointer_width = "32"))] #[inline] pub(crate) fn minor(dev: Dev) -> u32 { - // 32-bit Android's `dev_t` is 32-bit, but its `st_dev` is 64-bit, - // so we do it ourselves. + // 32-bit Android's `dev_t` is 32-bit, but its `st_dev` is 64-bit, so we do + // it ourselves. (((dev >> 12) & 0xffff_ff00) | (dev & 0x0000_00ff)) as u32 } diff --git a/vendor/rustix/src/backend/libc/fs/mod.rs b/vendor/rustix/src/backend/libc/fs/mod.rs index 17b4da70f..9a0b1d3e5 100644 --- a/vendor/rustix/src/backend/libc/fs/mod.rs +++ b/vendor/rustix/src/backend/libc/fs/mod.rs @@ -1,4 +1,4 @@ -#[cfg(not(any(target_os = "espidf", target_os = "redox")))] +#[cfg(all(feature = "alloc", not(any(target_os = "espidf", target_os = "redox"))))] pub(crate) mod dir; #[cfg(linux_kernel)] pub mod inotify; @@ -12,3 +12,11 @@ pub(crate) mod makedev; #[cfg(not(windows))] pub(crate) mod syscalls; pub(crate) mod types; + +// TODO: Fix linux-raw-sys to define ioctl codes for sparc. +#[cfg(all(linux_kernel, any(target_arch = "sparc", target_arch = "sparc64")))] +pub(crate) const EXT4_IOC_RESIZE_FS: crate::ioctl::RawOpcode = 0x8008_6610; + +#[cfg(all(linux_kernel, not(any(target_arch = "sparc", target_arch = "sparc64"))))] +pub(crate) const EXT4_IOC_RESIZE_FS: crate::ioctl::RawOpcode = + linux_raw_sys::ioctl::EXT4_IOC_RESIZE_FS as crate::ioctl::RawOpcode; diff --git a/vendor/rustix/src/backend/libc/fs/syscalls.rs b/vendor/rustix/src/backend/libc/fs/syscalls.rs index 698bf34ad..5df25daa9 100644 --- a/vendor/rustix/src/backend/libc/fs/syscalls.rs +++ b/vendor/rustix/src/backend/libc/fs/syscalls.rs @@ -1,9 +1,9 @@ //! libc syscalls supporting `rustix::fs`. use crate::backend::c; -use crate::backend::conv::{ - borrowed_fd, c_str, ret, ret_c_int, ret_off_t, ret_owned_fd, ret_usize, -}; +#[cfg(any(apple, linux_kernel, feature = "alloc"))] +use crate::backend::conv::ret_usize; +use crate::backend::conv::{borrowed_fd, c_str, ret, ret_c_int, ret_off_t, ret_owned_fd}; use crate::fd::{BorrowedFd, OwnedFd}; use crate::ffi::CStr; #[cfg(apple)] @@ -90,6 +90,7 @@ fn open_via_syscall(path: &CStr, oflags: OFlags, mode: Mode) -> io::Result io::Result io::Result io::Result { } } +#[cfg(feature = "alloc")] #[inline] pub(crate) fn readlink(path: &CStr, buf: &mut [u8]) -> io::Result { unsafe { @@ -255,7 +258,7 @@ pub(crate) fn readlink(path: &CStr, buf: &mut [u8]) -> io::Result { } } -#[cfg(not(target_os = "redox"))] +#[cfg(all(feature = "alloc", not(target_os = "redox")))] #[inline] pub(crate) fn readlinkat( dirfd: BorrowedFd<'_>, @@ -615,7 +618,7 @@ pub(crate) fn lstat(path: &CStr) -> io::Result { } } -#[cfg(not(any(target_os = "espidf", target_os = "redox")))] +#[cfg(not(any(target_os = "aix", target_os = "espidf", target_os = "redox")))] pub(crate) fn statat(dirfd: BorrowedFd<'_>, path: &CStr, flags: AtFlags) -> io::Result { // See the comments in `fstat` about using `crate::fs::statx` here. #[cfg(all( @@ -785,9 +788,6 @@ pub(crate) fn utimensat( unsafe { use crate::utils::as_ptr; - // Assert that `Timestamps` has the expected layout. - let _ = core::mem::transmute::(times.clone()); - ret(c::utimensat( borrowed_fd(dirfd), c_str(path), @@ -823,9 +823,6 @@ pub(crate) fn utimensat( // If we have `utimensat`, use it. if let Some(have_utimensat) = utimensat.get() { - // Assert that `Timestamps` has the expected layout. - let _ = core::mem::transmute::(times.clone()); - return ret(have_utimensat( borrowed_fd(dirfd), c_str(path), @@ -1094,9 +1091,6 @@ pub(crate) fn copy_file_range( ) via SYS_copy_file_range -> c::ssize_t } - #[cfg(test)] - assert_eq_size!(c::loff_t, u64); - let mut off_in_val: c::loff_t = 0; let mut off_out_val: c::loff_t = 0; // Silently cast; we'll get `EINVAL` if the value is negative. @@ -1234,9 +1228,9 @@ pub(crate) fn seek(fd: BorrowedFd<'_>, pos: SeekFrom) -> io::Result { } SeekFrom::End(offset) => (c::SEEK_END, offset), SeekFrom::Current(offset) => (c::SEEK_CUR, offset), - #[cfg(any(freebsdlike, target_os = "linux", target_os = "solaris"))] + #[cfg(any(apple, freebsdlike, linux_kernel, solarish))] SeekFrom::Data(offset) => (c::SEEK_DATA, offset), - #[cfg(any(freebsdlike, target_os = "linux", target_os = "solaris"))] + #[cfg(any(apple, freebsdlike, linux_kernel, solarish))] SeekFrom::Hole(offset) => (c::SEEK_HOLE, offset), }; @@ -1273,6 +1267,14 @@ pub(crate) fn fchmod(fd: BorrowedFd<'_>, mode: Mode) -> io::Result<()> { unsafe { ret(fchmod(borrowed_fd(fd), mode.bits() as c::mode_t)) } } +#[cfg(not(target_os = "wasi"))] +pub(crate) fn chown(path: &CStr, owner: Option, group: Option) -> io::Result<()> { + unsafe { + let (ow, gr) = crate::ugid::translate_fchown_args(owner, group); + ret(c::chown(c_str(path), ow, gr)) + } +} + #[cfg(linux_kernel)] pub(crate) fn fchown(fd: BorrowedFd<'_>, owner: Option, group: Option) -> io::Result<()> { // Use `c::syscall` rather than `c::fchown` because some libc @@ -1420,7 +1422,10 @@ fn libc_statvfs_to_statvfs(from: c::statvfs) -> StatVfs { f_files: from.f_files as u64, f_ffree: from.f_ffree as u64, f_favail: from.f_ffree as u64, + #[cfg(not(target_os = "aix"))] f_fsid: from.f_fsid as u64, + #[cfg(target_os = "aix")] + f_fsid: ((from.f_fsid.val[0] as u64) << 32) | from.f_fsid.val[1], f_flag: StatVfsMountFlags::from_bits_retain(from.f_flag as u64), f_namemax: from.f_namemax as u64, } @@ -1453,9 +1458,6 @@ pub(crate) fn futimens(fd: BorrowedFd<'_>, times: &Timestamps) -> io::Result<()> unsafe { use crate::utils::as_ptr; - // Assert that `Timestamps` has the expected layout. - let _ = core::mem::transmute::(times.clone()); - ret(c::futimens(borrowed_fd(fd), as_ptr(times).cast())) } @@ -1480,9 +1482,6 @@ pub(crate) fn futimens(fd: BorrowedFd<'_>, times: &Timestamps) -> io::Result<()> // If we have `futimens`, use it. if let Some(have_futimens) = futimens.get() { - // Assert that `Timestamps` has the expected layout. - let _ = core::mem::transmute::(times.clone()); - return ret(have_futimens(borrowed_fd(fd), as_ptr(times).cast())); } @@ -2049,12 +2048,12 @@ pub(crate) fn fcntl_fullfsync(fd: BorrowedFd<'_>) -> io::Result<()> { } #[cfg(apple)] -pub(crate) fn fcntl_nocache(fd: BorrowedFd, value: bool) -> io::Result<()> { +pub(crate) fn fcntl_nocache(fd: BorrowedFd<'_>, value: bool) -> io::Result<()> { unsafe { ret(c::fcntl(borrowed_fd(fd), c::F_NOCACHE, value as c::c_int)) } } #[cfg(apple)] -pub(crate) fn fcntl_global_nocache(fd: BorrowedFd, value: bool) -> io::Result<()> { +pub(crate) fn fcntl_global_nocache(fd: BorrowedFd<'_>, value: bool) -> io::Result<()> { unsafe { ret(c::fcntl( borrowed_fd(fd), @@ -2420,51 +2419,15 @@ pub(crate) fn fremovexattr(fd: BorrowedFd<'_>, name: &CStr) -> io::Result<()> { } } -#[cfg(linux_kernel)] -#[inline] -pub(crate) fn ioctl_blksszget(fd: BorrowedFd) -> io::Result { - let mut result = MaybeUninit::::uninit(); - unsafe { - ret(c::ioctl(borrowed_fd(fd), c::BLKSSZGET, result.as_mut_ptr()))?; - Ok(result.assume_init() as u32) - } -} - -#[cfg(linux_kernel)] -#[inline] -pub(crate) fn ioctl_blkpbszget(fd: BorrowedFd) -> io::Result { - let mut result = MaybeUninit::::uninit(); - unsafe { - ret(c::ioctl( - borrowed_fd(fd), - c::BLKPBSZGET, - result.as_mut_ptr(), - ))?; - Ok(result.assume_init() as u32) - } -} - -// Sparc lacks `FICLONE`. -#[cfg(all(linux_kernel, not(any(target_arch = "sparc", target_arch = "sparc64"))))] -pub(crate) fn ioctl_ficlone(fd: BorrowedFd<'_>, src_fd: BorrowedFd<'_>) -> io::Result<()> { - unsafe { - ret(c::ioctl( - borrowed_fd(fd), - c::FICLONE as _, - borrowed_fd(src_fd), - )) - } -} - -#[cfg(linux_kernel)] -#[inline] -pub(crate) fn ext4_ioc_resize_fs(fd: BorrowedFd<'_>, blocks: u64) -> io::Result<()> { - // TODO: Fix linux-raw-sys to define ioctl codes for sparc. - #[cfg(any(target_arch = "sparc", target_arch = "sparc64"))] - const EXT4_IOC_RESIZE_FS: u32 = 0x8008_6610; - - #[cfg(not(any(target_arch = "sparc", target_arch = "sparc64")))] - use linux_raw_sys::ioctl::EXT4_IOC_RESIZE_FS; +#[test] +fn test_sizes() { + #[cfg(linux_kernel)] + assert_eq_size!(c::loff_t, u64); - unsafe { ret(c::ioctl(borrowed_fd(fd), EXT4_IOC_RESIZE_FS as _, &blocks)) } + // Assert that `Timestamps` has the expected layout. If we're not fixing + // y2038, libc's type should match ours. If we are, it's smaller. + #[cfg(not(fix_y2038))] + assert_eq_size!([c::timespec; 2], Timestamps); + #[cfg(fix_y2038)] + assert!(core::mem::size_of::<[c::timespec; 2]>() < core::mem::size_of::()); } diff --git a/vendor/rustix/src/backend/libc/fs/types.rs b/vendor/rustix/src/backend/libc/fs/types.rs index 955bdaa29..cf86861dc 100644 --- a/vendor/rustix/src/backend/libc/fs/types.rs +++ b/vendor/rustix/src/backend/libc/fs/types.rs @@ -20,6 +20,9 @@ bitflags! { /// `F_OK` const EXISTS = c::F_OK; + + /// + const _ = !0; } } @@ -73,6 +76,9 @@ bitflags! { /// `AT_STATX_DONT_SYNC` #[cfg(all(target_os = "linux", target_env = "gnu"))] const STATX_DONT_SYNC = bitcast!(c::AT_STATX_DONT_SYNC); + + /// + const _ = !0; } } @@ -86,64 +92,67 @@ bitflags! { #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] pub struct Mode: RawMode { /// `S_IRWXU` - #[cfg(not(any(target_os = "espidf", target_os = "wasi")))] // WASI doesn't have Unix-style mode flags. + #[cfg(not(target_os = "espidf"))] const RWXU = c::S_IRWXU as RawMode; /// `S_IRUSR` - #[cfg(not(any(target_os = "espidf", target_os = "wasi")))] // WASI doesn't have Unix-style mode flags. + #[cfg(not(target_os = "espidf"))] const RUSR = c::S_IRUSR as RawMode; /// `S_IWUSR` - #[cfg(not(any(target_os = "espidf", target_os = "wasi")))] // WASI doesn't have Unix-style mode flags. + #[cfg(not(target_os = "espidf"))] const WUSR = c::S_IWUSR as RawMode; /// `S_IXUSR` - #[cfg(not(any(target_os = "espidf", target_os = "wasi")))] // WASI doesn't have Unix-style mode flags. + #[cfg(not(target_os = "espidf"))] const XUSR = c::S_IXUSR as RawMode; /// `S_IRWXG` - #[cfg(not(any(target_os = "espidf", target_os = "wasi")))] // WASI doesn't have Unix-style mode flags. + #[cfg(not(target_os = "espidf"))] const RWXG = c::S_IRWXG as RawMode; /// `S_IRGRP` - #[cfg(not(any(target_os = "espidf", target_os = "wasi")))] // WASI doesn't have Unix-style mode flags. + #[cfg(not(target_os = "espidf"))] const RGRP = c::S_IRGRP as RawMode; /// `S_IWGRP` - #[cfg(not(any(target_os = "espidf", target_os = "wasi")))] // WASI doesn't have Unix-style mode flags. + #[cfg(not(target_os = "espidf"))] const WGRP = c::S_IWGRP as RawMode; /// `S_IXGRP` - #[cfg(not(any(target_os = "espidf", target_os = "wasi")))] // WASI doesn't have Unix-style mode flags. + #[cfg(not(target_os = "espidf"))] const XGRP = c::S_IXGRP as RawMode; /// `S_IRWXO` - #[cfg(not(any(target_os = "espidf", target_os = "wasi")))] // WASI doesn't have Unix-style mode flags. + #[cfg(not(target_os = "espidf"))] const RWXO = c::S_IRWXO as RawMode; /// `S_IROTH` - #[cfg(not(any(target_os = "espidf", target_os = "wasi")))] // WASI doesn't have Unix-style mode flags. + #[cfg(not(target_os = "espidf"))] const ROTH = c::S_IROTH as RawMode; /// `S_IWOTH` - #[cfg(not(any(target_os = "espidf", target_os = "wasi")))] // WASI doesn't have Unix-style mode flags. + #[cfg(not(target_os = "espidf"))] const WOTH = c::S_IWOTH as RawMode; /// `S_IXOTH` - #[cfg(not(any(target_os = "espidf", target_os = "wasi")))] // WASI doesn't have Unix-style mode flags. + #[cfg(not(target_os = "espidf"))] const XOTH = c::S_IXOTH as RawMode; /// `S_ISUID` - #[cfg(not(any(target_os = "espidf", target_os = "wasi")))] // WASI doesn't have Unix-style mode flags. + #[cfg(not(target_os = "espidf"))] const SUID = c::S_ISUID as RawMode; /// `S_ISGID` - #[cfg(not(any(target_os = "espidf", target_os = "wasi")))] // WASI doesn't have Unix-style mode flags. + #[cfg(not(target_os = "espidf"))] const SGID = c::S_ISGID as RawMode; /// `S_ISVTX` - #[cfg(not(any(target_os = "espidf", target_os = "wasi")))] // WASI doesn't have Unix-style mode flags. + #[cfg(not(target_os = "espidf"))] const SVTX = c::S_ISVTX as RawMode; + + /// + const _ = !0; } } @@ -249,6 +258,8 @@ bitflags! { const WRONLY = bitcast!(c::O_WRONLY); /// `O_RDWR` + /// + /// This is not equal to `RDONLY | WRONLY`. It's a distinct flag. const RDWR = bitcast!(c::O_RDWR); /// `O_NOCTTY` @@ -316,6 +327,9 @@ bitflags! { /// `O_EMPTY_PATH` #[cfg(target_os = "freebsd")] const EMPTY_PATH = bitcast!(c::O_EMPTY_PATH); + + /// + const _ = !0; } } @@ -332,6 +346,9 @@ bitflags! { /// `CLONE_NOOWNERCOPY` const NOOWNERCOPY = 2; + + /// + const _ = !0; } } @@ -374,6 +391,9 @@ bitflags! { /// `COPYFILE_ALL` const ALL = copyfile::ALL; + + /// + const _ = !0; } } @@ -402,6 +422,9 @@ bitflags! { /// `RESOLVE_CACHED` (since Linux 5.12) const CACHED = 0x20; + + /// + const _ = !0; } } @@ -421,6 +444,9 @@ bitflags! { /// `RENAME_WHITEOUT` const WHITEOUT = bitcast!(c::RENAME_WHITEOUT); + + /// + const _ = !0; } } @@ -497,6 +523,7 @@ impl FileType { /// Construct a `FileType` from the `d_type` field of a `c::dirent`. #[cfg(not(any( solarish, + target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", @@ -595,6 +622,9 @@ bitflags! { const HUGE_2GB = c::MFD_HUGE_2GB; /// `MFD_HUGE_16GB` const HUGE_16GB = c::MFD_HUGE_16GB; + + /// + const _ = !0; } } @@ -608,17 +638,20 @@ bitflags! { #[repr(transparent)] #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] pub struct SealFlags: u32 { - /// `F_SEAL_SEAL`. - const SEAL = bitcast!(c::F_SEAL_SEAL); - /// `F_SEAL_SHRINK`. - const SHRINK = bitcast!(c::F_SEAL_SHRINK); - /// `F_SEAL_GROW`. - const GROW = bitcast!(c::F_SEAL_GROW); - /// `F_SEAL_WRITE`. - const WRITE = bitcast!(c::F_SEAL_WRITE); - /// `F_SEAL_FUTURE_WRITE` (since Linux 5.1) - #[cfg(linux_kernel)] - const FUTURE_WRITE = bitcast!(c::F_SEAL_FUTURE_WRITE); + /// `F_SEAL_SEAL`. + const SEAL = bitcast!(c::F_SEAL_SEAL); + /// `F_SEAL_SHRINK`. + const SHRINK = bitcast!(c::F_SEAL_SHRINK); + /// `F_SEAL_GROW`. + const GROW = bitcast!(c::F_SEAL_GROW); + /// `F_SEAL_WRITE`. + const WRITE = bitcast!(c::F_SEAL_WRITE); + /// `F_SEAL_FUTURE_WRITE` (since Linux 5.1) + #[cfg(linux_kernel)] + const FUTURE_WRITE = bitcast!(c::F_SEAL_FUTURE_WRITE); + + /// + const _ = !0; } } @@ -677,6 +710,9 @@ bitflags! { /// `STATX_ALL` const ALL = c::STATX_ALL; + + /// + const _ = !0; } } @@ -735,6 +771,9 @@ bitflags! { /// `STATX_ALL` const ALL = 0xfff; + + /// + const _ = !0; } } @@ -817,6 +856,9 @@ bitflags! { target_os = "wasi", )))] const UNSHARE_RANGE = bitcast!(c::FALLOC_FL_UNSHARE_RANGE); + + /// + const _ = !0; } } @@ -866,6 +908,9 @@ bitflags! { /// `ST_SYNCHRONOUS` #[cfg(any(linux_kernel, target_os = "emscripten", target_os = "fuchsia"))] const SYNCHRONOUS = c::ST_SYNCHRONOUS as u64; + + /// + const _ = !0; } } diff --git a/vendor/rustix/src/backend/libc/io/errno.rs b/vendor/rustix/src/backend/libc/io/errno.rs index aabd45f8c..1448fe7bd 100644 --- a/vendor/rustix/src/backend/libc/io/errno.rs +++ b/vendor/rustix/src/backend/libc/io/errno.rs @@ -6,10 +6,32 @@ use crate::backend::c; use libc_errno::errno; -/// The error type for `rustix` APIs. +/// `errno`—An error code. /// -/// This is similar to `std::io::Error`, but only holds an OS error code, -/// and no extra error value. +/// The error type for `rustix` APIs. This is similar to [`std::io::Error`], +/// but only holds an OS error code, and no extra error value. +/// +/// # References +/// - [POSIX] +/// - [Linux] +/// - [Winsock2] +/// - [FreeBSD] +/// - [NetBSD] +/// - [OpenBSD] +/// - [DragonFly BSD] +/// - [illumos] +/// - [glibc] +/// +/// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/errno.html +/// [Linux]: https://man7.org/linux/man-pages/man3/errno.3.html +/// [Winsock2]: https://learn.microsoft.com/en-us/windows/win32/winsock/windows-sockets-error-codes-2 +/// [FreeBSD]: https://man.freebsd.org/cgi/man.cgi?errno +/// [NetBSD]: https://man.netbsd.org/errno.2 +/// [OpenBSD]: https://man.openbsd.org/errno.2 +/// [DragonFly BSD]: https://man.dragonflybsd.org/?command=errno§ion=2 +/// [illumos]: https://illumos.org/man/3C/errno +/// [glibc]: https://www.gnu.org/software/libc/manual/html_node/Error-Codes.html +/// [`std::io::Error`]: Result #[repr(transparent)] #[doc(alias = "errno")] #[derive(Eq, PartialEq, Hash, Copy, Clone)] diff --git a/vendor/rustix/src/backend/libc/io/syscalls.rs b/vendor/rustix/src/backend/libc/io/syscalls.rs index 362af11ee..19ecfa9b6 100644 --- a/vendor/rustix/src/backend/libc/io/syscalls.rs +++ b/vendor/rustix/src/backend/libc/io/syscalls.rs @@ -15,6 +15,7 @@ use crate::io::DupFlags; #[cfg(linux_kernel)] use crate::io::ReadWriteFlags; use crate::io::{self, FdFlags}; +use crate::ioctl::{IoctlOutput, RawOpcode}; use core::cmp::min; #[cfg(all(feature = "fs", feature = "net"))] use libc_errno::errno; @@ -78,7 +79,7 @@ pub(crate) fn pwrite(fd: BorrowedFd<'_>, buf: &[u8], offset: u64) -> io::Result< } #[cfg(not(target_os = "espidf"))] -pub(crate) fn readv(fd: BorrowedFd<'_>, bufs: &mut [IoSliceMut]) -> io::Result { +pub(crate) fn readv(fd: BorrowedFd<'_>, bufs: &mut [IoSliceMut<'_>]) -> io::Result { unsafe { ret_usize(c::readv( borrowed_fd(fd), @@ -89,7 +90,7 @@ pub(crate) fn readv(fd: BorrowedFd<'_>, bufs: &mut [IoSliceMut]) -> io::Result, bufs: &[IoSlice]) -> io::Result { +pub(crate) fn writev(fd: BorrowedFd<'_>, bufs: &[IoSlice<'_>]) -> io::Result { unsafe { ret_usize(c::writev( borrowed_fd(fd), @@ -108,7 +109,7 @@ pub(crate) fn writev(fd: BorrowedFd<'_>, bufs: &[IoSlice]) -> io::Result )))] pub(crate) fn preadv( fd: BorrowedFd<'_>, - bufs: &mut [IoSliceMut], + bufs: &mut [IoSliceMut<'_>], offset: u64, ) -> io::Result { // Silently cast; we'll get `EINVAL` if the value is negative. @@ -130,7 +131,7 @@ pub(crate) fn preadv( target_os = "redox", target_os = "solaris" )))] -pub(crate) fn pwritev(fd: BorrowedFd<'_>, bufs: &[IoSlice], offset: u64) -> io::Result { +pub(crate) fn pwritev(fd: BorrowedFd<'_>, bufs: &[IoSlice<'_>], offset: u64) -> io::Result { // Silently cast; we'll get `EINVAL` if the value is negative. let offset = offset as i64; unsafe { @@ -146,7 +147,7 @@ pub(crate) fn pwritev(fd: BorrowedFd<'_>, bufs: &[IoSlice], offset: u64) -> io:: #[cfg(linux_kernel)] pub(crate) fn preadv2( fd: BorrowedFd<'_>, - bufs: &mut [IoSliceMut], + bufs: &mut [IoSliceMut<'_>], offset: u64, flags: ReadWriteFlags, ) -> io::Result { @@ -166,7 +167,7 @@ pub(crate) fn preadv2( #[cfg(linux_kernel)] pub(crate) fn pwritev2( fd: BorrowedFd<'_>, - bufs: &[IoSlice], + bufs: &[IoSlice<'_>], offset: u64, flags: ReadWriteFlags, ) -> io::Result { @@ -203,25 +204,22 @@ pub(crate) unsafe fn close(raw_fd: RawFd) { let _ = c::close(raw_fd as c::c_int); } -#[cfg(not(target_os = "espidf"))] -pub(crate) fn ioctl_fionread(fd: BorrowedFd<'_>) -> io::Result { - use core::mem::MaybeUninit; - - let mut nread = MaybeUninit::::uninit(); - unsafe { - ret(c::ioctl(borrowed_fd(fd), c::FIONREAD, nread.as_mut_ptr()))?; - // `FIONREAD` returns the number of bytes silently casted to a `c_int`, - // even when this is lossy. The best we can do is convert it back to a - // `u64` without sign-extending it back first. - Ok(u64::from(nread.assume_init() as c::c_uint)) - } +#[inline] +pub(crate) unsafe fn ioctl( + fd: BorrowedFd<'_>, + request: RawOpcode, + arg: *mut c::c_void, +) -> io::Result { + ret_c_int(c::ioctl(borrowed_fd(fd), request, arg)) } -pub(crate) fn ioctl_fionbio(fd: BorrowedFd<'_>, value: bool) -> io::Result<()> { - unsafe { - let data = value as c::c_int; - ret(c::ioctl(borrowed_fd(fd), c::FIONBIO, &data)) - } +#[inline] +pub(crate) unsafe fn ioctl_readonly( + fd: BorrowedFd<'_>, + request: RawOpcode, + arg: *mut c::c_void, +) -> io::Result { + ioctl(fd, request, arg) } #[cfg(not(any(target_os = "redox", target_os = "wasi")))] @@ -302,11 +300,13 @@ pub(crate) fn dup(fd: BorrowedFd<'_>) -> io::Result { unsafe { ret_owned_fd(c::dup(borrowed_fd(fd))) } } +#[allow(clippy::needless_pass_by_ref_mut)] #[cfg(not(target_os = "wasi"))] pub(crate) fn dup2(fd: BorrowedFd<'_>, new: &mut OwnedFd) -> io::Result<()> { unsafe { ret_discarded_fd(c::dup2(borrowed_fd(fd), borrowed_fd(new.as_fd()))) } } +#[allow(clippy::needless_pass_by_ref_mut)] #[cfg(not(any( apple, target_os = "aix", @@ -342,14 +342,3 @@ pub(crate) fn dup3(fd: BorrowedFd<'_>, new: &mut OwnedFd, _flags: DupFlags) -> i // have an `&mut OwnedFd` which means `fd` doesn't alias it. dup2(fd, new) } - -#[cfg(apple)] -pub(crate) fn ioctl_fioclex(fd: BorrowedFd<'_>) -> io::Result<()> { - unsafe { - ret(c::ioctl( - borrowed_fd(fd), - c::FIOCLEX, - core::ptr::null_mut::(), - )) - } -} diff --git a/vendor/rustix/src/backend/libc/io/types.rs b/vendor/rustix/src/backend/libc/io/types.rs index 8743336f2..eaf3eae71 100644 --- a/vendor/rustix/src/backend/libc/io/types.rs +++ b/vendor/rustix/src/backend/libc/io/types.rs @@ -11,6 +11,9 @@ bitflags! { pub struct FdFlags: u32 { /// `FD_CLOEXEC` const CLOEXEC = bitcast!(c::FD_CLOEXEC); + + /// + const _ = !0; } } @@ -33,6 +36,9 @@ bitflags! { const NOWAIT = linux_raw_sys::general::RWF_NOWAIT; /// `RWF_APPEND` (since Linux 4.16) const APPEND = linux_raw_sys::general::RWF_APPEND; + + /// + const _ = !0; } } @@ -52,5 +58,8 @@ bitflags! { target_os = "redox", )))] // Android 5.0 has dup3, but libc doesn't have bindings const CLOEXEC = bitcast!(c::O_CLOEXEC); + + /// + const _ = !0; } } diff --git a/vendor/rustix/src/backend/libc/io/windows_syscalls.rs b/vendor/rustix/src/backend/libc/io/windows_syscalls.rs index c87a2a247..049221d2f 100644 --- a/vendor/rustix/src/backend/libc/io/windows_syscalls.rs +++ b/vendor/rustix/src/backend/libc/io/windows_syscalls.rs @@ -1,27 +1,30 @@ //! Windows system calls in the `io` module. use crate::backend::c; -use crate::backend::conv::{borrowed_fd, ret}; +use crate::backend::conv::{borrowed_fd, ret_c_int}; use crate::backend::fd::LibcFd; use crate::fd::{BorrowedFd, RawFd}; use crate::io; -use core::mem::MaybeUninit; +use crate::ioctl::{IoctlOutput, RawOpcode}; pub(crate) unsafe fn close(raw_fd: RawFd) { let _ = c::close(raw_fd as LibcFd); } -pub(crate) fn ioctl_fionread(fd: BorrowedFd<'_>) -> io::Result { - let mut nread = MaybeUninit::::uninit(); - unsafe { - ret(c::ioctl(borrowed_fd(fd), c::FIONREAD, nread.as_mut_ptr()))?; - Ok(u64::from(nread.assume_init())) - } +#[inline] +pub(crate) unsafe fn ioctl( + fd: BorrowedFd<'_>, + request: RawOpcode, + arg: *mut c::c_void, +) -> io::Result { + ret_c_int(c::ioctl(borrowed_fd(fd), request, arg.cast())) } -pub(crate) fn ioctl_fionbio(fd: BorrowedFd<'_>, value: bool) -> io::Result<()> { - unsafe { - let mut data = value as c::c_uint; - ret(c::ioctl(borrowed_fd(fd), c::FIONBIO, &mut data)) - } +#[inline] +pub(crate) unsafe fn ioctl_readonly( + fd: BorrowedFd<'_>, + request: RawOpcode, + arg: *mut c::c_void, +) -> io::Result { + ioctl(fd, request, arg) } diff --git a/vendor/rustix/src/backend/libc/mm/types.rs b/vendor/rustix/src/backend/libc/mm/types.rs index 6a41cbe56..f0b4ad593 100644 --- a/vendor/rustix/src/backend/libc/mm/types.rs +++ b/vendor/rustix/src/backend/libc/mm/types.rs @@ -16,6 +16,9 @@ bitflags! { const WRITE = bitcast!(c::PROT_WRITE); /// `PROT_EXEC` const EXEC = bitcast!(c::PROT_EXEC); + + /// + const _ = !0; } } @@ -55,6 +58,9 @@ bitflags! { /// `PROT_ADI` #[cfg(all(linux_kernel, any(target_arch = "sparc", target_arch = "sparc64")))] const ADI = linux_raw_sys::general::PROT_ADI; + + /// + const _ = !0; } } @@ -74,6 +80,7 @@ bitflags! { #[cfg(not(any( bsd, solarish, + target_os = "aix", target_os = "android", target_os = "emscripten", target_os = "fuchsia", @@ -88,6 +95,7 @@ bitflags! { #[cfg(not(any( bsd, solarish, + target_os = "aix", target_os = "haiku", target_os = "nto", target_os = "redox", @@ -99,6 +107,7 @@ bitflags! { #[cfg(not(any( bsd, solarish, + target_os = "aix", target_os = "android", target_os = "emscripten", target_os = "fuchsia", @@ -111,6 +120,7 @@ bitflags! { #[cfg(not(any( bsd, solarish, + target_os = "aix", target_os = "haiku", target_os = "nto", target_os = "redox", @@ -120,6 +130,7 @@ bitflags! { #[cfg(not(any( bsd, solarish, + target_os = "aix", target_os = "haiku", target_os = "nto", target_os = "redox", @@ -129,6 +140,7 @@ bitflags! { #[cfg(not(any( bsd, solarish, + target_os = "aix", target_os = "android", target_os = "emscripten", target_os = "fuchsia", @@ -141,6 +153,7 @@ bitflags! { #[cfg(not(any( bsd, solarish, + target_os = "aix", target_os = "android", target_os = "emscripten", target_os = "fuchsia", @@ -153,6 +166,7 @@ bitflags! { #[cfg(not(any( bsd, solarish, + target_os = "aix", target_os = "haiku", target_os = "nto", target_os = "redox", @@ -162,7 +176,12 @@ bitflags! { #[cfg(freebsdlike)] const NOCORE = bitcast!(c::MAP_NOCORE); /// `MAP_NORESERVE` - #[cfg(not(any(freebsdlike, target_os = "nto", target_os = "redox")))] + #[cfg(not(any( + freebsdlike, + target_os = "aix", + target_os = "nto", + target_os = "redox", + )))] const NORESERVE = bitcast!(c::MAP_NORESERVE); /// `MAP_NOSYNC` #[cfg(freebsdlike)] @@ -171,6 +190,7 @@ bitflags! { #[cfg(not(any( bsd, solarish, + target_os = "aix", target_os = "haiku", target_os = "nto", target_os = "redox", @@ -180,6 +200,7 @@ bitflags! { #[cfg(not(any( apple, solarish, + target_os = "aix", target_os = "dragonfly", target_os = "haiku", target_os = "netbsd", @@ -193,6 +214,7 @@ bitflags! { #[cfg(not(any( bsd, solarish, + target_os = "aix", target_os = "android", target_os = "emscripten", target_os = "fuchsia", @@ -208,6 +230,9 @@ bitflags! { /// `MAP_UNINITIALIZED` #[cfg(any())] const UNINITIALIZED = bitcast!(c::MAP_UNINITIALIZED); + + /// + const _ = !0; } } @@ -224,6 +249,9 @@ bitflags! { pub struct MremapFlags: u32 { /// `MREMAP_MAYMOVE` const MAYMOVE = bitcast!(c::MREMAP_MAYMOVE); + + /// + const _ = !0; } } @@ -243,6 +271,9 @@ bitflags! { /// file (so that they can be updated with the fresh values just /// written). const INVALIDATE = bitcast!(c::MS_INVALIDATE); + + /// + const _ = !0; } } @@ -256,6 +287,9 @@ bitflags! { pub struct MlockFlags: u32 { /// `MLOCK_ONFAULT` const ONFAULT = bitcast!(c::MLOCK_ONFAULT); + + /// + const _ = !0; } } @@ -403,5 +437,8 @@ bitflags! { const CLOEXEC = bitcast!(c::O_CLOEXEC); /// `O_NONBLOCK` const NONBLOCK = bitcast!(c::O_NONBLOCK); + + /// + const _ = !0; } } diff --git a/vendor/rustix/src/backend/libc/mount/types.rs b/vendor/rustix/src/backend/libc/mount/types.rs index 660e6ae37..069a94444 100644 --- a/vendor/rustix/src/backend/libc/mount/types.rs +++ b/vendor/rustix/src/backend/libc/mount/types.rs @@ -54,6 +54,9 @@ bitflags! { /// `MS_SYNCHRONOUS` const SYNCHRONOUS = c::MS_SYNCHRONOUS; + + /// + const _ = !0; } } @@ -73,6 +76,9 @@ bitflags! { const EXPIRE = bitcast!(c::MNT_EXPIRE); /// `UMOUNT_NOFOLLOW` const NOFOLLOW = bitcast!(c::UMOUNT_NOFOLLOW); + + /// + const _ = !0; } } @@ -85,9 +91,11 @@ bitflags! { #[repr(transparent)] #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] pub struct FsOpenFlags: c::c_uint { - /// `FSOPEN_CLOEXEC` const FSOPEN_CLOEXEC = 0x00000001; + + /// + const _ = !0; } } @@ -102,6 +110,9 @@ bitflags! { pub struct FsMountFlags: c::c_uint { /// `FSMOUNT_CLOEXEC` const FSMOUNT_CLOEXEC = 0x00000001; + + /// + const _ = !0; } } @@ -180,6 +191,9 @@ bitflags! { /// `MOUNT_ATTR__ATIME_FLAGS` const MOUNT_ATTR_SIZE_VER0 = 32; + + /// + const _ = !0; } } @@ -219,6 +233,9 @@ bitflags! { /// `MOVE_MOUNT__MASK` const MOVE_MOUNT__MASK = 0x00000377; + + /// + const _ = !0; } } @@ -248,6 +265,9 @@ bitflags! { /// `AT_SYMLINK_NOFOLLOW` const AT_SYMLINK_NOFOLLOW = c::AT_SYMLINK_NOFOLLOW as c::c_uint; + + /// + const _ = !0; } } @@ -271,6 +291,9 @@ bitflags! { /// `FSPICK_EMPTY_PATH` const FSPICK_EMPTY_PATH = 0x00000008; + + /// + const _ = !0; } } @@ -294,6 +317,9 @@ bitflags! { const UNBINDABLE = c::MS_UNBINDABLE; /// `MS_REC` const REC = c::MS_REC; + + /// + const _ = !0; } } @@ -304,6 +330,9 @@ bitflags! { pub(crate) struct InternalMountFlags: c::c_ulong { const REMOUNT = c::MS_REMOUNT; const MOVE = c::MS_MOVE; + + /// + const _ = !0; } } diff --git a/vendor/rustix/src/backend/libc/net/addr.rs b/vendor/rustix/src/backend/libc/net/addr.rs index bd2e7dafe..6a140d767 100644 --- a/vendor/rustix/src/backend/libc/net/addr.rs +++ b/vendor/rustix/src/backend/libc/net/addr.rs @@ -76,15 +76,17 @@ impl SocketAddrUnix { fn init() -> c::sockaddr_un { c::sockaddr_un { - #[cfg(any(bsd, target_os = "haiku", target_os = "nto"))] + #[cfg(any(bsd, target_os = "aix", target_os = "haiku", target_os = "nto"))] sun_len: 0, sun_family: c::AF_UNIX as _, #[cfg(any(bsd, target_os = "nto"))] sun_path: [0; 104], - #[cfg(not(any(bsd, target_os = "haiku", target_os = "nto")))] + #[cfg(not(any(bsd, target_os = "aix", target_os = "haiku", target_os = "nto")))] sun_path: [0; 108], #[cfg(target_os = "haiku")] sun_path: [0; 126], + #[cfg(target_os = "aix")] + sun_path: [0; 1023], } } @@ -159,9 +161,7 @@ impl Eq for SocketAddrUnix {} impl PartialOrd for SocketAddrUnix { #[inline] fn partial_cmp(&self, other: &Self) -> Option { - let self_len = self.len() - offsetof_sun_path(); - let other_len = other.len() - offsetof_sun_path(); - self.unix.sun_path[..self_len].partial_cmp(&other.unix.sun_path[..other_len]) + Some(self.cmp(other)) } } @@ -208,18 +208,32 @@ pub type SocketAddrStorage = c::sockaddr_storage; #[inline] pub(crate) fn offsetof_sun_path() -> usize { let z = c::sockaddr_un { - #[cfg(any(bsd, target_os = "haiku", target_os = "nto"))] + #[cfg(any(bsd, target_os = "aix", target_os = "haiku", target_os = "nto"))] sun_len: 0_u8, - #[cfg(any(bsd, target_os = "espidf", target_os = "haiku", target_os = "nto"))] + #[cfg(any( + bsd, + target_os = "aix", + target_os = "espidf", + target_os = "haiku", + target_os = "nto" + ))] sun_family: 0_u8, - #[cfg(not(any(bsd, target_os = "espidf", target_os = "haiku", target_os = "nto")))] + #[cfg(not(any( + bsd, + target_os = "aix", + target_os = "espidf", + target_os = "haiku", + target_os = "nto" + )))] sun_family: 0_u16, #[cfg(any(bsd, target_os = "nto"))] sun_path: [0; 104], - #[cfg(not(any(bsd, target_os = "haiku", target_os = "nto")))] + #[cfg(not(any(bsd, target_os = "aix", target_os = "haiku", target_os = "nto")))] sun_path: [0; 108], #[cfg(target_os = "haiku")] sun_path: [0; 126], + #[cfg(target_os = "aix")] + sun_path: [0; 1023], }; (crate::utils::as_ptr(&z.sun_path) as usize) - (crate::utils::as_ptr(&z) as usize) } diff --git a/vendor/rustix/src/backend/libc/net/ext.rs b/vendor/rustix/src/backend/libc/net/ext.rs index 50bd89db6..eb7c20d7d 100644 --- a/vendor/rustix/src/backend/libc/net/ext.rs +++ b/vendor/rustix/src/backend/libc/net/ext.rs @@ -78,7 +78,14 @@ pub(crate) const fn sockaddr_in6_sin6_scope_id(addr: &c::sockaddr_in6) -> u32 { #[cfg(not(windows))] #[inline] pub(crate) const fn sockaddr_in6_new( - #[cfg(any(bsd, target_os = "espidf", target_os = "haiku", target_os = "nto"))] sin6_len: u8, + #[cfg(any( + bsd, + target_os = "aix", + target_os = "espidf", + target_os = "haiku", + target_os = "nto" + ))] + sin6_len: u8, sin6_family: c::sa_family_t, sin6_port: u16, sin6_flowinfo: u32, @@ -86,7 +93,13 @@ pub(crate) const fn sockaddr_in6_new( sin6_scope_id: u32, ) -> c::sockaddr_in6 { c::sockaddr_in6 { - #[cfg(any(bsd, target_os = "espidf", target_os = "haiku", target_os = "nto"))] + #[cfg(any( + bsd, + target_os = "aix", + target_os = "espidf", + target_os = "haiku", + target_os = "nto" + ))] sin6_len, sin6_family, sin6_port, diff --git a/vendor/rustix/src/backend/libc/net/msghdr.rs b/vendor/rustix/src/backend/libc/net/msghdr.rs index e3f873747..2ccd7f20c 100644 --- a/vendor/rustix/src/backend/libc/net/msghdr.rs +++ b/vendor/rustix/src/backend/libc/net/msghdr.rs @@ -24,7 +24,7 @@ pub(crate) fn with_recv_msghdr( let namelen = size_of::() as c::socklen_t; let mut msghdr = { - let mut h: c::msghdr = unsafe { zeroed() }; + let mut h = zero_msghdr(); h.msg_name = name.as_mut_ptr().cast(); h.msg_namelen = namelen; h.msg_iov = iov.as_mut_ptr().cast(); @@ -53,7 +53,7 @@ pub(crate) fn with_noaddr_msghdr( f: impl FnOnce(c::msghdr) -> R, ) -> R { f({ - let mut h: c::msghdr = unsafe { zeroed() }; + let mut h = zero_msghdr(); h.msg_iov = iov.as_ptr() as _; h.msg_iovlen = msg_iov_len(iov.len()); h.msg_control = control.as_control_ptr().cast(); @@ -69,10 +69,10 @@ pub(crate) fn with_v4_msghdr( control: &mut SendAncillaryBuffer<'_, '_, '_>, f: impl FnOnce(c::msghdr) -> R, ) -> R { - let encoded = unsafe { encode_sockaddr_v4(addr) }; + let encoded = encode_sockaddr_v4(addr); f({ - let mut h: c::msghdr = unsafe { zeroed() }; + let mut h = zero_msghdr(); h.msg_name = as_ptr(&encoded) as _; h.msg_namelen = size_of::() as _; h.msg_iov = iov.as_ptr() as _; @@ -90,10 +90,10 @@ pub(crate) fn with_v6_msghdr( control: &mut SendAncillaryBuffer<'_, '_, '_>, f: impl FnOnce(c::msghdr) -> R, ) -> R { - let encoded = unsafe { encode_sockaddr_v6(addr) }; + let encoded = encode_sockaddr_v6(addr); f({ - let mut h: c::msghdr = unsafe { zeroed() }; + let mut h = zero_msghdr(); h.msg_name = as_ptr(&encoded) as _; h.msg_namelen = size_of::() as _; h.msg_iov = iov.as_ptr() as _; @@ -113,7 +113,7 @@ pub(crate) fn with_unix_msghdr( f: impl FnOnce(c::msghdr) -> R, ) -> R { f({ - let mut h: c::msghdr = unsafe { zeroed() }; + let mut h = zero_msghdr(); h.msg_name = as_ptr(addr) as _; h.msg_namelen = addr.addr_len(); h.msg_iov = iov.as_ptr() as _; @@ -123,3 +123,12 @@ pub(crate) fn with_unix_msghdr( h }) } + +/// Create a zero-initialized message header struct value. +#[cfg(all(unix, not(target_os = "redox")))] +pub(crate) fn zero_msghdr() -> c::msghdr { + // SAFETY: We can't initialize all the fields by value because on some + // platforms the `msghdr` struct in the libc crate contains private padding + // fields. But it is still a C type that's meant to be zero-initializable. + unsafe { zeroed() } +} diff --git a/vendor/rustix/src/backend/libc/net/read_sockaddr.rs b/vendor/rustix/src/backend/libc/net/read_sockaddr.rs index cde851af6..604f24928 100644 --- a/vendor/rustix/src/backend/libc/net/read_sockaddr.rs +++ b/vendor/rustix/src/backend/libc/net/read_sockaddr.rs @@ -26,11 +26,29 @@ struct sockaddr_header { unsafe fn read_ss_family(storage: *const c::sockaddr_storage) -> u16 { // Assert that we know the layout of `sockaddr`. let _ = c::sockaddr { - #[cfg(any(bsd, target_os = "espidf", target_os = "haiku", target_os = "nto"))] + #[cfg(any( + bsd, + target_os = "aix", + target_os = "espidf", + target_os = "haiku", + target_os = "nto" + ))] sa_len: 0_u8, - #[cfg(any(bsd, target_os = "espidf", target_os = "haiku", target_os = "nto"))] + #[cfg(any( + bsd, + target_os = "aix", + target_os = "espidf", + target_os = "haiku", + target_os = "nto" + ))] sa_family: 0_u8, - #[cfg(not(any(bsd, target_os = "espidf", target_os = "haiku", target_os = "nto")))] + #[cfg(not(any( + bsd, + target_os = "aix", + target_os = "espidf", + target_os = "haiku", + target_os = "nto" + )))] sa_family: 0_u16, #[cfg(not(target_os = "haiku"))] sa_data: [0; 14], diff --git a/vendor/rustix/src/backend/libc/net/send_recv.rs b/vendor/rustix/src/backend/libc/net/send_recv.rs index 26543a1fd..76dc97e78 100644 --- a/vendor/rustix/src/backend/libc/net/send_recv.rs +++ b/vendor/rustix/src/backend/libc/net/send_recv.rs @@ -14,6 +14,7 @@ bitflags! { bsd, solarish, windows, + target_os = "aix", target_os = "espidf", target_os = "nto", target_os = "haiku", @@ -32,6 +33,7 @@ bitflags! { bsd, solarish, windows, + target_os = "aix", target_os = "haiku", target_os = "nto", )))] @@ -41,6 +43,9 @@ bitflags! { const NOSIGNAL = bitcast!(c::MSG_NOSIGNAL); /// `MSG_OOB` const OOB = bitcast!(c::MSG_OOB); + + /// + const _ = !0; } } @@ -52,7 +57,15 @@ bitflags! { #[repr(transparent)] #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] pub struct RecvFlags: u32 { - #[cfg(not(any(apple, solarish, windows, target_os = "espidf", target_os = "haiku", target_os = "nto")))] + #[cfg(not(any( + apple, + solarish, + windows, + target_os = "aix", + target_os = "espidf", + target_os = "haiku", + target_os = "nto", + )))] /// `MSG_CMSG_CLOEXEC` const CMSG_CLOEXEC = bitcast!(c::MSG_CMSG_CLOEXEC); /// `MSG_DONTWAIT` @@ -63,6 +76,7 @@ bitflags! { bsd, solarish, windows, + target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", @@ -76,5 +90,8 @@ bitflags! { const TRUNC = bitcast!(c::MSG_TRUNC); /// `MSG_WAITALL` const WAITALL = bitcast!(c::MSG_WAITALL); + + /// + const _ = !0; } } diff --git a/vendor/rustix/src/backend/libc/net/syscalls.rs b/vendor/rustix/src/backend/libc/net/syscalls.rs index b4550583c..2e968ba3e 100644 --- a/vendor/rustix/src/backend/libc/net/syscalls.rs +++ b/vendor/rustix/src/backend/libc/net/syscalls.rs @@ -358,6 +358,7 @@ pub(crate) fn sendmsg_unix( #[cfg(not(any( apple, windows, + target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "redox", @@ -396,6 +397,7 @@ pub(crate) fn acceptfrom(sockfd: BorrowedFd<'_>) -> io::Result<(OwnedFd, Option< #[cfg(not(any( apple, windows, + target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", @@ -427,6 +429,7 @@ pub(crate) fn acceptfrom_with( #[cfg(any( apple, windows, + target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto" @@ -440,6 +443,7 @@ pub(crate) fn accept_with(sockfd: BorrowedFd<'_>, _flags: SocketFlags) -> io::Re #[cfg(any( apple, windows, + target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto" @@ -517,8 +521,24 @@ pub(crate) mod sockopt { use super::{c, in6_addr_new, in_addr_new, BorrowedFd}; use crate::io; use crate::net::sockopt::Timeout; + #[cfg(not(any( + apple, + windows, + target_os = "aix", + target_os = "dragonfly", + target_os = "emscripten", + target_os = "espidf", + target_os = "haiku", + target_os = "netbsd", + target_os = "nto", + )))] + use crate::net::AddressFamily; use crate::net::{Ipv4Addr, Ipv6Addr, SocketType}; use crate::utils::as_mut_ptr; + #[cfg(apple)] + use c::TCP_KEEPALIVE as TCP_KEEPIDLE; + #[cfg(not(any(apple, target_os = "openbsd", target_os = "haiku", target_os = "nto")))] + use c::TCP_KEEPIDLE; use core::time::Duration; #[cfg(windows)] use windows_sys::Win32::Foundation::BOOL; @@ -596,6 +616,11 @@ pub(crate) mod sockopt { ) } + #[inline] + pub(crate) fn get_socket_reuseaddr(fd: BorrowedFd<'_>) -> io::Result { + getsockopt(fd, c::SOL_SOCKET as _, c::SO_REUSEADDR).map(to_bool) + } + #[inline] pub(crate) fn set_socket_broadcast(fd: BorrowedFd<'_>, broadcast: bool) -> io::Result<()> { setsockopt( @@ -618,11 +643,7 @@ pub(crate) mod sockopt { ) -> io::Result<()> { // Convert `linger` to seconds, rounding up. let l_linger = if let Some(linger) = linger { - let mut l_linger = linger.as_secs(); - if linger.subsec_nanos() != 0 { - l_linger = l_linger.checked_add(1).ok_or(io::Errno::INVAL)?; - } - l_linger.try_into().map_err(|_e| io::Errno::INVAL)? + duration_to_secs(linger)? } else { 0 }; @@ -809,6 +830,31 @@ pub(crate) mod sockopt { getsockopt(fd, c::SOL_SOCKET as _, c::SO_SNDBUF).map(|size: u32| size as usize) } + #[inline] + #[cfg(not(any( + apple, + windows, + target_os = "aix", + target_os = "dragonfly", + target_os = "emscripten", + target_os = "espidf", + target_os = "haiku", + target_os = "netbsd", + target_os = "nto", + )))] + pub(crate) fn get_socket_domain(fd: BorrowedFd<'_>) -> io::Result { + let domain: c::c_int = getsockopt(fd, c::SOL_SOCKET as _, c::SO_DOMAIN)?; + Ok(AddressFamily( + domain.try_into().map_err(|_| io::Errno::OPNOTSUPP)?, + )) + } + + #[inline] + #[cfg(not(apple))] // Apple platforms declare the constant, but do not actually implement it. + pub(crate) fn get_socket_acceptconn(fd: BorrowedFd<'_>) -> io::Result { + getsockopt(fd, c::SOL_SOCKET as _, c::SO_ACCEPTCONN).map(to_bool) + } + #[inline] pub(crate) fn set_ip_ttl(fd: BorrowedFd<'_>, ttl: u32) -> io::Result<()> { setsockopt(fd, c::IPPROTO_IP as _, c::IP_TTL, ttl) @@ -991,6 +1037,46 @@ pub(crate) mod sockopt { getsockopt(fd, c::IPPROTO_TCP as _, c::TCP_NODELAY).map(to_bool) } + #[inline] + #[cfg(not(any(target_os = "openbsd", target_os = "haiku", target_os = "nto")))] + pub(crate) fn set_tcp_keepcnt(fd: BorrowedFd<'_>, count: u32) -> io::Result<()> { + setsockopt(fd, c::IPPROTO_TCP as _, c::TCP_KEEPCNT, count) + } + + #[inline] + #[cfg(not(any(target_os = "openbsd", target_os = "haiku", target_os = "nto")))] + pub(crate) fn get_tcp_keepcnt(fd: BorrowedFd<'_>) -> io::Result { + getsockopt(fd, c::IPPROTO_TCP as _, c::TCP_KEEPCNT) + } + + #[inline] + #[cfg(not(any(target_os = "openbsd", target_os = "haiku", target_os = "nto")))] + pub(crate) fn set_tcp_keepidle(fd: BorrowedFd<'_>, duration: Duration) -> io::Result<()> { + let secs: c::c_uint = duration_to_secs(duration)?; + setsockopt(fd, c::IPPROTO_TCP as _, TCP_KEEPIDLE, secs) + } + + #[inline] + #[cfg(not(any(target_os = "openbsd", target_os = "haiku", target_os = "nto")))] + pub(crate) fn get_tcp_keepidle(fd: BorrowedFd<'_>) -> io::Result { + let secs: c::c_uint = getsockopt(fd, c::IPPROTO_TCP as _, TCP_KEEPIDLE)?; + Ok(Duration::from_secs(secs as u64)) + } + + #[inline] + #[cfg(not(any(target_os = "openbsd", target_os = "haiku", target_os = "nto")))] + pub(crate) fn set_tcp_keepintvl(fd: BorrowedFd<'_>, duration: Duration) -> io::Result<()> { + let secs: c::c_uint = duration_to_secs(duration)?; + setsockopt(fd, c::IPPROTO_TCP as _, c::TCP_KEEPINTVL, secs) + } + + #[inline] + #[cfg(not(any(target_os = "openbsd", target_os = "haiku", target_os = "nto")))] + pub(crate) fn get_tcp_keepintvl(fd: BorrowedFd<'_>) -> io::Result { + let secs: c::c_uint = getsockopt(fd, c::IPPROTO_TCP as _, c::TCP_KEEPINTVL)?; + Ok(Duration::from_secs(secs as u64)) + } + #[inline] fn to_imr(multiaddr: &Ipv4Addr, interface: &Ipv4Addr) -> c::ip_mreq { c::ip_mreq { @@ -1051,4 +1137,14 @@ pub(crate) mod sockopt { fn to_bool(value: SocketBool) -> bool { value.0 != 0 } + + /// Convert to seconds, rounding up if necessary. + #[inline] + fn duration_to_secs>(duration: Duration) -> io::Result { + let mut secs = duration.as_secs(); + if duration.subsec_nanos() != 0 { + secs = secs.checked_add(1).ok_or(io::Errno::INVAL)?; + } + T::try_from(secs).map_err(|_e| io::Errno::INVAL) + } } diff --git a/vendor/rustix/src/backend/libc/net/write_sockaddr.rs b/vendor/rustix/src/backend/libc/net/write_sockaddr.rs index 46f0ef40a..a354d9a85 100644 --- a/vendor/rustix/src/backend/libc/net/write_sockaddr.rs +++ b/vendor/rustix/src/backend/libc/net/write_sockaddr.rs @@ -21,9 +21,15 @@ pub(crate) unsafe fn write_sockaddr( } } -pub(crate) unsafe fn encode_sockaddr_v4(v4: &SocketAddrV4) -> c::sockaddr_in { +pub(crate) fn encode_sockaddr_v4(v4: &SocketAddrV4) -> c::sockaddr_in { c::sockaddr_in { - #[cfg(any(bsd, target_os = "espidf", target_os = "haiku", target_os = "nto"))] + #[cfg(any( + bsd, + target_os = "aix", + target_os = "espidf", + target_os = "haiku", + target_os = "nto", + ))] sin_len: size_of::() as _, sin_family: c::AF_INET as _, sin_port: u16::to_be(v4.port()), @@ -41,8 +47,14 @@ unsafe fn write_sockaddr_v4(v4: &SocketAddrV4, storage: *mut SocketAddrStorage) size_of::() } -pub(crate) unsafe fn encode_sockaddr_v6(v6: &SocketAddrV6) -> c::sockaddr_in6 { - #[cfg(any(bsd, target_os = "espidf", target_os = "haiku", target_os = "nto"))] +pub(crate) fn encode_sockaddr_v6(v6: &SocketAddrV6) -> c::sockaddr_in6 { + #[cfg(any( + bsd, + target_os = "aix", + target_os = "espidf", + target_os = "haiku", + target_os = "nto", + ))] { sockaddr_in6_new( size_of::() as _, @@ -53,7 +65,13 @@ pub(crate) unsafe fn encode_sockaddr_v6(v6: &SocketAddrV6) -> c::sockaddr_in6 { v6.scope_id(), ) } - #[cfg(not(any(bsd, target_os = "espidf", target_os = "haiku", target_os = "nto")))] + #[cfg(not(any( + bsd, + target_os = "aix", + target_os = "espidf", + target_os = "haiku", + target_os = "nto" + )))] { sockaddr_in6_new( c::AF_INET6 as _, diff --git a/vendor/rustix/src/backend/libc/pipe/syscalls.rs b/vendor/rustix/src/backend/libc/pipe/syscalls.rs index 24262cc9a..cff932d55 100644 --- a/vendor/rustix/src/backend/libc/pipe/syscalls.rs +++ b/vendor/rustix/src/backend/libc/pipe/syscalls.rs @@ -55,9 +55,9 @@ pub(crate) fn pipe_with(flags: PipeFlags) -> io::Result<(OwnedFd, OwnedFd)> { #[cfg(linux_kernel)] #[inline] pub fn splice( - fd_in: BorrowedFd, + fd_in: BorrowedFd<'_>, off_in: Option<&mut u64>, - fd_out: BorrowedFd, + fd_out: BorrowedFd<'_>, off_out: Option<&mut u64>, len: usize, flags: SpliceFlags, @@ -80,8 +80,8 @@ pub fn splice( #[cfg(linux_kernel)] #[inline] pub unsafe fn vmsplice( - fd: BorrowedFd, - bufs: &[IoSliceRaw], + fd: BorrowedFd<'_>, + bufs: &[IoSliceRaw<'_>], flags: SpliceFlags, ) -> io::Result { ret_usize(c::vmsplice( @@ -95,8 +95,8 @@ pub unsafe fn vmsplice( #[cfg(linux_kernel)] #[inline] pub fn tee( - fd_in: BorrowedFd, - fd_out: BorrowedFd, + fd_in: BorrowedFd<'_>, + fd_out: BorrowedFd<'_>, len: usize, flags: SpliceFlags, ) -> io::Result { diff --git a/vendor/rustix/src/backend/libc/pipe/types.rs b/vendor/rustix/src/backend/libc/pipe/types.rs index 3fa0464e0..7f5634b17 100644 --- a/vendor/rustix/src/backend/libc/pipe/types.rs +++ b/vendor/rustix/src/backend/libc/pipe/types.rs @@ -25,6 +25,9 @@ bitflags! { const DIRECT = bitcast!(c::O_DIRECT); /// `O_NONBLOCK` const NONBLOCK = bitcast!(c::O_NONBLOCK); + + /// + const _ = !0; } } @@ -43,6 +46,9 @@ bitflags! { const MORE = c::SPLICE_F_MORE; /// `SPLICE_F_GIFT` const GIFT = c::SPLICE_F_GIFT; + + /// + const _ = !0; } } diff --git a/vendor/rustix/src/backend/libc/process/syscalls.rs b/vendor/rustix/src/backend/libc/process/syscalls.rs index a84385cf1..dd71801d5 100644 --- a/vendor/rustix/src/backend/libc/process/syscalls.rs +++ b/vendor/rustix/src/backend/libc/process/syscalls.rs @@ -3,9 +3,11 @@ #[cfg(any(linux_kernel, target_os = "dragonfly", target_os = "fuchsia"))] use super::types::RawCpuSet; use crate::backend::c; +#[cfg(not(any(target_os = "wasi", target_os = "fuchsia")))] +use crate::backend::conv::borrowed_fd; #[cfg(feature = "fs")] use crate::backend::conv::c_str; -#[cfg(all(feature = "fs", not(target_os = "wasi")))] +#[cfg(all(feature = "alloc", feature = "fs", not(target_os = "wasi")))] use crate::backend::conv::ret_discarded_char_ptr; #[cfg(not(any( target_os = "espidf", @@ -14,12 +16,14 @@ use crate::backend::conv::ret_discarded_char_ptr; target_os = "wasi" )))] use crate::backend::conv::ret_infallible; +#[cfg(not(target_os = "wasi"))] +use crate::backend::conv::ret_pid_t; #[cfg(linux_kernel)] use crate::backend::conv::ret_u32; -#[cfg(not(target_os = "wasi"))] -use crate::backend::conv::{borrowed_fd, ret_pid_t, ret_usize}; +#[cfg(all(feature = "alloc", not(target_os = "wasi")))] +use crate::backend::conv::ret_usize; use crate::backend::conv::{ret, ret_c_int}; -#[cfg(not(target_os = "wasi"))] +#[cfg(not(any(target_os = "wasi", target_os = "fuchsia")))] use crate::fd::BorrowedFd; #[cfg(target_os = "linux")] use crate::fd::{AsRawFd, OwnedFd, RawFd}; @@ -28,12 +32,14 @@ use crate::ffi::CStr; #[cfg(feature = "fs")] use crate::fs::Mode; use crate::io; +#[cfg(all(feature = "alloc", not(target_os = "wasi")))] +use crate::process::Gid; +#[cfg(not(target_os = "wasi"))] +use crate::process::Pid; #[cfg(not(any(target_os = "espidf", target_os = "fuchsia", target_os = "wasi")))] use crate::process::Uid; #[cfg(linux_kernel)] use crate::process::{Cpuid, MembarrierCommand, MembarrierQuery}; -#[cfg(not(target_os = "wasi"))] -use crate::process::{Gid, Pid}; #[cfg(not(any(target_os = "espidf", target_os = "wasi")))] use crate::process::{RawPid, Signal, WaitOptions, WaitStatus}; #[cfg(not(any( @@ -73,7 +79,7 @@ pub(crate) fn chroot(path: &CStr) -> io::Result<()> { unsafe { ret(c::chroot(c_str(path))) } } -#[cfg(feature = "fs")] +#[cfg(all(feature = "alloc", feature = "fs"))] #[cfg(not(target_os = "wasi"))] pub(crate) fn getcwd(buf: &mut [MaybeUninit]) -> io::Result<()> { unsafe { ret_discarded_char_ptr(c::getcwd(buf.as_mut_ptr().cast(), buf.len())) } @@ -612,20 +618,9 @@ pub(crate) fn pidfd_getfd( } } -#[cfg(not(target_os = "wasi"))] +#[cfg(all(feature = "alloc", not(target_os = "wasi")))] pub(crate) fn getgroups(buf: &mut [Gid]) -> io::Result { let len = buf.len().try_into().map_err(|_| io::Errno::NOMEM)?; unsafe { ret_usize(c::getgroups(len, buf.as_mut_ptr().cast()) as isize) } } - -#[cfg(not(any( - target_os = "aix", - target_os = "espidf", - target_os = "redox", - target_os = "wasi" -)))] -#[inline] -pub(crate) fn ioctl_tiocsctty(fd: BorrowedFd<'_>) -> io::Result<()> { - unsafe { ret(c::ioctl(borrowed_fd(fd), c::TIOCSCTTY as _, &0_u32)) } -} diff --git a/vendor/rustix/src/backend/libc/process/types.rs b/vendor/rustix/src/backend/libc/process/types.rs index 9c543acd0..26bae3498 100644 --- a/vendor/rustix/src/backend/libc/process/types.rs +++ b/vendor/rustix/src/backend/libc/process/types.rs @@ -141,11 +141,6 @@ impl Resource { pub const Rss: Self = Self::As; } -pub const EXIT_SUCCESS: c::c_int = c::EXIT_SUCCESS; -pub const EXIT_FAILURE: c::c_int = c::EXIT_FAILURE; -#[cfg(not(any(target_os = "espidf", target_os = "wasi")))] -pub const EXIT_SIGNALED_SIGABRT: c::c_int = 128 + c::SIGABRT; - /// A CPU identifier as a raw integer. #[cfg(linux_kernel)] pub type RawCpuid = u32; diff --git a/vendor/rustix/src/backend/libc/pty/syscalls.rs b/vendor/rustix/src/backend/libc/pty/syscalls.rs index 6688ddb26..cf566045d 100644 --- a/vendor/rustix/src/backend/libc/pty/syscalls.rs +++ b/vendor/rustix/src/backend/libc/pty/syscalls.rs @@ -4,9 +4,10 @@ use crate::backend::c; use crate::backend::conv::{borrowed_fd, ret}; use crate::fd::BorrowedFd; use crate::io; -#[cfg(not(target_os = "android"))] -use {crate::backend::conv::ret_owned_fd, crate::fd::OwnedFd, crate::pty::OpenptFlags}; -#[cfg(any(apple, linux_like, target_os = "freebsd", target_os = "fuchsia"))] +#[cfg(all( + feature = "alloc", + any(apple, linux_like, target_os = "freebsd", target_os = "fuchsia") +))] use { crate::ffi::{CStr, CString}, crate::path::SMALL_PATH_BUFFER_SIZE, @@ -14,15 +15,21 @@ use { alloc::vec::Vec, }; +#[cfg(not(linux_kernel))] +use crate::{backend::conv::ret_owned_fd, fd::OwnedFd, pty::OpenptFlags}; + #[cfg(not(linux_kernel))] #[inline] pub(crate) fn openpt(flags: OpenptFlags) -> io::Result { unsafe { ret_owned_fd(c::posix_openpt(flags.bits() as _)) } } -#[cfg(any(apple, linux_like, target_os = "freebsd", target_os = "fuchsia"))] +#[cfg(all( + feature = "alloc", + any(apple, linux_like, target_os = "freebsd", target_os = "fuchsia") +))] #[inline] -pub(crate) fn ptsname(fd: BorrowedFd, mut buffer: Vec) -> io::Result { +pub(crate) fn ptsname(fd: BorrowedFd<'_>, mut buffer: Vec) -> io::Result { // This code would benefit from having a better way to read into // uninitialized memory, but that requires `unsafe`. buffer.clear(); @@ -86,18 +93,12 @@ pub(crate) fn ptsname(fd: BorrowedFd, mut buffer: Vec) -> io::Result io::Result<()> { +pub(crate) fn unlockpt(fd: BorrowedFd<'_>) -> io::Result<()> { unsafe { ret(c::unlockpt(borrowed_fd(fd))) } } #[cfg(not(linux_kernel))] #[inline] -pub(crate) fn grantpt(fd: BorrowedFd) -> io::Result<()> { +pub(crate) fn grantpt(fd: BorrowedFd<'_>) -> io::Result<()> { unsafe { ret(c::grantpt(borrowed_fd(fd))) } } - -#[cfg(target_os = "linux")] -#[inline] -pub(crate) fn ioctl_tiocgptpeer(fd: BorrowedFd, flags: OpenptFlags) -> io::Result { - unsafe { ret_owned_fd(c::ioctl(borrowed_fd(fd), c::TIOCGPTPEER, flags.bits())) } -} diff --git a/vendor/rustix/src/backend/libc/rand/types.rs b/vendor/rustix/src/backend/libc/rand/types.rs index 730cf3a34..cd436b618 100644 --- a/vendor/rustix/src/backend/libc/rand/types.rs +++ b/vendor/rustix/src/backend/libc/rand/types.rs @@ -17,5 +17,8 @@ bitflags! { const NONBLOCK = c::GRND_NONBLOCK; /// `GRND_INSECURE` const INSECURE = c::GRND_INSECURE; + + /// + const _ = !0; } } diff --git a/vendor/rustix/src/backend/libc/termios/syscalls.rs b/vendor/rustix/src/backend/libc/termios/syscalls.rs index ea284927f..df96595cd 100644 --- a/vendor/rustix/src/backend/libc/termios/syscalls.rs +++ b/vendor/rustix/src/backend/libc/termios/syscalls.rs @@ -9,7 +9,7 @@ use crate::backend::c; use crate::backend::conv::ret_pid_t; use crate::backend::conv::{borrowed_fd, ret}; use crate::fd::BorrowedFd; -#[cfg(feature = "procfs")] +#[cfg(all(feature = "alloc", feature = "procfs"))] #[cfg(not(any(target_os = "fuchsia", target_os = "wasi")))] use crate::ffi::CStr; #[cfg(any( @@ -33,19 +33,21 @@ pub(crate) fn tcgetattr(fd: BorrowedFd<'_>) -> io::Result { // If we have `TCGETS2`, use it, so that we fill in the `c_ispeed` and // `c_ospeed` fields. #[cfg(linux_kernel)] - unsafe { + { use crate::termios::{ControlModes, InputModes, LocalModes, OutputModes, SpecialCodes}; - use core::mem::zeroed; + use crate::utils::default_array; - let mut termios2 = MaybeUninit::::uninit(); + let termios2 = unsafe { + let mut termios2 = MaybeUninit::::uninit(); - ret(c::ioctl( - borrowed_fd(fd), - c::TCGETS2 as _, - termios2.as_mut_ptr(), - ))?; + ret(c::ioctl( + borrowed_fd(fd), + c::TCGETS2 as _, + termios2.as_mut_ptr(), + ))?; - let termios2 = termios2.assume_init(); + termios2.assume_init() + }; // Convert from the Linux `termios2` to our `Termios`. let mut result = Termios { @@ -54,7 +56,7 @@ pub(crate) fn tcgetattr(fd: BorrowedFd<'_>) -> io::Result { control_modes: ControlModes::from_bits_retain(termios2.c_cflag), local_modes: LocalModes::from_bits_retain(termios2.c_lflag), line_discipline: termios2.c_line, - special_codes: SpecialCodes(zeroed()), + special_codes: SpecialCodes(default_array()), input_speed: termios2.c_ispeed, output_speed: termios2.c_ospeed, }; @@ -90,16 +92,16 @@ pub(crate) fn tcsetpgrp(fd: BorrowedFd<'_>, pid: Pid) -> io::Result<()> { #[cfg(not(any(target_os = "espidf", target_os = "wasi")))] pub(crate) fn tcsetattr( - fd: BorrowedFd, + fd: BorrowedFd<'_>, optional_actions: OptionalActions, termios: &Termios, ) -> io::Result<()> { // If we have `TCSETS2`, use it, so that we use the `c_ispeed` and // `c_ospeed` fields. #[cfg(linux_kernel)] - unsafe { + { use crate::termios::speed; - use core::mem::zeroed; + use crate::utils::default_array; use linux_raw_sys::general::{termios2, BOTHER, CBAUD, IBSHIFT}; #[cfg(not(any(target_arch = "sparc", target_arch = "sparc64")))] @@ -134,7 +136,7 @@ pub(crate) fn tcsetattr( c_cflag: termios.control_modes.bits(), c_lflag: termios.local_modes.bits(), c_line: termios.line_discipline, - c_cc: zeroed(), + c_cc: default_array(), c_ispeed: input_speed, c_ospeed: output_speed, }; @@ -149,7 +151,7 @@ pub(crate) fn tcsetattr( .c_cc .copy_from_slice(&termios.special_codes.0[..nccs]); - ret(c::ioctl(borrowed_fd(fd), request as _, &termios2)) + unsafe { ret(c::ioctl(borrowed_fd(fd), request as _, &termios2)) } } #[cfg(not(linux_kernel))] @@ -163,27 +165,27 @@ pub(crate) fn tcsetattr( } #[cfg(not(target_os = "wasi"))] -pub(crate) fn tcsendbreak(fd: BorrowedFd) -> io::Result<()> { +pub(crate) fn tcsendbreak(fd: BorrowedFd<'_>) -> io::Result<()> { unsafe { ret(c::tcsendbreak(borrowed_fd(fd), 0)) } } #[cfg(not(any(target_os = "espidf", target_os = "wasi")))] -pub(crate) fn tcdrain(fd: BorrowedFd) -> io::Result<()> { +pub(crate) fn tcdrain(fd: BorrowedFd<'_>) -> io::Result<()> { unsafe { ret(c::tcdrain(borrowed_fd(fd))) } } #[cfg(not(any(target_os = "espidf", target_os = "wasi")))] -pub(crate) fn tcflush(fd: BorrowedFd, queue_selector: QueueSelector) -> io::Result<()> { +pub(crate) fn tcflush(fd: BorrowedFd<'_>, queue_selector: QueueSelector) -> io::Result<()> { unsafe { ret(c::tcflush(borrowed_fd(fd), queue_selector as _)) } } #[cfg(not(any(target_os = "espidf", target_os = "wasi")))] -pub(crate) fn tcflow(fd: BorrowedFd, action: Action) -> io::Result<()> { +pub(crate) fn tcflow(fd: BorrowedFd<'_>, action: Action) -> io::Result<()> { unsafe { ret(c::tcflow(borrowed_fd(fd), action as _)) } } #[cfg(not(target_os = "wasi"))] -pub(crate) fn tcgetsid(fd: BorrowedFd) -> io::Result { +pub(crate) fn tcgetsid(fd: BorrowedFd<'_>) -> io::Result { unsafe { let pid = ret_pid_t(c::tcgetsid(borrowed_fd(fd)))?; Ok(Pid::from_raw_unchecked(pid)) @@ -191,12 +193,12 @@ pub(crate) fn tcgetsid(fd: BorrowedFd) -> io::Result { } #[cfg(not(any(target_os = "espidf", target_os = "wasi")))] -pub(crate) fn tcsetwinsize(fd: BorrowedFd, winsize: Winsize) -> io::Result<()> { +pub(crate) fn tcsetwinsize(fd: BorrowedFd<'_>, winsize: Winsize) -> io::Result<()> { unsafe { ret(c::ioctl(borrowed_fd(fd), c::TIOCSWINSZ, &winsize)) } } #[cfg(not(any(target_os = "espidf", target_os = "wasi")))] -pub(crate) fn tcgetwinsize(fd: BorrowedFd) -> io::Result { +pub(crate) fn tcgetwinsize(fd: BorrowedFd<'_>) -> io::Result { unsafe { let mut buf = MaybeUninit::::uninit(); ret(c::ioctl( @@ -208,26 +210,6 @@ pub(crate) fn tcgetwinsize(fd: BorrowedFd) -> io::Result { } } -#[cfg(not(any( - target_os = "espidf", - target_os = "haiku", - target_os = "redox", - target_os = "wasi" -)))] -pub(crate) fn ioctl_tiocexcl(fd: BorrowedFd) -> io::Result<()> { - unsafe { ret(c::ioctl(borrowed_fd(fd), c::TIOCEXCL as _)) } -} - -#[cfg(not(any( - target_os = "espidf", - target_os = "haiku", - target_os = "redox", - target_os = "wasi" -)))] -pub(crate) fn ioctl_tiocnxcl(fd: BorrowedFd) -> io::Result<()> { - unsafe { ret(c::ioctl(borrowed_fd(fd), c::TIOCNXCL as _)) } -} - #[cfg(not(any(target_os = "espidf", target_os = "nto", target_os = "wasi")))] #[inline] pub(crate) fn set_speed(termios: &mut Termios, arbitrary_speed: u32) -> io::Result<()> { @@ -365,7 +347,7 @@ pub(crate) fn isatty(fd: BorrowedFd<'_>) -> bool { unsafe { c::isatty(borrowed_fd(fd)) != 0 } } -#[cfg(feature = "procfs")] +#[cfg(all(feature = "alloc", feature = "procfs"))] #[cfg(not(any(target_os = "fuchsia", target_os = "wasi")))] pub(crate) fn ttyname(dirfd: BorrowedFd<'_>, buf: &mut [MaybeUninit]) -> io::Result { unsafe { diff --git a/vendor/rustix/src/backend/libc/thread/futex.rs b/vendor/rustix/src/backend/libc/thread/futex.rs new file mode 100644 index 000000000..44d96f0f6 --- /dev/null +++ b/vendor/rustix/src/backend/libc/thread/futex.rs @@ -0,0 +1,43 @@ +use crate::backend::c; + +bitflags::bitflags! { + /// `FUTEX_*` flags for use with [`futex`]. + /// + /// [`futex`]: crate::thread::futex + #[repr(transparent)] + #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] + pub struct FutexFlags: u32 { + /// `FUTEX_PRIVATE_FLAG` + const PRIVATE = bitcast!(c::FUTEX_PRIVATE_FLAG); + /// `FUTEX_CLOCK_REALTIME` + const CLOCK_REALTIME = bitcast!(c::FUTEX_CLOCK_REALTIME); + } +} + +/// `FUTEX_*` operations for use with [`futex`]. +/// +/// [`futex`]: crate::thread::futex +#[derive(Debug, Copy, Clone, Eq, PartialEq)] +#[repr(u32)] +pub enum FutexOperation { + /// `FUTEX_WAIT` + Wait = bitcast!(c::FUTEX_WAIT), + /// `FUTEX_WAKE` + Wake = bitcast!(c::FUTEX_WAKE), + /// `FUTEX_FD` + Fd = bitcast!(c::FUTEX_FD), + /// `FUTEX_REQUEUE` + Requeue = bitcast!(c::FUTEX_REQUEUE), + /// `FUTEX_CMP_REQUEUE` + CmpRequeue = bitcast!(c::FUTEX_CMP_REQUEUE), + /// `FUTEX_WAKE_OP` + WakeOp = bitcast!(c::FUTEX_WAKE_OP), + /// `FUTEX_LOCK_PI` + LockPi = bitcast!(c::FUTEX_LOCK_PI), + /// `FUTEX_UNLOCK_PI` + UnlockPi = bitcast!(c::FUTEX_UNLOCK_PI), + /// `FUTEX_TRYLOCK_PI` + TrylockPi = bitcast!(c::FUTEX_TRYLOCK_PI), + /// `FUTEX_WAIT_BITSET` + WaitBitset = bitcast!(c::FUTEX_WAIT_BITSET), +} diff --git a/vendor/rustix/src/backend/libc/thread/mod.rs b/vendor/rustix/src/backend/libc/thread/mod.rs index 40e0d1135..4f8c87cd2 100644 --- a/vendor/rustix/src/backend/libc/thread/mod.rs +++ b/vendor/rustix/src/backend/libc/thread/mod.rs @@ -1,2 +1,4 @@ +#[cfg(linux_kernel)] +pub(crate) mod futex; #[cfg(not(windows))] pub(crate) mod syscalls; diff --git a/vendor/rustix/src/backend/libc/thread/syscalls.rs b/vendor/rustix/src/backend/libc/thread/syscalls.rs index 5260c39f4..846f0e2a8 100644 --- a/vendor/rustix/src/backend/libc/thread/syscalls.rs +++ b/vendor/rustix/src/backend/libc/thread/syscalls.rs @@ -10,9 +10,10 @@ use crate::timespec::LibcTimespec; use core::mem::MaybeUninit; #[cfg(linux_kernel)] use { - crate::backend::conv::{borrowed_fd, ret_c_int}, + crate::backend::conv::{borrowed_fd, ret_c_int, ret_usize}, crate::fd::BorrowedFd, crate::pid::Pid, + crate::thread::{FutexFlags, FutexOperation}, crate::utils::as_mut_ptr, }; #[cfg(not(any( @@ -279,7 +280,7 @@ pub(crate) fn gettid() -> Pid { #[cfg(linux_kernel)] #[inline] -pub(crate) fn setns(fd: BorrowedFd, nstype: c::c_int) -> io::Result { +pub(crate) fn setns(fd: BorrowedFd<'_>, nstype: c::c_int) -> io::Result { // `setns` wasn't supported in glibc until 2.14, and musl until 0.9.5, // so use `syscall`. weak_or_syscall! { @@ -390,3 +391,120 @@ pub(crate) fn setresgid_thread( unsafe { ret(setresgid(rgid.as_raw(), egid.as_raw(), sgid.as_raw())) } } + +// TODO: This could be de-multiplexed. +#[cfg(linux_kernel)] +pub(crate) unsafe fn futex( + uaddr: *mut u32, + op: FutexOperation, + flags: FutexFlags, + val: u32, + utime: *const Timespec, + uaddr2: *mut u32, + val3: u32, +) -> io::Result { + #[cfg(all( + target_pointer_width = "32", + not(any(target_arch = "aarch64", target_arch = "x86_64")) + ))] + { + // TODO: Upstream this to the libc crate. + #[allow(non_upper_case_globals)] + const SYS_futex_time64: i32 = linux_raw_sys::general::__NR_futex_time64 as i32; + + syscall! { + fn futex_time64( + uaddr: *mut u32, + futex_op: c::c_int, + val: u32, + timeout: *const Timespec, + uaddr2: *mut u32, + val3: u32 + ) via SYS_futex_time64 -> c::ssize_t + } + + ret_usize(futex_time64( + uaddr, + op as i32 | flags.bits() as i32, + val, + utime, + uaddr2, + val3, + )) + .or_else(|err| { + // See the comments in `rustix_clock_gettime_via_syscall` about + // emulation. + if err == io::Errno::NOSYS { + futex_old(uaddr, op, flags, val, utime, uaddr2, val3) + } else { + Err(err) + } + }) + } + + #[cfg(any( + target_pointer_width = "64", + target_arch = "aarch64", + target_arch = "x86_64" + ))] + { + syscall! { + fn futex( + uaddr: *mut u32, + futex_op: c::c_int, + val: u32, + timeout: *const linux_raw_sys::general::__kernel_timespec, + uaddr2: *mut u32, + val3: u32 + ) via SYS_futex -> c::c_long + } + + ret_usize(futex( + uaddr, + op as i32 | flags.bits() as i32, + val, + utime.cast(), + uaddr2, + val3, + ) as isize) + } +} + +#[cfg(linux_kernel)] +#[cfg(all( + target_pointer_width = "32", + not(any(target_arch = "aarch64", target_arch = "x86_64")) +))] +unsafe fn futex_old( + uaddr: *mut u32, + op: FutexOperation, + flags: FutexFlags, + val: u32, + utime: *const Timespec, + uaddr2: *mut u32, + val3: u32, +) -> io::Result { + syscall! { + fn futex( + uaddr: *mut u32, + futex_op: c::c_int, + val: u32, + timeout: *const linux_raw_sys::general::__kernel_old_timespec, + uaddr2: *mut u32, + val3: u32 + ) via SYS_futex -> c::c_long + } + + let old_utime = linux_raw_sys::general::__kernel_old_timespec { + tv_sec: (*utime).tv_sec.try_into().map_err(|_| io::Errno::INVAL)?, + tv_nsec: (*utime).tv_nsec.try_into().map_err(|_| io::Errno::INVAL)?, + }; + ret_usize(futex( + uaddr, + op as i32 | flags.bits() as i32, + val, + &old_utime, + uaddr2, + val3, + ) as isize) +} diff --git a/vendor/rustix/src/backend/libc/time/syscalls.rs b/vendor/rustix/src/backend/libc/time/syscalls.rs index 603a3b108..6b1c9fd03 100644 --- a/vendor/rustix/src/backend/libc/time/syscalls.rs +++ b/vendor/rustix/src/backend/libc/time/syscalls.rs @@ -109,7 +109,7 @@ pub(crate) fn clock_gettime(id: ClockId) -> Timespec { clock_gettime_old(id) } - // Use `unwrap()` here because `clock_getres` can fail if the clock itself + // Use `.unwrap()` here because `clock_getres` can fail if the clock itself // overflows a number of seconds, but if that happens, the monotonic clocks // can't maintain their invariants, or the realtime clocks aren't properly // configured. diff --git a/vendor/rustix/src/backend/libc/time/types.rs b/vendor/rustix/src/backend/libc/time/types.rs index 75cc61217..4d8c6bdab 100644 --- a/vendor/rustix/src/backend/libc/time/types.rs +++ b/vendor/rustix/src/backend/libc/time/types.rs @@ -25,11 +25,12 @@ pub type Itimerspec = c::itimerspec; /// [`timerfd_settime`]: crate::time::timerfd_settime #[cfg(any(linux_kernel, target_os = "fuchsia"))] #[cfg(fix_y2038)] -#[allow(missing_docs)] #[repr(C)] #[derive(Debug, Clone)] pub struct Itimerspec { + /// The interval of an interval timer. pub it_interval: Timespec, + /// Time remaining in the current interval. pub it_value: Timespec, } @@ -86,6 +87,9 @@ bitflags! { /// `TFD_CLOEXEC` const CLOEXEC = bitcast!(c::TFD_CLOEXEC); + + /// + const _ = !0; } } @@ -103,6 +107,9 @@ bitflags! { /// `TFD_TIMER_CANCEL_ON_SET` #[cfg(linux_kernel)] const CANCEL_ON_SET = bitcast!(c::TFD_TIMER_CANCEL_ON_SET); + + /// + const _ = !0; } } @@ -116,10 +123,10 @@ bitflags! { pub enum TimerfdClockId { /// `CLOCK_REALTIME`—A clock that tells the “real” time. /// - /// This is a clock that tells the amount of time elapsed since the - /// Unix epoch, 1970-01-01T00:00:00Z. The clock is externally settable, so - /// it is not monotonic. Successive reads may see decreasing times, so it - /// isn't reliable for measuring durations. + /// This is a clock that tells the amount of time elapsed since the Unix + /// epoch, 1970-01-01T00:00:00Z. The clock is externally settable, so it is + /// not monotonic. Successive reads may see decreasing times, so it isn't + /// reliable for measuring durations. Realtime = bitcast!(c::CLOCK_REALTIME), /// `CLOCK_MONOTONIC`—A clock that tells an abstract time. diff --git a/vendor/rustix/src/backend/linux_raw/arch/aarch64.rs b/vendor/rustix/src/backend/linux_raw/arch/aarch64.rs new file mode 100644 index 000000000..d4cf2472e --- /dev/null +++ b/vendor/rustix/src/backend/linux_raw/arch/aarch64.rs @@ -0,0 +1,268 @@ +//! aarch64 Linux system calls. + +use crate::backend::reg::{ + ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm, A0, A1, A2, A3, A4, A5, R0, +}; +use core::arch::asm; + +#[cfg(target_pointer_width = "32")] +compile_error!("arm64-ilp32 is not supported yet"); + +#[inline] +pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber<'_>) -> RetReg { + let r0; + asm!( + "svc 0", + in("x8") nr.to_asm(), + lateout("x0") r0, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> RetReg { + let r0; + asm!( + "svc 0", + in("x8") nr.to_asm(), + inlateout("x0") a0.to_asm() => r0, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, +) -> RetReg { + let r0; + asm!( + "svc 0", + in("x8") nr.to_asm(), + inlateout("x0") a0.to_asm() => r0, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1_noreturn(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> ! { + asm!( + "svc 0", + in("x8") nr.to_asm(), + in("x0") a0.to_asm(), + options(nostack, noreturn) + ) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall2( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, +) -> RetReg { + let r0; + asm!( + "svc 0", + in("x8") nr.to_asm(), + inlateout("x0") a0.to_asm() => r0, + in("x1") a1.to_asm(), + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall2_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, +) -> RetReg { + let r0; + asm!( + "svc 0", + in("x8") nr.to_asm(), + inlateout("x0") a0.to_asm() => r0, + in("x1") a1.to_asm(), + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall3( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, +) -> RetReg { + let r0; + asm!( + "svc 0", + in("x8") nr.to_asm(), + inlateout("x0") a0.to_asm() => r0, + in("x1") a1.to_asm(), + in("x2") a2.to_asm(), + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall3_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, +) -> RetReg { + let r0; + asm!( + "svc 0", + in("x8") nr.to_asm(), + inlateout("x0") a0.to_asm() => r0, + in("x1") a1.to_asm(), + in("x2") a2.to_asm(), + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall4( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, +) -> RetReg { + let r0; + asm!( + "svc 0", + in("x8") nr.to_asm(), + inlateout("x0") a0.to_asm() => r0, + in("x1") a1.to_asm(), + in("x2") a2.to_asm(), + in("x3") a3.to_asm(), + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall4_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, +) -> RetReg { + let r0; + asm!( + "svc 0", + in("x8") nr.to_asm(), + inlateout("x0") a0.to_asm() => r0, + in("x1") a1.to_asm(), + in("x2") a2.to_asm(), + in("x3") a3.to_asm(), + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall5( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, +) -> RetReg { + let r0; + asm!( + "svc 0", + in("x8") nr.to_asm(), + inlateout("x0") a0.to_asm() => r0, + in("x1") a1.to_asm(), + in("x2") a2.to_asm(), + in("x3") a3.to_asm(), + in("x4") a4.to_asm(), + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall5_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, +) -> RetReg { + let r0; + asm!( + "svc 0", + in("x8") nr.to_asm(), + inlateout("x0") a0.to_asm() => r0, + in("x1") a1.to_asm(), + in("x2") a2.to_asm(), + in("x3") a3.to_asm(), + in("x4") a4.to_asm(), + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall6( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, + a5: ArgReg<'_, A5>, +) -> RetReg { + let r0; + asm!( + "svc 0", + in("x8") nr.to_asm(), + inlateout("x0") a0.to_asm() => r0, + in("x1") a1.to_asm(), + in("x2") a2.to_asm(), + in("x3") a3.to_asm(), + in("x4") a4.to_asm(), + in("x5") a5.to_asm(), + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall6_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, + a5: ArgReg<'_, A5>, +) -> RetReg { + let r0; + asm!( + "svc 0", + in("x8") nr.to_asm(), + inlateout("x0") a0.to_asm() => r0, + in("x1") a1.to_asm(), + in("x2") a2.to_asm(), + in("x3") a3.to_asm(), + in("x4") a4.to_asm(), + in("x5") a5.to_asm(), + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} diff --git a/vendor/rustix/src/backend/linux_raw/arch/arm.rs b/vendor/rustix/src/backend/linux_raw/arch/arm.rs new file mode 100644 index 000000000..77c1f82f4 --- /dev/null +++ b/vendor/rustix/src/backend/linux_raw/arch/arm.rs @@ -0,0 +1,265 @@ +//! arm Linux system calls. + +use crate::backend::reg::{ + ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm, A0, A1, A2, A3, A4, A5, R0, +}; +use core::arch::asm; + +#[inline] +pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber<'_>) -> RetReg { + let r0; + asm!( + "svc 0", + in("r7") nr.to_asm(), + lateout("r0") r0, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> RetReg { + let r0; + asm!( + "svc 0", + in("r7") nr.to_asm(), + inlateout("r0") a0.to_asm() => r0, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, +) -> RetReg { + let r0; + asm!( + "svc 0", + in("r7") nr.to_asm(), + inlateout("r0") a0.to_asm() => r0, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1_noreturn(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> ! { + asm!( + "svc 0", + in("r7") nr.to_asm(), + in("r0") a0.to_asm(), + options(nostack, noreturn) + ) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall2( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, +) -> RetReg { + let r0; + asm!( + "svc 0", + in("r7") nr.to_asm(), + inlateout("r0") a0.to_asm() => r0, + in("r1") a1.to_asm(), + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall2_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, +) -> RetReg { + let r0; + asm!( + "svc 0", + in("r7") nr.to_asm(), + inlateout("r0") a0.to_asm() => r0, + in("r1") a1.to_asm(), + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall3( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, +) -> RetReg { + let r0; + asm!( + "svc 0", + in("r7") nr.to_asm(), + inlateout("r0") a0.to_asm() => r0, + in("r1") a1.to_asm(), + in("r2") a2.to_asm(), + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall3_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, +) -> RetReg { + let r0; + asm!( + "svc 0", + in("r7") nr.to_asm(), + inlateout("r0") a0.to_asm() => r0, + in("r1") a1.to_asm(), + in("r2") a2.to_asm(), + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall4( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, +) -> RetReg { + let r0; + asm!( + "svc 0", + in("r7") nr.to_asm(), + inlateout("r0") a0.to_asm() => r0, + in("r1") a1.to_asm(), + in("r2") a2.to_asm(), + in("r3") a3.to_asm(), + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall4_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, +) -> RetReg { + let r0; + asm!( + "svc 0", + in("r7") nr.to_asm(), + inlateout("r0") a0.to_asm() => r0, + in("r1") a1.to_asm(), + in("r2") a2.to_asm(), + in("r3") a3.to_asm(), + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall5( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, +) -> RetReg { + let r0; + asm!( + "svc 0", + in("r7") nr.to_asm(), + inlateout("r0") a0.to_asm() => r0, + in("r1") a1.to_asm(), + in("r2") a2.to_asm(), + in("r3") a3.to_asm(), + in("r4") a4.to_asm(), + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall5_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, +) -> RetReg { + let r0; + asm!( + "svc 0", + in("r7") nr.to_asm(), + inlateout("r0") a0.to_asm() => r0, + in("r1") a1.to_asm(), + in("r2") a2.to_asm(), + in("r3") a3.to_asm(), + in("r4") a4.to_asm(), + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall6( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, + a5: ArgReg<'_, A5>, +) -> RetReg { + let r0; + asm!( + "svc 0", + in("r7") nr.to_asm(), + inlateout("r0") a0.to_asm() => r0, + in("r1") a1.to_asm(), + in("r2") a2.to_asm(), + in("r3") a3.to_asm(), + in("r4") a4.to_asm(), + in("r5") a5.to_asm(), + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall6_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, + a5: ArgReg<'_, A5>, +) -> RetReg { + let r0; + asm!( + "svc 0", + in("r7") nr.to_asm(), + inlateout("r0") a0.to_asm() => r0, + in("r1") a1.to_asm(), + in("r2") a2.to_asm(), + in("r3") a3.to_asm(), + in("r4") a4.to_asm(), + in("r5") a5.to_asm(), + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} diff --git a/vendor/rustix/src/backend/linux_raw/arch/asm/aarch64.rs b/vendor/rustix/src/backend/linux_raw/arch/asm/aarch64.rs deleted file mode 100644 index 0f4465d51..000000000 --- a/vendor/rustix/src/backend/linux_raw/arch/asm/aarch64.rs +++ /dev/null @@ -1,268 +0,0 @@ -//! aarch64 Linux system calls. - -use crate::backend::reg::{ - ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm, A0, A1, A2, A3, A4, A5, R0, -}; -use core::arch::asm; - -#[cfg(target_pointer_width = "32")] -compile_error!("arm64-ilp32 is not supported yet"); - -#[inline] -pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber<'_>) -> RetReg { - let r0; - asm!( - "svc 0", - in("x8") nr.to_asm(), - lateout("x0") r0, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> RetReg { - let r0; - asm!( - "svc 0", - in("x8") nr.to_asm(), - inlateout("x0") a0.to_asm() => r0, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, -) -> RetReg { - let r0; - asm!( - "svc 0", - in("x8") nr.to_asm(), - inlateout("x0") a0.to_asm() => r0, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_noreturn(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> ! { - asm!( - "svc 0", - in("x8") nr.to_asm(), - in("x0") a0.to_asm(), - options(noreturn) - ) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg { - let r0; - asm!( - "svc 0", - in("x8") nr.to_asm(), - inlateout("x0") a0.to_asm() => r0, - in("x1") a1.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg { - let r0; - asm!( - "svc 0", - in("x8") nr.to_asm(), - inlateout("x0") a0.to_asm() => r0, - in("x1") a1.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg { - let r0; - asm!( - "svc 0", - in("x8") nr.to_asm(), - inlateout("x0") a0.to_asm() => r0, - in("x1") a1.to_asm(), - in("x2") a2.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg { - let r0; - asm!( - "svc 0", - in("x8") nr.to_asm(), - inlateout("x0") a0.to_asm() => r0, - in("x1") a1.to_asm(), - in("x2") a2.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg { - let r0; - asm!( - "svc 0", - in("x8") nr.to_asm(), - inlateout("x0") a0.to_asm() => r0, - in("x1") a1.to_asm(), - in("x2") a2.to_asm(), - in("x3") a3.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg { - let r0; - asm!( - "svc 0", - in("x8") nr.to_asm(), - inlateout("x0") a0.to_asm() => r0, - in("x1") a1.to_asm(), - in("x2") a2.to_asm(), - in("x3") a3.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg { - let r0; - asm!( - "svc 0", - in("x8") nr.to_asm(), - inlateout("x0") a0.to_asm() => r0, - in("x1") a1.to_asm(), - in("x2") a2.to_asm(), - in("x3") a3.to_asm(), - in("x4") a4.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg { - let r0; - asm!( - "svc 0", - in("x8") nr.to_asm(), - inlateout("x0") a0.to_asm() => r0, - in("x1") a1.to_asm(), - in("x2") a2.to_asm(), - in("x3") a3.to_asm(), - in("x4") a4.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg { - let r0; - asm!( - "svc 0", - in("x8") nr.to_asm(), - inlateout("x0") a0.to_asm() => r0, - in("x1") a1.to_asm(), - in("x2") a2.to_asm(), - in("x3") a3.to_asm(), - in("x4") a4.to_asm(), - in("x5") a5.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg { - let r0; - asm!( - "svc 0", - in("x8") nr.to_asm(), - inlateout("x0") a0.to_asm() => r0, - in("x1") a1.to_asm(), - in("x2") a2.to_asm(), - in("x3") a3.to_asm(), - in("x4") a4.to_asm(), - in("x5") a5.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} diff --git a/vendor/rustix/src/backend/linux_raw/arch/asm/arm.rs b/vendor/rustix/src/backend/linux_raw/arch/asm/arm.rs deleted file mode 100644 index 9695c6028..000000000 --- a/vendor/rustix/src/backend/linux_raw/arch/asm/arm.rs +++ /dev/null @@ -1,265 +0,0 @@ -//! arm Linux system calls. - -use crate::backend::reg::{ - ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm, A0, A1, A2, A3, A4, A5, R0, -}; -use core::arch::asm; - -#[inline] -pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber<'_>) -> RetReg { - let r0; - asm!( - "svc 0", - in("r7") nr.to_asm(), - lateout("r0") r0, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> RetReg { - let r0; - asm!( - "svc 0", - in("r7") nr.to_asm(), - inlateout("r0") a0.to_asm() => r0, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, -) -> RetReg { - let r0; - asm!( - "svc 0", - in("r7") nr.to_asm(), - inlateout("r0") a0.to_asm() => r0, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_noreturn(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> ! { - asm!( - "svc 0", - in("r7") nr.to_asm(), - in("r0") a0.to_asm(), - options(noreturn) - ) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg { - let r0; - asm!( - "svc 0", - in("r7") nr.to_asm(), - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg { - let r0; - asm!( - "svc 0", - in("r7") nr.to_asm(), - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg { - let r0; - asm!( - "svc 0", - in("r7") nr.to_asm(), - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - in("r2") a2.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg { - let r0; - asm!( - "svc 0", - in("r7") nr.to_asm(), - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - in("r2") a2.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg { - let r0; - asm!( - "svc 0", - in("r7") nr.to_asm(), - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - in("r2") a2.to_asm(), - in("r3") a3.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg { - let r0; - asm!( - "svc 0", - in("r7") nr.to_asm(), - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - in("r2") a2.to_asm(), - in("r3") a3.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg { - let r0; - asm!( - "svc 0", - in("r7") nr.to_asm(), - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - in("r2") a2.to_asm(), - in("r3") a3.to_asm(), - in("r4") a4.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg { - let r0; - asm!( - "svc 0", - in("r7") nr.to_asm(), - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - in("r2") a2.to_asm(), - in("r3") a3.to_asm(), - in("r4") a4.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg { - let r0; - asm!( - "svc 0", - in("r7") nr.to_asm(), - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - in("r2") a2.to_asm(), - in("r3") a3.to_asm(), - in("r4") a4.to_asm(), - in("r5") a5.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg { - let r0; - asm!( - "svc 0", - in("r7") nr.to_asm(), - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - in("r2") a2.to_asm(), - in("r3") a3.to_asm(), - in("r4") a4.to_asm(), - in("r5") a5.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} diff --git a/vendor/rustix/src/backend/linux_raw/arch/asm/mips.rs b/vendor/rustix/src/backend/linux_raw/arch/asm/mips.rs deleted file mode 100644 index b39a16847..000000000 --- a/vendor/rustix/src/backend/linux_raw/arch/asm/mips.rs +++ /dev/null @@ -1,543 +0,0 @@ -//! mipsel Linux system calls. -//! -//! On mipsel, Linux indicates success or failure using `$a3` rather -//! than by returning a negative error code as most other architectures do. -//! -//! Mips-family platforms have a special calling convention for `__NR_pipe`, -//! however we use `__NR_pipe2` instead to avoid having to implement it. - -use crate::backend::reg::{ - ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm, A0, A1, A2, A3, A4, A5, A6, R0, -}; -use core::arch::asm; - -#[inline] -pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - lateout("$7" /*$a3*/) err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_noreturn(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> ! { - asm!( - "syscall", - in("$2" /*$v0*/) nr.to_asm(), - in("$4" /*$a0*/) a0.to_asm(), - options(noreturn) - ) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg { - let x0; - let err: usize; - asm!( - ".set noat", - "subu $sp, 32", - "sw {}, 16($sp)", - "syscall", - "addu $sp, 32", - ".set at", - in(reg) a4.to_asm(), - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg { - let x0; - let err: usize; - asm!( - ".set noat", - "subu $sp, 32", - "sw {}, 16($sp)", - "syscall", - "addu $sp, 32", - ".set at", - in(reg) a4.to_asm(), - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg { - let x0; - let err: usize; - asm!( - ".set noat", - "subu $sp, 32", - "sw {}, 16($sp)", - "sw {}, 20($sp)", - "syscall", - "addu $sp, 32", - ".set at", - in(reg) a4.to_asm(), - in(reg) a5.to_asm(), - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg { - let x0; - let err: usize; - asm!( - ".set noat", - "subu $sp, 32", - "sw {}, 16($sp)", - "sw {}, 20($sp)", - "syscall", - "addu $sp, 32", - ".set at", - in(reg) a4.to_asm(), - in(reg) a5.to_asm(), - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall7_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, - a6: ArgReg<'_, A6>, -) -> RetReg { - let x0; - let err: usize; - asm!( - ".set noat", - "subu $sp, 32", - "sw {}, 16($sp)", - "sw {}, 20($sp)", - "sw {}, 24($sp)", - "syscall", - "addu $sp, 32", - ".set at", - in(reg) a4.to_asm(), - in(reg) a5.to_asm(), - in(reg) a6.to_asm(), - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} diff --git a/vendor/rustix/src/backend/linux_raw/arch/asm/mips32r6.rs b/vendor/rustix/src/backend/linux_raw/arch/asm/mips32r6.rs deleted file mode 100644 index 718e94fa7..000000000 --- a/vendor/rustix/src/backend/linux_raw/arch/asm/mips32r6.rs +++ /dev/null @@ -1,543 +0,0 @@ -//! mipsisa32r6el Linux system calls. -//! -//! On mipsisa32r6el, Linux indicates success or failure using `$a3` rather -//! than by returning a negative error code as most other architectures do. -//! -//! Mips-family platforms have a special calling convention for `__NR_pipe`, -//! however we use `__NR_pipe2` instead to avoid having to implement it. - -use crate::backend::reg::{ - ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm, A0, A1, A2, A3, A4, A5, A6, R0, -}; -use core::arch::asm; - -#[inline] -pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - lateout("$7" /*$a3*/) err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_noreturn(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> ! { - asm!( - "syscall", - in("$2" /*$v0*/) nr.to_asm(), - in("$4" /*$a0*/) a0.to_asm(), - options(noreturn) - ) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg { - let x0; - let err: usize; - asm!( - ".set noat", - "subu $sp, 32", - "sw {}, 16($sp)", - "syscall", - "addu $sp, 32", - ".set at", - in(reg) a4.to_asm(), - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg { - let x0; - let err: usize; - asm!( - ".set noat", - "subu $sp, 32", - "sw {}, 16($sp)", - "syscall", - "addu $sp, 32", - ".set at", - in(reg) a4.to_asm(), - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg { - let x0; - let err: usize; - asm!( - ".set noat", - "subu $sp, 32", - "sw {}, 16($sp)", - "sw {}, 20($sp)", - "syscall", - "addu $sp, 32", - ".set at", - in(reg) a4.to_asm(), - in(reg) a5.to_asm(), - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg { - let x0; - let err: usize; - asm!( - ".set noat", - "subu $sp, 32", - "sw {}, 16($sp)", - "sw {}, 20($sp)", - "syscall", - "addu $sp, 32", - ".set at", - in(reg) a4.to_asm(), - in(reg) a5.to_asm(), - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall7_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, - a6: ArgReg<'_, A6>, -) -> RetReg { - let x0; - let err: usize; - asm!( - ".set noat", - "subu $sp, 32", - "sw {}, 16($sp)", - "sw {}, 20($sp)", - "sw {}, 24($sp)", - "syscall", - "addu $sp, 32", - ".set at", - in(reg) a4.to_asm(), - in(reg) a5.to_asm(), - in(reg) a6.to_asm(), - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} diff --git a/vendor/rustix/src/backend/linux_raw/arch/asm/mips64.rs b/vendor/rustix/src/backend/linux_raw/arch/asm/mips64.rs deleted file mode 100644 index d3c7d341f..000000000 --- a/vendor/rustix/src/backend/linux_raw/arch/asm/mips64.rs +++ /dev/null @@ -1,466 +0,0 @@ -//! mips64el Linux system calls. -//! -//! On mips64el, Linux indicates success or failure using `$a3` (`$7`) rather -//! than by returning a negative error code as most other architectures do. -//! -//! Mips-family platforms have a special calling convention for `__NR_pipe`, -//! however we use `__NR_pipe2` instead to avoid having to implement it. - -use crate::backend::reg::{ - ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm, A0, A1, A2, A3, A4, A5, R0, -}; -use core::arch::asm; - -#[inline] -pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - lateout("$7" /*$a3*/) err, - lateout("$8" /*$a4*/) _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$a4*/) _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$a4*/) _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_noreturn(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> ! { - asm!( - "syscall", - in("$2" /*$v0*/) nr.to_asm(), - in("$4" /*$a0*/) a0.to_asm(), - options(noreturn) - ) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$a4*/) _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$a4*/) _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$a4*/) _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$a4*/) _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - lateout("$8" /*$a4*/) _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - lateout("$8" /*$a4*/) _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - inlateout("$8" /*$a4*/) a4.to_asm() => _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - inlateout("$8" /*$a4*/) a4.to_asm() => _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - inlateout("$8" /*$a4*/) a4.to_asm() => _, - inlateout("$9" /*$a5*/) a5.to_asm() => _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - inlateout("$8" /*$a4*/) a4.to_asm() => _, - inlateout("$9" /*$a5*/) a5.to_asm() => _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} diff --git a/vendor/rustix/src/backend/linux_raw/arch/asm/mips64r6.rs b/vendor/rustix/src/backend/linux_raw/arch/asm/mips64r6.rs deleted file mode 100644 index 0a2ebebce..000000000 --- a/vendor/rustix/src/backend/linux_raw/arch/asm/mips64r6.rs +++ /dev/null @@ -1,470 +0,0 @@ -//! mipsisa64r6el Linux system calls. -//! -//! On mipsisa64r6el, Linux indicates success or failure using `$a3` (`$7`) -//! rather than by returning a negative error code as most other architectures -//! do. -//! -//! Mips-family platforms have a special calling convention for `__NR_pipe`, -//! however we use `__NR_pipe2` instead to avoid having to implement it. -//! -//! Note that MIPS R6 inline assembly currently doesn't differ from MIPS, -//! because no explicit call of R6-only or R2-only instructions exist here. - -use crate::backend::reg::{ - ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm, A0, A1, A2, A3, A4, A5, R0, -}; -use core::arch::asm; - -#[inline] -pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - lateout("$7" /*$a3*/) err, - lateout("$8" /*$a4*/) _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$a4*/) _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$a4*/) _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_noreturn(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> ! { - asm!( - "syscall", - in("$2" /*$v0*/) nr.to_asm(), - in("$4" /*$a0*/) a0.to_asm(), - options(noreturn) - ) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$a4*/) _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$a4*/) _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$a4*/) _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$a4*/) _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - lateout("$8" /*$a4*/) _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - lateout("$8" /*$a4*/) _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - inlateout("$8" /*$a4*/) a4.to_asm() => _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - inlateout("$8" /*$a4*/) a4.to_asm() => _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - inlateout("$8" /*$a4*/) a4.to_asm() => _, - inlateout("$9" /*$a5*/) a5.to_asm() => _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - inlateout("$8" /*$a4*/) a4.to_asm() => _, - inlateout("$9" /*$a5*/) a5.to_asm() => _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} diff --git a/vendor/rustix/src/backend/linux_raw/arch/asm/mod.rs b/vendor/rustix/src/backend/linux_raw/arch/asm/mod.rs deleted file mode 100644 index 3ea8eb74d..000000000 --- a/vendor/rustix/src/backend/linux_raw/arch/asm/mod.rs +++ /dev/null @@ -1,24 +0,0 @@ -//! Inline asm for making system calls. -//! -//! Compilers should really have intrinsics for making system calls. They're -//! much like regular calls, with custom calling conventions, and calling -//! conventions are otherwise the compiler's job. But for now, use inline asm. -//! -//! The calling conventions for Linux syscalls are [documented here]. -//! -//! [documented here]: https://man7.org/linux/man-pages/man2/syscall.2.html - -#[cfg_attr(target_arch = "aarch64", path = "aarch64.rs")] -#[cfg_attr(all(target_arch = "arm", not(thumb_mode)), path = "arm.rs")] -#[cfg_attr(all(target_arch = "arm", thumb_mode), path = "thumb.rs")] -#[cfg_attr(target_arch = "mips", path = "mips.rs")] -#[cfg_attr(target_arch = "mips32r6", path = "mips32r6.rs")] -#[cfg_attr(target_arch = "mips64", path = "mips64.rs")] -#[cfg_attr(target_arch = "mips64r6", path = "mips64r6.rs")] -#[cfg_attr(target_arch = "powerpc64", path = "powerpc64.rs")] -#[cfg_attr(target_arch = "riscv64", path = "riscv64.rs")] -#[cfg_attr(target_arch = "x86", path = "x86.rs")] -#[cfg_attr(target_arch = "x86_64", path = "x86_64.rs")] -mod target_arch; - -pub(in crate::backend) use target_arch::*; diff --git a/vendor/rustix/src/backend/linux_raw/arch/asm/powerpc64.rs b/vendor/rustix/src/backend/linux_raw/arch/asm/powerpc64.rs deleted file mode 100644 index 8cca7dca7..000000000 --- a/vendor/rustix/src/backend/linux_raw/arch/asm/powerpc64.rs +++ /dev/null @@ -1,413 +0,0 @@ -//! powerpc64le Linux system calls. -//! -//! On powerpc64le, Linux indicates success or failure using `cr0.SO` rather -//! than by returning a negative error code as most other architectures do. In -//! theory we could immediately translate this into a `Result`, and it'd save a -//! few branches. And in theory we could have specialized sequences for use -//! with syscalls that are known to never fail. However, those would require -//! more extensive changes in rustix's platform-independent code. For now, we -//! check the flag and negate the error value to make PowerPC64 look like other -//! architectures. - -use crate::backend::reg::{ - ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm, A0, A1, A2, A3, A4, A5, R0, -}; -use core::arch::asm; - -#[inline] -pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber) -> RetReg { - let r0; - asm!( - "sc", - "bns 0f", - "neg 3, 3", - "0:", - inlateout("r0") nr.to_asm() => _, - lateout("r3") r0, - lateout("r4") _, - lateout("r5") _, - lateout("r6") _, - lateout("r7") _, - lateout("r8") _, - lateout("r9") _, - lateout("r10") _, - lateout("r11") _, - lateout("r12") _, - lateout("cr0") _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> RetReg { - let r0; - asm!( - "sc", - "bns 0f", - "neg 3, 3", - "0:", - inlateout("r0") nr.to_asm() => _, - inlateout("r3") a0.to_asm() => r0, - lateout("r4") _, - lateout("r5") _, - lateout("r6") _, - lateout("r7") _, - lateout("r8") _, - lateout("r9") _, - lateout("r10") _, - lateout("r11") _, - lateout("r12") _, - lateout("cr0") _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, -) -> RetReg { - let r0; - asm!( - "sc", - "bns 0f", - "neg 3, 3", - "0:", - inlateout("r0") nr.to_asm() => _, - inlateout("r3") a0.to_asm() => r0, - lateout("r4") _, - lateout("r5") _, - lateout("r6") _, - lateout("r7") _, - lateout("r8") _, - lateout("r9") _, - lateout("r10") _, - lateout("r11") _, - lateout("r12") _, - lateout("cr0") _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_noreturn(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> ! { - asm!( - "sc", - in("r0") nr.to_asm(), - in("r3") a0.to_asm(), - options(noreturn) - ) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg { - let r0; - asm!( - "sc", - "bns 0f", - "neg 3, 3", - "0:", - inlateout("r0") nr.to_asm() => _, - inlateout("r3") a0.to_asm() => r0, - inlateout("r4") a1.to_asm() => _, - lateout("r5") _, - lateout("r6") _, - lateout("r7") _, - lateout("r8") _, - lateout("r9") _, - lateout("r10") _, - lateout("r11") _, - lateout("r12") _, - lateout("cr0") _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg { - let r0; - asm!( - "sc", - "bns 0f", - "neg 3, 3", - "0:", - inlateout("r0") nr.to_asm() => _, - inlateout("r3") a0.to_asm() => r0, - inlateout("r4") a1.to_asm() => _, - lateout("r5") _, - lateout("r6") _, - lateout("r7") _, - lateout("r8") _, - lateout("r9") _, - lateout("r10") _, - lateout("r11") _, - lateout("r12") _, - lateout("cr0") _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg { - let r0; - asm!( - "sc", - "bns 0f", - "neg 3, 3", - "0:", - inlateout("r0") nr.to_asm() => _, - inlateout("r3") a0.to_asm() => r0, - inlateout("r4") a1.to_asm() => _, - inlateout("r5") a2.to_asm() => _, - lateout("r6") _, - lateout("r7") _, - lateout("r8") _, - lateout("r9") _, - lateout("r10") _, - lateout("r11") _, - lateout("r12") _, - lateout("cr0") _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg { - let r0; - asm!( - "sc", - "bns 0f", - "neg 3, 3", - "0:", - inlateout("r0") nr.to_asm() => _, - inlateout("r3") a0.to_asm() => r0, - inlateout("r4") a1.to_asm() => _, - inlateout("r5") a2.to_asm() => _, - lateout("r6") _, - lateout("r7") _, - lateout("r8") _, - lateout("r9") _, - lateout("r10") _, - lateout("r11") _, - lateout("r12") _, - lateout("cr0") _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg { - let r0; - asm!( - "sc", - "bns 0f", - "neg 3, 3", - "0:", - inlateout("r0") nr.to_asm() => _, - inlateout("r3") a0.to_asm() => r0, - inlateout("r4") a1.to_asm() => _, - inlateout("r5") a2.to_asm() => _, - inlateout("r6") a3.to_asm() => _, - lateout("r7") _, - lateout("r8") _, - lateout("r9") _, - lateout("r10") _, - lateout("r11") _, - lateout("r12") _, - lateout("cr0") _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg { - let r0; - asm!( - "sc", - "bns 0f", - "neg 3, 3", - "0:", - inlateout("r0") nr.to_asm() => _, - inlateout("r3") a0.to_asm() => r0, - inlateout("r4") a1.to_asm() => _, - inlateout("r5") a2.to_asm() => _, - inlateout("r6") a3.to_asm() => _, - lateout("r7") _, - lateout("r8") _, - lateout("r9") _, - lateout("r10") _, - lateout("r11") _, - lateout("r12") _, - lateout("cr0") _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg { - let r0; - asm!( - "sc", - "bns 0f", - "neg 3, 3", - "0:", - inlateout("r0") nr.to_asm() => _, - inlateout("r3") a0.to_asm() => r0, - inlateout("r4") a1.to_asm() => _, - inlateout("r5") a2.to_asm() => _, - inlateout("r6") a3.to_asm() => _, - inlateout("r7") a4.to_asm() => _, - lateout("r8") _, - lateout("r9") _, - lateout("r10") _, - lateout("r11") _, - lateout("r12") _, - lateout("cr0") _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg { - let r0; - asm!( - "sc", - "bns 0f", - "neg 3, 3", - "0:", - inlateout("r0") nr.to_asm() => _, - inlateout("r3") a0.to_asm() => r0, - inlateout("r4") a1.to_asm() => _, - inlateout("r5") a2.to_asm() => _, - inlateout("r6") a3.to_asm() => _, - inlateout("r7") a4.to_asm() => _, - lateout("r8") _, - lateout("r9") _, - lateout("r10") _, - lateout("r11") _, - lateout("r12") _, - lateout("cr0") _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg { - let r0; - asm!( - "sc", - "bns 0f", - "neg 3, 3", - "0:", - inlateout("r0") nr.to_asm() => _, - inlateout("r3") a0.to_asm() => r0, - inlateout("r4") a1.to_asm() => _, - inlateout("r5") a2.to_asm() => _, - inlateout("r6") a3.to_asm() => _, - inlateout("r7") a4.to_asm() => _, - inlateout("r8") a5.to_asm() => _, - lateout("r9") _, - lateout("r10") _, - lateout("r11") _, - lateout("r12") _, - lateout("cr0") _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg { - let r0; - asm!( - "sc", - "bns 0f", - "neg 3, 3", - "0:", - inlateout("r0") nr.to_asm() => _, - inlateout("r3") a0.to_asm() => r0, - inlateout("r4") a1.to_asm() => _, - inlateout("r5") a2.to_asm() => _, - inlateout("r6") a3.to_asm() => _, - inlateout("r7") a4.to_asm() => _, - inlateout("r8") a5.to_asm() => _, - lateout("r9") _, - lateout("r10") _, - lateout("r11") _, - lateout("r12") _, - lateout("cr0") _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} diff --git a/vendor/rustix/src/backend/linux_raw/arch/asm/riscv64.rs b/vendor/rustix/src/backend/linux_raw/arch/asm/riscv64.rs deleted file mode 100644 index b1e306266..000000000 --- a/vendor/rustix/src/backend/linux_raw/arch/asm/riscv64.rs +++ /dev/null @@ -1,265 +0,0 @@ -//! riscv64 Linux system calls. - -use crate::backend::reg::{ - ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm, A0, A1, A2, A3, A4, A5, R0, -}; -use core::arch::asm; - -#[inline] -pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber<'_>) -> RetReg { - let r0; - asm!( - "ecall", - in("a7") nr.to_asm(), - lateout("a0") r0, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> RetReg { - let r0; - asm!( - "ecall", - in("a7") nr.to_asm(), - inlateout("a0") a0.to_asm() => r0, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, -) -> RetReg { - let r0; - asm!( - "ecall", - in("a7") nr.to_asm(), - inlateout("a0") a0.to_asm() => r0, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_noreturn(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> ! { - asm!( - "ecall", - in("a7") nr.to_asm(), - in("a0") a0.to_asm(), - options(noreturn) - ); -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg { - let r0; - asm!( - "ecall", - in("a7") nr.to_asm(), - inlateout("a0") a0.to_asm() => r0, - in("a1") a1.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg { - let r0; - asm!( - "ecall", - in("a7") nr.to_asm(), - inlateout("a0") a0.to_asm() => r0, - in("a1") a1.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg { - let r0; - asm!( - "ecall", - in("a7") nr.to_asm(), - inlateout("a0") a0.to_asm() => r0, - in("a1") a1.to_asm(), - in("a2") a2.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg { - let r0; - asm!( - "ecall", - in("a7") nr.to_asm(), - inlateout("a0") a0.to_asm() => r0, - in("a1") a1.to_asm(), - in("a2") a2.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg { - let r0; - asm!( - "ecall", - in("a7") nr.to_asm(), - inlateout("a0") a0.to_asm() => r0, - in("a1") a1.to_asm(), - in("a2") a2.to_asm(), - in("a3") a3.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg { - let r0; - asm!( - "ecall", - in("a7") nr.to_asm(), - inlateout("a0") a0.to_asm() => r0, - in("a1") a1.to_asm(), - in("a2") a2.to_asm(), - in("a3") a3.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg { - let r0; - asm!( - "ecall", - in("a7") nr.to_asm(), - inlateout("a0") a0.to_asm() => r0, - in("a1") a1.to_asm(), - in("a2") a2.to_asm(), - in("a3") a3.to_asm(), - in("a4") a4.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg { - let r0; - asm!( - "ecall", - in("a7") nr.to_asm(), - inlateout("a0") a0.to_asm() => r0, - in("a1") a1.to_asm(), - in("a2") a2.to_asm(), - in("a3") a3.to_asm(), - in("a4") a4.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg { - let r0; - asm!( - "ecall", - in("a7") nr.to_asm(), - inlateout("a0") a0.to_asm() => r0, - in("a1") a1.to_asm(), - in("a2") a2.to_asm(), - in("a3") a3.to_asm(), - in("a4") a4.to_asm(), - in("a5") a5.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg { - let r0; - asm!( - "ecall", - in("a7") nr.to_asm(), - inlateout("a0") a0.to_asm() => r0, - in("a1") a1.to_asm(), - in("a2") a2.to_asm(), - in("a3") a3.to_asm(), - in("a4") a4.to_asm(), - in("a5") a5.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} diff --git a/vendor/rustix/src/backend/linux_raw/arch/asm/thumb.rs b/vendor/rustix/src/backend/linux_raw/arch/asm/thumb.rs deleted file mode 100644 index 398a73dfe..000000000 --- a/vendor/rustix/src/backend/linux_raw/arch/asm/thumb.rs +++ /dev/null @@ -1,322 +0,0 @@ -//! arm Linux system calls, using thumb-mode. -//! -//! In thumb-mode, r7 is the frame pointer and is not permitted to be used in -//! an inline asm operand, so we have to use a different register and copy it -//! into r7 inside the inline asm. - -use crate::backend::reg::{ - ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm, A0, A1, A2, A3, A4, A5, R0, -}; -use core::arch::asm; - -#[inline] -pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber<'_>) -> RetReg { - let r0; - asm!( - "mov {tmp}, r7", - "mov r7, {nr}", - "svc 0", - "mov r7, {tmp}", - nr = in(reg) nr.to_asm(), - tmp = out(reg) _, - lateout("r0") r0, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> RetReg { - let r0; - asm!( - "mov {tmp}, r7", - "mov r7, {nr}", - "svc 0", - "mov r7, {tmp}", - nr = in(reg) nr.to_asm(), - tmp = out(reg) _, - inlateout("r0") a0.to_asm() => r0, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, -) -> RetReg { - let r0; - asm!( - "mov {tmp}, r7", - "mov r7, {nr}", - "svc 0", - "mov r7, {tmp}", - nr = in(reg) nr.to_asm(), - tmp = out(reg) _, - inlateout("r0") a0.to_asm() => r0, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_noreturn(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> ! { - asm!( - "mov r7, {nr}", - "svc 0", - nr = in(reg) nr.to_asm(), - in("r0") a0.to_asm(), - options(noreturn) - ) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg { - let r0; - asm!( - "mov {tmp}, r7", - "mov r7, {nr}", - "svc 0", - "mov r7, {tmp}", - nr = in(reg) nr.to_asm(), - tmp = out(reg) _, - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg { - let r0; - asm!( - "mov {tmp}, r7", - "mov r7, {nr}", - "svc 0", - "mov r7, {tmp}", - nr = in(reg) nr.to_asm(), - tmp = out(reg) _, - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg { - let r0; - asm!( - "mov {tmp}, r7", - "mov r7, {nr}", - "svc 0", - "mov r7, {tmp}", - nr = in(reg) nr.to_asm(), - tmp = out(reg) _, - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - in("r2") a2.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg { - let r0; - asm!( - "mov {tmp}, r7", - "mov r7, {nr}", - "svc 0", - "mov r7, {tmp}", - nr = in(reg) nr.to_asm(), - tmp = out(reg) _, - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - in("r2") a2.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg { - let r0; - asm!( - "mov {tmp}, r7", - "mov r7, {nr}", - "svc 0", - "mov r7, {tmp}", - nr = in(reg) nr.to_asm(), - tmp = out(reg) _, - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - in("r2") a2.to_asm(), - in("r3") a3.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg { - let r0; - asm!( - "mov {tmp}, r7", - "mov r7, {nr}", - "svc 0", - "mov r7, {tmp}", - nr = in(reg) nr.to_asm(), - tmp = out(reg) _, - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - in("r2") a2.to_asm(), - in("r3") a3.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg { - let r0; - asm!( - "mov {tmp}, r7", - "mov r7, {nr}", - "svc 0", - "mov r7, {tmp}", - nr = in(reg) nr.to_asm(), - tmp = out(reg) _, - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - in("r2") a2.to_asm(), - in("r3") a3.to_asm(), - in("r4") a4.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg { - let r0; - asm!( - "mov {tmp}, r7", - "mov r7, {nr}", - "svc 0", - "mov r7, {tmp}", - nr = in(reg) nr.to_asm(), - tmp = out(reg) _, - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - in("r2") a2.to_asm(), - in("r3") a3.to_asm(), - in("r4") a4.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg { - let r0; - asm!( - "mov {tmp}, r7", - "mov r7, {nr}", - "svc 0", - "mov r7, {tmp}", - nr = in(reg) nr.to_asm(), - tmp = out(reg) _, - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - in("r2") a2.to_asm(), - in("r3") a3.to_asm(), - in("r4") a4.to_asm(), - in("r5") a5.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg { - let r0; - asm!( - "mov {tmp}, r7", - "mov r7, {nr}", - "svc 0", - "mov r7, {tmp}", - nr = in(reg) nr.to_asm(), - tmp = out(reg) _, - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - in("r2") a2.to_asm(), - in("r3") a3.to_asm(), - in("r4") a4.to_asm(), - in("r5") a5.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} diff --git a/vendor/rustix/src/backend/linux_raw/arch/asm/x86.rs b/vendor/rustix/src/backend/linux_raw/arch/asm/x86.rs deleted file mode 100644 index ddef4a854..000000000 --- a/vendor/rustix/src/backend/linux_raw/arch/asm/x86.rs +++ /dev/null @@ -1,490 +0,0 @@ -//! 32-bit x86 Linux system calls. -//! -//! There are two forms; `indirect_*` which take a callee, which allow calling -//! through the vDSO when possible, and plain forms, which use the `int 0x80` -//! instruction. -//! -//! Most `rustix` syscalls use the vsyscall mechanism rather than going using -//! `int 0x80` sequences, as vsyscall is much faster. -//! -//! Syscalls made with `int 0x80` preserve the flags register, while syscalls -//! made using vsyscall do not. - -#![allow(dead_code)] - -use crate::backend::reg::{ - ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm, A0, A1, A2, A3, A4, A5, R0, -}; -use crate::backend::vdso_wrappers::SyscallType; -use core::arch::asm; - -#[inline] -pub(in crate::backend) unsafe fn indirect_syscall0( - callee: SyscallType, - nr: SyscallNumber<'_>, -) -> RetReg { - let r0; - asm!( - "call {callee}", - callee = in(reg) callee, - inlateout("eax") nr.to_asm() => r0, - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn indirect_syscall1( - callee: SyscallType, - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, -) -> RetReg { - let r0; - asm!( - "call {callee}", - callee = in(reg) callee, - inlateout("eax") nr.to_asm() => r0, - in("ebx") a0.to_asm(), - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn indirect_syscall1_noreturn( - callee: SyscallType, - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, -) -> ! { - asm!( - "call {callee}", - callee = in(reg) callee, - in("eax") nr.to_asm(), - in("ebx") a0.to_asm(), - options(noreturn) - ) -} - -#[inline] -pub(in crate::backend) unsafe fn indirect_syscall2( - callee: SyscallType, - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg { - let r0; - asm!( - "call {callee}", - callee = in(reg) callee, - inlateout("eax") nr.to_asm() => r0, - in("ebx") a0.to_asm(), - in("ecx") a1.to_asm(), - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn indirect_syscall3( - callee: SyscallType, - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg { - let r0; - asm!( - "call {callee}", - callee = in(reg) callee, - inlateout("eax") nr.to_asm() => r0, - in("ebx") a0.to_asm(), - in("ecx") a1.to_asm(), - in("edx") a2.to_asm(), - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn indirect_syscall4( - callee: SyscallType, - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg { - let r0; - // a3 should go in esi, but `asm!` won't let us use it as an operand. - // Temporarily swap it into place, and then swap it back afterward. - // - // We hard-code the callee operand to use edi instead of `in(reg)` because - // even though we can't name esi as an operand, the compiler can use esi to - // satisfy `in(reg)`. - asm!( - "xchg esi, {a3}", - "call edi", - "xchg esi, {a3}", - a3 = in(reg) a3.to_asm(), - in("edi") callee, - inlateout("eax") nr.to_asm() => r0, - in("ebx") a0.to_asm(), - in("ecx") a1.to_asm(), - in("edx") a2.to_asm(), - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn indirect_syscall5( - callee: SyscallType, - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg { - let r0; - // Oof. a3 should go in esi, and `asm!` won't let us use that register as - // an operand. And we can't request stack slots. And there are no other - // registers free. Use eax as a temporary pointer to a slice, since it - // gets clobbered as the return value anyway. - asm!( - "push esi", - "push DWORD PTR [eax + 0]", - "mov esi, DWORD PTR [eax + 4]", - "mov eax, DWORD PTR [eax + 8]", - "call DWORD PTR [esp]", - "pop esi", - "pop esi", - inout("eax") &[callee as _, a3.to_asm(), nr.to_asm()] => r0, - in("ebx") a0.to_asm(), - in("ecx") a1.to_asm(), - in("edx") a2.to_asm(), - in("edi") a4.to_asm(), - ); - FromAsm::from_asm(r0) -} - -#[allow(clippy::too_many_arguments)] -#[inline] -pub(in crate::backend) unsafe fn indirect_syscall6( - callee: SyscallType, - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg { - let r0; - // Oof again. a3 should go in esi, and a5 should go in ebp, and `asm!` - // won't let us use either of those registers as operands. And we can't - // request stack slots. And there are no other registers free. Use eax as a - // temporary pointer to a slice, since it gets clobbered as the return - // value anyway. - // - // This is another reason that syscalls should be compiler intrinsics - // rather than inline asm. - asm!( - "push ebp", - "push esi", - "push DWORD PTR [eax + 0]", - "mov esi, DWORD PTR [eax + 4]", - "mov ebp, DWORD PTR [eax + 8]", - "mov eax, DWORD PTR [eax + 12]", - "call DWORD PTR [esp]", - "pop esi", - "pop esi", - "pop ebp", - inout("eax") &[callee as _, a3.to_asm(), a5.to_asm(), nr.to_asm()] => r0, - in("ebx") a0.to_asm(), - in("ecx") a1.to_asm(), - in("edx") a2.to_asm(), - in("edi") a4.to_asm(), - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber<'_>) -> RetReg { - let r0; - asm!( - "int $$0x80", - inlateout("eax") nr.to_asm() => r0, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> RetReg { - let r0; - asm!( - "int $$0x80", - inlateout("eax") nr.to_asm() => r0, - in("ebx") a0.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, -) -> RetReg { - let r0; - asm!( - "int $$0x80", - inlateout("eax") nr.to_asm() => r0, - in("ebx") a0.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_noreturn(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> ! { - asm!( - "int $$0x80", - in("eax") nr.to_asm(), - in("ebx") a0.to_asm(), - options(noreturn) - ) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg { - let r0; - asm!( - "int $$0x80", - inlateout("eax") nr.to_asm() => r0, - in("ebx") a0.to_asm(), - in("ecx") a1.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg { - let r0; - asm!( - "int $$0x80", - inlateout("eax") nr.to_asm() => r0, - in("ebx") a0.to_asm(), - in("ecx") a1.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg { - let r0; - asm!( - "int $$0x80", - inlateout("eax") nr.to_asm() => r0, - in("ebx") a0.to_asm(), - in("ecx") a1.to_asm(), - in("edx") a2.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg { - let r0; - asm!( - "int $$0x80", - inlateout("eax") nr.to_asm() => r0, - in("ebx") a0.to_asm(), - in("ecx") a1.to_asm(), - in("edx") a2.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg { - let r0; - // a3 should go in esi, but `asm!` won't let us use it as an operand. - // Temporarily swap it into place, and then swap it back afterward. - asm!( - "xchg esi, {a3}", - "int $$0x80", - "xchg esi, {a3}", - a3 = in(reg) a3.to_asm(), - inlateout("eax") nr.to_asm() => r0, - in("ebx") a0.to_asm(), - in("ecx") a1.to_asm(), - in("edx") a2.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg { - let r0; - asm!( - "xchg esi, {a3}", - "int $$0x80", - "xchg esi, {a3}", - a3 = in(reg) a3.to_asm(), - inlateout("eax") nr.to_asm() => r0, - in("ebx") a0.to_asm(), - in("ecx") a1.to_asm(), - in("edx") a2.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg { - let r0; - // As in `syscall4`, use xchg to handle a3. a4 should go in edi, and we can - // use that register as an operand. Unlike in `indirect_syscall5`, we don't - // have a `callee` operand taking up a register, so we have enough - // registers and don't need to use a slice. - asm!( - "xchg esi, {a3}", - "int $$0x80", - "xchg esi, {a3}", - a3 = in(reg) a3.to_asm(), - inlateout("eax") nr.to_asm() => r0, - in("ebx") a0.to_asm(), - in("ecx") a1.to_asm(), - in("edx") a2.to_asm(), - in("edi") a4.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg { - let r0; - // See the comments in `syscall5`. - asm!( - "xchg esi, {a3}", - "int $$0x80", - "xchg esi, {a3}", - a3 = in(reg) a3.to_asm(), - inlateout("eax") nr.to_asm() => r0, - in("ebx") a0.to_asm(), - in("ecx") a1.to_asm(), - in("edx") a2.to_asm(), - in("edi") a4.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg { - let r0; - // See the comments in `indirect_syscall6`. - asm!( - "push ebp", - "push esi", - "mov esi, DWORD PTR [eax + 0]", - "mov ebp, DWORD PTR [eax + 4]", - "mov eax, DWORD PTR [eax + 8]", - "int $$0x80", - "pop esi", - "pop ebp", - inout("eax") &[a3.to_asm(), a5.to_asm(), nr.to_asm()] => r0, - in("ebx") a0.to_asm(), - in("ecx") a1.to_asm(), - in("edx") a2.to_asm(), - in("edi") a4.to_asm(), - options(preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg { - let r0; - // See the comments in `indirect_syscall6`. - asm!( - "push ebp", - "push esi", - "mov esi, DWORD PTR [eax + 0]", - "mov ebp, DWORD PTR [eax + 4]", - "mov eax, DWORD PTR [eax + 8]", - "int $$0x80", - "pop esi", - "pop ebp", - inout("eax") &[a3.to_asm(), a5.to_asm(), nr.to_asm()] => r0, - in("ebx") a0.to_asm(), - in("ecx") a1.to_asm(), - in("edx") a2.to_asm(), - in("edi") a4.to_asm(), - options(preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} diff --git a/vendor/rustix/src/backend/linux_raw/arch/asm/x86_64.rs b/vendor/rustix/src/backend/linux_raw/arch/asm/x86_64.rs deleted file mode 100644 index 084f5fee4..000000000 --- a/vendor/rustix/src/backend/linux_raw/arch/asm/x86_64.rs +++ /dev/null @@ -1,293 +0,0 @@ -//! x86-64 Linux system calls. - -use crate::backend::reg::{ - ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm, A0, A1, A2, A3, A4, A5, R0, -}; -use core::arch::asm; - -#[cfg(target_pointer_width = "32")] -compile_error!("x32 is not yet supported"); - -#[inline] -pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber<'_>) -> RetReg { - let r0; - asm!( - "syscall", - inlateout("rax") nr.to_asm() => r0, - lateout("rcx") _, - lateout("r11") _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> RetReg { - let r0; - asm!( - "syscall", - inlateout("rax") nr.to_asm() => r0, - in("rdi") a0.to_asm(), - lateout("rcx") _, - lateout("r11") _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, -) -> RetReg { - let r0; - asm!( - "syscall", - inlateout("rax") nr.to_asm() => r0, - in("rdi") a0.to_asm(), - lateout("rcx") _, - lateout("r11") _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_noreturn(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> ! { - asm!( - "syscall", - in("rax") nr.to_asm(), - in("rdi") a0.to_asm(), - options(noreturn) - ) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg { - let r0; - asm!( - "syscall", - inlateout("rax") nr.to_asm() => r0, - in("rdi") a0.to_asm(), - in("rsi") a1.to_asm(), - lateout("rcx") _, - lateout("r11") _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg { - let r0; - asm!( - "syscall", - inlateout("rax") nr.to_asm() => r0, - in("rdi") a0.to_asm(), - in("rsi") a1.to_asm(), - lateout("rcx") _, - lateout("r11") _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg { - let r0; - asm!( - "syscall", - inlateout("rax") nr.to_asm() => r0, - in("rdi") a0.to_asm(), - in("rsi") a1.to_asm(), - in("rdx") a2.to_asm(), - lateout("rcx") _, - lateout("r11") _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg { - let r0; - asm!( - "syscall", - inlateout("rax") nr.to_asm() => r0, - in("rdi") a0.to_asm(), - in("rsi") a1.to_asm(), - in("rdx") a2.to_asm(), - lateout("rcx") _, - lateout("r11") _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg { - let r0; - asm!( - "syscall", - inlateout("rax") nr.to_asm() => r0, - in("rdi") a0.to_asm(), - in("rsi") a1.to_asm(), - in("rdx") a2.to_asm(), - in("r10") a3.to_asm(), - lateout("rcx") _, - lateout("r11") _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg { - let r0; - asm!( - "syscall", - inlateout("rax") nr.to_asm() => r0, - in("rdi") a0.to_asm(), - in("rsi") a1.to_asm(), - in("rdx") a2.to_asm(), - in("r10") a3.to_asm(), - lateout("rcx") _, - lateout("r11") _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg { - let r0; - asm!( - "syscall", - inlateout("rax") nr.to_asm() => r0, - in("rdi") a0.to_asm(), - in("rsi") a1.to_asm(), - in("rdx") a2.to_asm(), - in("r10") a3.to_asm(), - in("r8") a4.to_asm(), - lateout("rcx") _, - lateout("r11") _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg { - let r0; - asm!( - "syscall", - inlateout("rax") nr.to_asm() => r0, - in("rdi") a0.to_asm(), - in("rsi") a1.to_asm(), - in("rdx") a2.to_asm(), - in("r10") a3.to_asm(), - in("r8") a4.to_asm(), - lateout("rcx") _, - lateout("r11") _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg { - let r0; - asm!( - "syscall", - inlateout("rax") nr.to_asm() => r0, - in("rdi") a0.to_asm(), - in("rsi") a1.to_asm(), - in("rdx") a2.to_asm(), - in("r10") a3.to_asm(), - in("r8") a4.to_asm(), - in("r9") a5.to_asm(), - lateout("rcx") _, - lateout("r11") _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg { - let r0; - asm!( - "syscall", - inlateout("rax") nr.to_asm() => r0, - in("rdi") a0.to_asm(), - in("rsi") a1.to_asm(), - in("rdx") a2.to_asm(), - in("r10") a3.to_asm(), - in("r8") a4.to_asm(), - in("r9") a5.to_asm(), - lateout("rcx") _, - lateout("r11") _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} diff --git a/vendor/rustix/src/backend/linux_raw/arch/mips.rs b/vendor/rustix/src/backend/linux_raw/arch/mips.rs new file mode 100644 index 000000000..37932e02b --- /dev/null +++ b/vendor/rustix/src/backend/linux_raw/arch/mips.rs @@ -0,0 +1,543 @@ +//! mipsel Linux system calls. +//! +//! On mipsel, Linux indicates success or failure using `$a3` rather +//! than by returning a negative error code as most other architectures do. +//! +//! Mips-family platforms have a special calling convention for `__NR_pipe`, +//! however we use `__NR_pipe2` instead to avoid having to implement it. + +use crate::backend::reg::{ + ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm, A0, A1, A2, A3, A4, A5, A6, R0, +}; +use core::arch::asm; + +#[inline] +pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + lateout("$7" /*$a3*/) err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + lateout("$7" /*$a3*/) err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + lateout("$7" /*$a3*/) err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1_noreturn(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> ! { + asm!( + "syscall", + in("$2" /*$v0*/) nr.to_asm(), + in("$4" /*$a0*/) a0.to_asm(), + options(nostack, noreturn) + ) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall2( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + lateout("$7" /*$a3*/) err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall2_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + lateout("$7" /*$a3*/) err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall3( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + lateout("$7" /*$a3*/) err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall3_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + lateout("$7" /*$a3*/) err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall4( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + inlateout("$7" /*$a3*/) a3.to_asm() => err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall4_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + inlateout("$7" /*$a3*/) a3.to_asm() => err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall5( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, +) -> RetReg { + let x0; + let err: usize; + asm!( + ".set noat", + "subu $sp, 32", + "sw {}, 16($sp)", + "syscall", + "addu $sp, 32", + ".set at", + in(reg) a4.to_asm(), + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + inlateout("$7" /*$a3*/) a3.to_asm() => err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(preserves_flags) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall5_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, +) -> RetReg { + let x0; + let err: usize; + asm!( + ".set noat", + "subu $sp, 32", + "sw {}, 16($sp)", + "syscall", + "addu $sp, 32", + ".set at", + in(reg) a4.to_asm(), + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + inlateout("$7" /*$a3*/) a3.to_asm() => err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall6( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, + a5: ArgReg<'_, A5>, +) -> RetReg { + let x0; + let err: usize; + asm!( + ".set noat", + "subu $sp, 32", + "sw {}, 16($sp)", + "sw {}, 20($sp)", + "syscall", + "addu $sp, 32", + ".set at", + in(reg) a4.to_asm(), + in(reg) a5.to_asm(), + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + inlateout("$7" /*$a3*/) a3.to_asm() => err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(preserves_flags) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall6_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, + a5: ArgReg<'_, A5>, +) -> RetReg { + let x0; + let err: usize; + asm!( + ".set noat", + "subu $sp, 32", + "sw {}, 16($sp)", + "sw {}, 20($sp)", + "syscall", + "addu $sp, 32", + ".set at", + in(reg) a4.to_asm(), + in(reg) a5.to_asm(), + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + inlateout("$7" /*$a3*/) a3.to_asm() => err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall7_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, + a5: ArgReg<'_, A5>, + a6: ArgReg<'_, A6>, +) -> RetReg { + let x0; + let err: usize; + asm!( + ".set noat", + "subu $sp, 32", + "sw {}, 16($sp)", + "sw {}, 20($sp)", + "sw {}, 24($sp)", + "syscall", + "addu $sp, 32", + ".set at", + in(reg) a4.to_asm(), + in(reg) a5.to_asm(), + in(reg) a6.to_asm(), + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + inlateout("$7" /*$a3*/) a3.to_asm() => err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} diff --git a/vendor/rustix/src/backend/linux_raw/arch/mips32r6.rs b/vendor/rustix/src/backend/linux_raw/arch/mips32r6.rs new file mode 100644 index 000000000..c2d92447b --- /dev/null +++ b/vendor/rustix/src/backend/linux_raw/arch/mips32r6.rs @@ -0,0 +1,543 @@ +//! mipsisa32r6el Linux system calls. +//! +//! On mipsisa32r6el, Linux indicates success or failure using `$a3` rather +//! than by returning a negative error code as most other architectures do. +//! +//! Mips-family platforms have a special calling convention for `__NR_pipe`, +//! however we use `__NR_pipe2` instead to avoid having to implement it. + +use crate::backend::reg::{ + ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm, A0, A1, A2, A3, A4, A5, A6, R0, +}; +use core::arch::asm; + +#[inline] +pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + lateout("$7" /*$a3*/) err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + lateout("$7" /*$a3*/) err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + lateout("$7" /*$a3*/) err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1_noreturn(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> ! { + asm!( + "syscall", + in("$2" /*$v0*/) nr.to_asm(), + in("$4" /*$a0*/) a0.to_asm(), + options(nostack, noreturn) + ) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall2( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + lateout("$7" /*$a3*/) err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall2_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + lateout("$7" /*$a3*/) err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall3( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + lateout("$7" /*$a3*/) err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall3_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + lateout("$7" /*$a3*/) err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall4( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + inlateout("$7" /*$a3*/) a3.to_asm() => err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall4_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + inlateout("$7" /*$a3*/) a3.to_asm() => err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall5( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, +) -> RetReg { + let x0; + let err: usize; + asm!( + ".set noat", + "subu $sp, 32", + "sw {}, 16($sp)", + "syscall", + "addu $sp, 32", + ".set at", + in(reg) a4.to_asm(), + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + inlateout("$7" /*$a3*/) a3.to_asm() => err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(preserves_flags) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall5_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, +) -> RetReg { + let x0; + let err: usize; + asm!( + ".set noat", + "subu $sp, 32", + "sw {}, 16($sp)", + "syscall", + "addu $sp, 32", + ".set at", + in(reg) a4.to_asm(), + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + inlateout("$7" /*$a3*/) a3.to_asm() => err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall6( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, + a5: ArgReg<'_, A5>, +) -> RetReg { + let x0; + let err: usize; + asm!( + ".set noat", + "subu $sp, 32", + "sw {}, 16($sp)", + "sw {}, 20($sp)", + "syscall", + "addu $sp, 32", + ".set at", + in(reg) a4.to_asm(), + in(reg) a5.to_asm(), + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + inlateout("$7" /*$a3*/) a3.to_asm() => err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(preserves_flags) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall6_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, + a5: ArgReg<'_, A5>, +) -> RetReg { + let x0; + let err: usize; + asm!( + ".set noat", + "subu $sp, 32", + "sw {}, 16($sp)", + "sw {}, 20($sp)", + "syscall", + "addu $sp, 32", + ".set at", + in(reg) a4.to_asm(), + in(reg) a5.to_asm(), + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + inlateout("$7" /*$a3*/) a3.to_asm() => err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall7_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, + a5: ArgReg<'_, A5>, + a6: ArgReg<'_, A6>, +) -> RetReg { + let x0; + let err: usize; + asm!( + ".set noat", + "subu $sp, 32", + "sw {}, 16($sp)", + "sw {}, 20($sp)", + "sw {}, 24($sp)", + "syscall", + "addu $sp, 32", + ".set at", + in(reg) a4.to_asm(), + in(reg) a5.to_asm(), + in(reg) a6.to_asm(), + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + inlateout("$7" /*$a3*/) a3.to_asm() => err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} diff --git a/vendor/rustix/src/backend/linux_raw/arch/mips64.rs b/vendor/rustix/src/backend/linux_raw/arch/mips64.rs new file mode 100644 index 000000000..244daf3ef --- /dev/null +++ b/vendor/rustix/src/backend/linux_raw/arch/mips64.rs @@ -0,0 +1,466 @@ +//! mips64el Linux system calls. +//! +//! On mips64el, Linux indicates success or failure using `$a3` (`$7`) rather +//! than by returning a negative error code as most other architectures do. +//! +//! Mips-family platforms have a special calling convention for `__NR_pipe`, +//! however we use `__NR_pipe2` instead to avoid having to implement it. + +use crate::backend::reg::{ + ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm, A0, A1, A2, A3, A4, A5, R0, +}; +use core::arch::asm; + +#[inline] +pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + lateout("$7" /*$a3*/) err, + lateout("$8" /*$a4*/) _, + lateout("$9" /*$a5*/) _, + lateout("$10" /*$a6*/) _, + lateout("$11" /*$a7*/) _, + lateout("$12" /*$t0*/) _, + lateout("$13" /*$t1*/) _, + lateout("$14" /*$t2*/) _, + lateout("$15" /*$t3*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + lateout("$7" /*$a3*/) err, + lateout("$8" /*$a4*/) _, + lateout("$9" /*$a5*/) _, + lateout("$10" /*$a6*/) _, + lateout("$11" /*$a7*/) _, + lateout("$12" /*$t0*/) _, + lateout("$13" /*$t1*/) _, + lateout("$14" /*$t2*/) _, + lateout("$15" /*$t3*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + lateout("$7" /*$a3*/) err, + lateout("$8" /*$a4*/) _, + lateout("$9" /*$a5*/) _, + lateout("$10" /*$a6*/) _, + lateout("$11" /*$a7*/) _, + lateout("$12" /*$t0*/) _, + lateout("$13" /*$t1*/) _, + lateout("$14" /*$t2*/) _, + lateout("$15" /*$t3*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1_noreturn(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> ! { + asm!( + "syscall", + in("$2" /*$v0*/) nr.to_asm(), + in("$4" /*$a0*/) a0.to_asm(), + options(nostack, noreturn) + ) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall2( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + lateout("$7" /*$a3*/) err, + lateout("$8" /*$a4*/) _, + lateout("$9" /*$a5*/) _, + lateout("$10" /*$a6*/) _, + lateout("$11" /*$a7*/) _, + lateout("$12" /*$t0*/) _, + lateout("$13" /*$t1*/) _, + lateout("$14" /*$t2*/) _, + lateout("$15" /*$t3*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall2_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + lateout("$7" /*$a3*/) err, + lateout("$8" /*$a4*/) _, + lateout("$9" /*$a5*/) _, + lateout("$10" /*$a6*/) _, + lateout("$11" /*$a7*/) _, + lateout("$12" /*$t0*/) _, + lateout("$13" /*$t1*/) _, + lateout("$14" /*$t2*/) _, + lateout("$15" /*$t3*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall3( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + lateout("$7" /*$a3*/) err, + lateout("$8" /*$a4*/) _, + lateout("$9" /*$a5*/) _, + lateout("$10" /*$a6*/) _, + lateout("$11" /*$a7*/) _, + lateout("$12" /*$t0*/) _, + lateout("$13" /*$t1*/) _, + lateout("$14" /*$t2*/) _, + lateout("$15" /*$t3*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall3_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + lateout("$7" /*$a3*/) err, + lateout("$8" /*$a4*/) _, + lateout("$9" /*$a5*/) _, + lateout("$10" /*$a6*/) _, + lateout("$11" /*$a7*/) _, + lateout("$12" /*$t0*/) _, + lateout("$13" /*$t1*/) _, + lateout("$14" /*$t2*/) _, + lateout("$15" /*$t3*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall4( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + inlateout("$7" /*$a3*/) a3.to_asm() => err, + lateout("$8" /*$a4*/) _, + lateout("$9" /*$a5*/) _, + lateout("$10" /*$a6*/) _, + lateout("$11" /*$a7*/) _, + lateout("$12" /*$t0*/) _, + lateout("$13" /*$t1*/) _, + lateout("$14" /*$t2*/) _, + lateout("$15" /*$t3*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall4_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + inlateout("$7" /*$a3*/) a3.to_asm() => err, + lateout("$8" /*$a4*/) _, + lateout("$9" /*$a5*/) _, + lateout("$10" /*$a6*/) _, + lateout("$11" /*$a7*/) _, + lateout("$12" /*$t0*/) _, + lateout("$13" /*$t1*/) _, + lateout("$14" /*$t2*/) _, + lateout("$15" /*$t3*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall5( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + inlateout("$7" /*$a3*/) a3.to_asm() => err, + inlateout("$8" /*$a4*/) a4.to_asm() => _, + lateout("$9" /*$a5*/) _, + lateout("$10" /*$a6*/) _, + lateout("$11" /*$a7*/) _, + lateout("$12" /*$t0*/) _, + lateout("$13" /*$t1*/) _, + lateout("$14" /*$t2*/) _, + lateout("$15" /*$t3*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall5_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + inlateout("$7" /*$a3*/) a3.to_asm() => err, + inlateout("$8" /*$a4*/) a4.to_asm() => _, + lateout("$9" /*$a5*/) _, + lateout("$10" /*$a6*/) _, + lateout("$11" /*$a7*/) _, + lateout("$12" /*$t0*/) _, + lateout("$13" /*$t1*/) _, + lateout("$14" /*$t2*/) _, + lateout("$15" /*$t3*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall6( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, + a5: ArgReg<'_, A5>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + inlateout("$7" /*$a3*/) a3.to_asm() => err, + inlateout("$8" /*$a4*/) a4.to_asm() => _, + inlateout("$9" /*$a5*/) a5.to_asm() => _, + lateout("$10" /*$a6*/) _, + lateout("$11" /*$a7*/) _, + lateout("$12" /*$t0*/) _, + lateout("$13" /*$t1*/) _, + lateout("$14" /*$t2*/) _, + lateout("$15" /*$t3*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall6_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, + a5: ArgReg<'_, A5>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + inlateout("$7" /*$a3*/) a3.to_asm() => err, + inlateout("$8" /*$a4*/) a4.to_asm() => _, + inlateout("$9" /*$a5*/) a5.to_asm() => _, + lateout("$10" /*$a6*/) _, + lateout("$11" /*$a7*/) _, + lateout("$12" /*$t0*/) _, + lateout("$13" /*$t1*/) _, + lateout("$14" /*$t2*/) _, + lateout("$15" /*$t3*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} diff --git a/vendor/rustix/src/backend/linux_raw/arch/mips64r6.rs b/vendor/rustix/src/backend/linux_raw/arch/mips64r6.rs new file mode 100644 index 000000000..8c06d9ee9 --- /dev/null +++ b/vendor/rustix/src/backend/linux_raw/arch/mips64r6.rs @@ -0,0 +1,470 @@ +//! mipsisa64r6el Linux system calls. +//! +//! On mipsisa64r6el, Linux indicates success or failure using `$a3` (`$7`) +//! rather than by returning a negative error code as most other architectures +//! do. +//! +//! Mips-family platforms have a special calling convention for `__NR_pipe`, +//! however we use `__NR_pipe2` instead to avoid having to implement it. +//! +//! Note that MIPS R6 inline assembly currently doesn't differ from MIPS, +//! because no explicit call of R6-only or R2-only instructions exist here. + +use crate::backend::reg::{ + ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm, A0, A1, A2, A3, A4, A5, R0, +}; +use core::arch::asm; + +#[inline] +pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + lateout("$7" /*$a3*/) err, + lateout("$8" /*$a4*/) _, + lateout("$9" /*$a5*/) _, + lateout("$10" /*$a6*/) _, + lateout("$11" /*$a7*/) _, + lateout("$12" /*$t0*/) _, + lateout("$13" /*$t1*/) _, + lateout("$14" /*$t2*/) _, + lateout("$15" /*$t3*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + lateout("$7" /*$a3*/) err, + lateout("$8" /*$a4*/) _, + lateout("$9" /*$a5*/) _, + lateout("$10" /*$a6*/) _, + lateout("$11" /*$a7*/) _, + lateout("$12" /*$t0*/) _, + lateout("$13" /*$t1*/) _, + lateout("$14" /*$t2*/) _, + lateout("$15" /*$t3*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + lateout("$7" /*$a3*/) err, + lateout("$8" /*$a4*/) _, + lateout("$9" /*$a5*/) _, + lateout("$10" /*$a6*/) _, + lateout("$11" /*$a7*/) _, + lateout("$12" /*$t0*/) _, + lateout("$13" /*$t1*/) _, + lateout("$14" /*$t2*/) _, + lateout("$15" /*$t3*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1_noreturn(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> ! { + asm!( + "syscall", + in("$2" /*$v0*/) nr.to_asm(), + in("$4" /*$a0*/) a0.to_asm(), + options(nostack, noreturn) + ) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall2( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + lateout("$7" /*$a3*/) err, + lateout("$8" /*$a4*/) _, + lateout("$9" /*$a5*/) _, + lateout("$10" /*$a6*/) _, + lateout("$11" /*$a7*/) _, + lateout("$12" /*$t0*/) _, + lateout("$13" /*$t1*/) _, + lateout("$14" /*$t2*/) _, + lateout("$15" /*$t3*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall2_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + lateout("$7" /*$a3*/) err, + lateout("$8" /*$a4*/) _, + lateout("$9" /*$a5*/) _, + lateout("$10" /*$a6*/) _, + lateout("$11" /*$a7*/) _, + lateout("$12" /*$t0*/) _, + lateout("$13" /*$t1*/) _, + lateout("$14" /*$t2*/) _, + lateout("$15" /*$t3*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall3( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + lateout("$7" /*$a3*/) err, + lateout("$8" /*$a4*/) _, + lateout("$9" /*$a5*/) _, + lateout("$10" /*$a6*/) _, + lateout("$11" /*$a7*/) _, + lateout("$12" /*$t0*/) _, + lateout("$13" /*$t1*/) _, + lateout("$14" /*$t2*/) _, + lateout("$15" /*$t3*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall3_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + lateout("$7" /*$a3*/) err, + lateout("$8" /*$a4*/) _, + lateout("$9" /*$a5*/) _, + lateout("$10" /*$a6*/) _, + lateout("$11" /*$a7*/) _, + lateout("$12" /*$t0*/) _, + lateout("$13" /*$t1*/) _, + lateout("$14" /*$t2*/) _, + lateout("$15" /*$t3*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall4( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + inlateout("$7" /*$a3*/) a3.to_asm() => err, + lateout("$8" /*$a4*/) _, + lateout("$9" /*$a5*/) _, + lateout("$10" /*$a6*/) _, + lateout("$11" /*$a7*/) _, + lateout("$12" /*$t0*/) _, + lateout("$13" /*$t1*/) _, + lateout("$14" /*$t2*/) _, + lateout("$15" /*$t3*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall4_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + inlateout("$7" /*$a3*/) a3.to_asm() => err, + lateout("$8" /*$a4*/) _, + lateout("$9" /*$a5*/) _, + lateout("$10" /*$a6*/) _, + lateout("$11" /*$a7*/) _, + lateout("$12" /*$t0*/) _, + lateout("$13" /*$t1*/) _, + lateout("$14" /*$t2*/) _, + lateout("$15" /*$t3*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall5( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + inlateout("$7" /*$a3*/) a3.to_asm() => err, + inlateout("$8" /*$a4*/) a4.to_asm() => _, + lateout("$9" /*$a5*/) _, + lateout("$10" /*$a6*/) _, + lateout("$11" /*$a7*/) _, + lateout("$12" /*$t0*/) _, + lateout("$13" /*$t1*/) _, + lateout("$14" /*$t2*/) _, + lateout("$15" /*$t3*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall5_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + inlateout("$7" /*$a3*/) a3.to_asm() => err, + inlateout("$8" /*$a4*/) a4.to_asm() => _, + lateout("$9" /*$a5*/) _, + lateout("$10" /*$a6*/) _, + lateout("$11" /*$a7*/) _, + lateout("$12" /*$t0*/) _, + lateout("$13" /*$t1*/) _, + lateout("$14" /*$t2*/) _, + lateout("$15" /*$t3*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall6( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, + a5: ArgReg<'_, A5>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + inlateout("$7" /*$a3*/) a3.to_asm() => err, + inlateout("$8" /*$a4*/) a4.to_asm() => _, + inlateout("$9" /*$a5*/) a5.to_asm() => _, + lateout("$10" /*$a6*/) _, + lateout("$11" /*$a7*/) _, + lateout("$12" /*$t0*/) _, + lateout("$13" /*$t1*/) _, + lateout("$14" /*$t2*/) _, + lateout("$15" /*$t3*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall6_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, + a5: ArgReg<'_, A5>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + inlateout("$7" /*$a3*/) a3.to_asm() => err, + inlateout("$8" /*$a4*/) a4.to_asm() => _, + inlateout("$9" /*$a5*/) a5.to_asm() => _, + lateout("$10" /*$a6*/) _, + lateout("$11" /*$a7*/) _, + lateout("$12" /*$t0*/) _, + lateout("$13" /*$t1*/) _, + lateout("$14" /*$t2*/) _, + lateout("$15" /*$t3*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} diff --git a/vendor/rustix/src/backend/linux_raw/arch/mod.rs b/vendor/rustix/src/backend/linux_raw/arch/mod.rs index 31a8c11f9..ac9e25fa7 100644 --- a/vendor/rustix/src/backend/linux_raw/arch/mod.rs +++ b/vendor/rustix/src/backend/linux_raw/arch/mod.rs @@ -3,6 +3,14 @@ //! This module also has a `choose` submodule which chooses a scheme and is //! what most of the `rustix` syscalls use. //! +//! Compilers should really have intrinsics for making system calls. They're +//! much like regular calls, with custom calling conventions, and calling +//! conventions are otherwise the compiler's job. But for now, use inline asm. +//! +//! The calling conventions for Linux syscalls are [documented here]. +//! +//! [documented here]: https://man7.org/linux/man-pages/man2/syscall.2.html +//! //! # Safety //! //! This contains the inline `asm` statements performing the syscall @@ -15,6 +23,17 @@ // These functions always use the machine's syscall instruction, even when it // isn't the fastest option available. +#[cfg_attr(target_arch = "aarch64", path = "aarch64.rs")] +#[cfg_attr(all(target_arch = "arm", not(thumb_mode)), path = "arm.rs")] +#[cfg_attr(all(target_arch = "arm", thumb_mode), path = "thumb.rs")] +#[cfg_attr(target_arch = "mips", path = "mips.rs")] +#[cfg_attr(target_arch = "mips32r6", path = "mips32r6.rs")] +#[cfg_attr(target_arch = "mips64", path = "mips64.rs")] +#[cfg_attr(target_arch = "mips64r6", path = "mips64r6.rs")] +#[cfg_attr(target_arch = "powerpc64", path = "powerpc64.rs")] +#[cfg_attr(target_arch = "riscv64", path = "riscv64.rs")] +#[cfg_attr(target_arch = "x86", path = "x86.rs")] +#[cfg_attr(target_arch = "x86_64", path = "x86_64.rs")] pub(in crate::backend) mod asm; // On most architectures, the architecture syscall instruction is fast, so use diff --git a/vendor/rustix/src/backend/linux_raw/arch/powerpc64.rs b/vendor/rustix/src/backend/linux_raw/arch/powerpc64.rs new file mode 100644 index 000000000..14866c2dd --- /dev/null +++ b/vendor/rustix/src/backend/linux_raw/arch/powerpc64.rs @@ -0,0 +1,413 @@ +//! powerpc64le Linux system calls. +//! +//! On powerpc64le, Linux indicates success or failure using `cr0.SO` rather +//! than by returning a negative error code as most other architectures do. In +//! theory we could immediately translate this into a `Result`, and it'd save a +//! few branches. And in theory we could have specialized sequences for use +//! with syscalls that are known to never fail. However, those would require +//! more extensive changes in rustix's platform-independent code. For now, we +//! check the flag and negate the error value to make PowerPC64 look like other +//! architectures. + +use crate::backend::reg::{ + ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm, A0, A1, A2, A3, A4, A5, R0, +}; +use core::arch::asm; + +#[inline] +pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber<'_>) -> RetReg { + let r0; + asm!( + "sc", + "bns 0f", + "neg 3, 3", + "0:", + inlateout("r0") nr.to_asm() => _, + lateout("r3") r0, + lateout("r4") _, + lateout("r5") _, + lateout("r6") _, + lateout("r7") _, + lateout("r8") _, + lateout("r9") _, + lateout("r10") _, + lateout("r11") _, + lateout("r12") _, + lateout("cr0") _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> RetReg { + let r0; + asm!( + "sc", + "bns 0f", + "neg 3, 3", + "0:", + inlateout("r0") nr.to_asm() => _, + inlateout("r3") a0.to_asm() => r0, + lateout("r4") _, + lateout("r5") _, + lateout("r6") _, + lateout("r7") _, + lateout("r8") _, + lateout("r9") _, + lateout("r10") _, + lateout("r11") _, + lateout("r12") _, + lateout("cr0") _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, +) -> RetReg { + let r0; + asm!( + "sc", + "bns 0f", + "neg 3, 3", + "0:", + inlateout("r0") nr.to_asm() => _, + inlateout("r3") a0.to_asm() => r0, + lateout("r4") _, + lateout("r5") _, + lateout("r6") _, + lateout("r7") _, + lateout("r8") _, + lateout("r9") _, + lateout("r10") _, + lateout("r11") _, + lateout("r12") _, + lateout("cr0") _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1_noreturn(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> ! { + asm!( + "sc", + in("r0") nr.to_asm(), + in("r3") a0.to_asm(), + options(nostack, noreturn) + ) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall2( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, +) -> RetReg { + let r0; + asm!( + "sc", + "bns 0f", + "neg 3, 3", + "0:", + inlateout("r0") nr.to_asm() => _, + inlateout("r3") a0.to_asm() => r0, + inlateout("r4") a1.to_asm() => _, + lateout("r5") _, + lateout("r6") _, + lateout("r7") _, + lateout("r8") _, + lateout("r9") _, + lateout("r10") _, + lateout("r11") _, + lateout("r12") _, + lateout("cr0") _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall2_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, +) -> RetReg { + let r0; + asm!( + "sc", + "bns 0f", + "neg 3, 3", + "0:", + inlateout("r0") nr.to_asm() => _, + inlateout("r3") a0.to_asm() => r0, + inlateout("r4") a1.to_asm() => _, + lateout("r5") _, + lateout("r6") _, + lateout("r7") _, + lateout("r8") _, + lateout("r9") _, + lateout("r10") _, + lateout("r11") _, + lateout("r12") _, + lateout("cr0") _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall3( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, +) -> RetReg { + let r0; + asm!( + "sc", + "bns 0f", + "neg 3, 3", + "0:", + inlateout("r0") nr.to_asm() => _, + inlateout("r3") a0.to_asm() => r0, + inlateout("r4") a1.to_asm() => _, + inlateout("r5") a2.to_asm() => _, + lateout("r6") _, + lateout("r7") _, + lateout("r8") _, + lateout("r9") _, + lateout("r10") _, + lateout("r11") _, + lateout("r12") _, + lateout("cr0") _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall3_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, +) -> RetReg { + let r0; + asm!( + "sc", + "bns 0f", + "neg 3, 3", + "0:", + inlateout("r0") nr.to_asm() => _, + inlateout("r3") a0.to_asm() => r0, + inlateout("r4") a1.to_asm() => _, + inlateout("r5") a2.to_asm() => _, + lateout("r6") _, + lateout("r7") _, + lateout("r8") _, + lateout("r9") _, + lateout("r10") _, + lateout("r11") _, + lateout("r12") _, + lateout("cr0") _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall4( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, +) -> RetReg { + let r0; + asm!( + "sc", + "bns 0f", + "neg 3, 3", + "0:", + inlateout("r0") nr.to_asm() => _, + inlateout("r3") a0.to_asm() => r0, + inlateout("r4") a1.to_asm() => _, + inlateout("r5") a2.to_asm() => _, + inlateout("r6") a3.to_asm() => _, + lateout("r7") _, + lateout("r8") _, + lateout("r9") _, + lateout("r10") _, + lateout("r11") _, + lateout("r12") _, + lateout("cr0") _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall4_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, +) -> RetReg { + let r0; + asm!( + "sc", + "bns 0f", + "neg 3, 3", + "0:", + inlateout("r0") nr.to_asm() => _, + inlateout("r3") a0.to_asm() => r0, + inlateout("r4") a1.to_asm() => _, + inlateout("r5") a2.to_asm() => _, + inlateout("r6") a3.to_asm() => _, + lateout("r7") _, + lateout("r8") _, + lateout("r9") _, + lateout("r10") _, + lateout("r11") _, + lateout("r12") _, + lateout("cr0") _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall5( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, +) -> RetReg { + let r0; + asm!( + "sc", + "bns 0f", + "neg 3, 3", + "0:", + inlateout("r0") nr.to_asm() => _, + inlateout("r3") a0.to_asm() => r0, + inlateout("r4") a1.to_asm() => _, + inlateout("r5") a2.to_asm() => _, + inlateout("r6") a3.to_asm() => _, + inlateout("r7") a4.to_asm() => _, + lateout("r8") _, + lateout("r9") _, + lateout("r10") _, + lateout("r11") _, + lateout("r12") _, + lateout("cr0") _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall5_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, +) -> RetReg { + let r0; + asm!( + "sc", + "bns 0f", + "neg 3, 3", + "0:", + inlateout("r0") nr.to_asm() => _, + inlateout("r3") a0.to_asm() => r0, + inlateout("r4") a1.to_asm() => _, + inlateout("r5") a2.to_asm() => _, + inlateout("r6") a3.to_asm() => _, + inlateout("r7") a4.to_asm() => _, + lateout("r8") _, + lateout("r9") _, + lateout("r10") _, + lateout("r11") _, + lateout("r12") _, + lateout("cr0") _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall6( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, + a5: ArgReg<'_, A5>, +) -> RetReg { + let r0; + asm!( + "sc", + "bns 0f", + "neg 3, 3", + "0:", + inlateout("r0") nr.to_asm() => _, + inlateout("r3") a0.to_asm() => r0, + inlateout("r4") a1.to_asm() => _, + inlateout("r5") a2.to_asm() => _, + inlateout("r6") a3.to_asm() => _, + inlateout("r7") a4.to_asm() => _, + inlateout("r8") a5.to_asm() => _, + lateout("r9") _, + lateout("r10") _, + lateout("r11") _, + lateout("r12") _, + lateout("cr0") _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall6_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, + a5: ArgReg<'_, A5>, +) -> RetReg { + let r0; + asm!( + "sc", + "bns 0f", + "neg 3, 3", + "0:", + inlateout("r0") nr.to_asm() => _, + inlateout("r3") a0.to_asm() => r0, + inlateout("r4") a1.to_asm() => _, + inlateout("r5") a2.to_asm() => _, + inlateout("r6") a3.to_asm() => _, + inlateout("r7") a4.to_asm() => _, + inlateout("r8") a5.to_asm() => _, + lateout("r9") _, + lateout("r10") _, + lateout("r11") _, + lateout("r12") _, + lateout("cr0") _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} diff --git a/vendor/rustix/src/backend/linux_raw/arch/riscv64.rs b/vendor/rustix/src/backend/linux_raw/arch/riscv64.rs new file mode 100644 index 000000000..7b8533d75 --- /dev/null +++ b/vendor/rustix/src/backend/linux_raw/arch/riscv64.rs @@ -0,0 +1,265 @@ +//! riscv64 Linux system calls. + +use crate::backend::reg::{ + ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm, A0, A1, A2, A3, A4, A5, R0, +}; +use core::arch::asm; + +#[inline] +pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber<'_>) -> RetReg { + let r0; + asm!( + "ecall", + in("a7") nr.to_asm(), + lateout("a0") r0, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> RetReg { + let r0; + asm!( + "ecall", + in("a7") nr.to_asm(), + inlateout("a0") a0.to_asm() => r0, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, +) -> RetReg { + let r0; + asm!( + "ecall", + in("a7") nr.to_asm(), + inlateout("a0") a0.to_asm() => r0, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1_noreturn(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> ! { + asm!( + "ecall", + in("a7") nr.to_asm(), + in("a0") a0.to_asm(), + options(nostack, noreturn) + ); +} + +#[inline] +pub(in crate::backend) unsafe fn syscall2( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, +) -> RetReg { + let r0; + asm!( + "ecall", + in("a7") nr.to_asm(), + inlateout("a0") a0.to_asm() => r0, + in("a1") a1.to_asm(), + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall2_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, +) -> RetReg { + let r0; + asm!( + "ecall", + in("a7") nr.to_asm(), + inlateout("a0") a0.to_asm() => r0, + in("a1") a1.to_asm(), + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall3( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, +) -> RetReg { + let r0; + asm!( + "ecall", + in("a7") nr.to_asm(), + inlateout("a0") a0.to_asm() => r0, + in("a1") a1.to_asm(), + in("a2") a2.to_asm(), + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall3_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, +) -> RetReg { + let r0; + asm!( + "ecall", + in("a7") nr.to_asm(), + inlateout("a0") a0.to_asm() => r0, + in("a1") a1.to_asm(), + in("a2") a2.to_asm(), + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall4( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, +) -> RetReg { + let r0; + asm!( + "ecall", + in("a7") nr.to_asm(), + inlateout("a0") a0.to_asm() => r0, + in("a1") a1.to_asm(), + in("a2") a2.to_asm(), + in("a3") a3.to_asm(), + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall4_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, +) -> RetReg { + let r0; + asm!( + "ecall", + in("a7") nr.to_asm(), + inlateout("a0") a0.to_asm() => r0, + in("a1") a1.to_asm(), + in("a2") a2.to_asm(), + in("a3") a3.to_asm(), + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall5( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, +) -> RetReg { + let r0; + asm!( + "ecall", + in("a7") nr.to_asm(), + inlateout("a0") a0.to_asm() => r0, + in("a1") a1.to_asm(), + in("a2") a2.to_asm(), + in("a3") a3.to_asm(), + in("a4") a4.to_asm(), + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall5_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, +) -> RetReg { + let r0; + asm!( + "ecall", + in("a7") nr.to_asm(), + inlateout("a0") a0.to_asm() => r0, + in("a1") a1.to_asm(), + in("a2") a2.to_asm(), + in("a3") a3.to_asm(), + in("a4") a4.to_asm(), + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall6( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, + a5: ArgReg<'_, A5>, +) -> RetReg { + let r0; + asm!( + "ecall", + in("a7") nr.to_asm(), + inlateout("a0") a0.to_asm() => r0, + in("a1") a1.to_asm(), + in("a2") a2.to_asm(), + in("a3") a3.to_asm(), + in("a4") a4.to_asm(), + in("a5") a5.to_asm(), + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall6_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, + a5: ArgReg<'_, A5>, +) -> RetReg { + let r0; + asm!( + "ecall", + in("a7") nr.to_asm(), + inlateout("a0") a0.to_asm() => r0, + in("a1") a1.to_asm(), + in("a2") a2.to_asm(), + in("a3") a3.to_asm(), + in("a4") a4.to_asm(), + in("a5") a5.to_asm(), + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} diff --git a/vendor/rustix/src/backend/linux_raw/arch/thumb.rs b/vendor/rustix/src/backend/linux_raw/arch/thumb.rs new file mode 100644 index 000000000..73f9c1c26 --- /dev/null +++ b/vendor/rustix/src/backend/linux_raw/arch/thumb.rs @@ -0,0 +1,322 @@ +//! arm Linux system calls, using thumb-mode. +//! +//! In thumb-mode, r7 is the frame pointer and is not permitted to be used in +//! an inline asm operand, so we have to use a different register and copy it +//! into r7 inside the inline asm. + +use crate::backend::reg::{ + ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm, A0, A1, A2, A3, A4, A5, R0, +}; +use core::arch::asm; + +#[inline] +pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber<'_>) -> RetReg { + let r0; + asm!( + "mov {tmp}, r7", + "mov r7, {nr}", + "svc 0", + "mov r7, {tmp}", + nr = in(reg) nr.to_asm(), + tmp = out(reg) _, + lateout("r0") r0, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> RetReg { + let r0; + asm!( + "mov {tmp}, r7", + "mov r7, {nr}", + "svc 0", + "mov r7, {tmp}", + nr = in(reg) nr.to_asm(), + tmp = out(reg) _, + inlateout("r0") a0.to_asm() => r0, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, +) -> RetReg { + let r0; + asm!( + "mov {tmp}, r7", + "mov r7, {nr}", + "svc 0", + "mov r7, {tmp}", + nr = in(reg) nr.to_asm(), + tmp = out(reg) _, + inlateout("r0") a0.to_asm() => r0, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1_noreturn(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> ! { + asm!( + "mov r7, {nr}", + "svc 0", + nr = in(reg) nr.to_asm(), + in("r0") a0.to_asm(), + options(nostack, noreturn) + ) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall2( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, +) -> RetReg { + let r0; + asm!( + "mov {tmp}, r7", + "mov r7, {nr}", + "svc 0", + "mov r7, {tmp}", + nr = in(reg) nr.to_asm(), + tmp = out(reg) _, + inlateout("r0") a0.to_asm() => r0, + in("r1") a1.to_asm(), + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall2_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, +) -> RetReg { + let r0; + asm!( + "mov {tmp}, r7", + "mov r7, {nr}", + "svc 0", + "mov r7, {tmp}", + nr = in(reg) nr.to_asm(), + tmp = out(reg) _, + inlateout("r0") a0.to_asm() => r0, + in("r1") a1.to_asm(), + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall3( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, +) -> RetReg { + let r0; + asm!( + "mov {tmp}, r7", + "mov r7, {nr}", + "svc 0", + "mov r7, {tmp}", + nr = in(reg) nr.to_asm(), + tmp = out(reg) _, + inlateout("r0") a0.to_asm() => r0, + in("r1") a1.to_asm(), + in("r2") a2.to_asm(), + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall3_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, +) -> RetReg { + let r0; + asm!( + "mov {tmp}, r7", + "mov r7, {nr}", + "svc 0", + "mov r7, {tmp}", + nr = in(reg) nr.to_asm(), + tmp = out(reg) _, + inlateout("r0") a0.to_asm() => r0, + in("r1") a1.to_asm(), + in("r2") a2.to_asm(), + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall4( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, +) -> RetReg { + let r0; + asm!( + "mov {tmp}, r7", + "mov r7, {nr}", + "svc 0", + "mov r7, {tmp}", + nr = in(reg) nr.to_asm(), + tmp = out(reg) _, + inlateout("r0") a0.to_asm() => r0, + in("r1") a1.to_asm(), + in("r2") a2.to_asm(), + in("r3") a3.to_asm(), + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall4_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, +) -> RetReg { + let r0; + asm!( + "mov {tmp}, r7", + "mov r7, {nr}", + "svc 0", + "mov r7, {tmp}", + nr = in(reg) nr.to_asm(), + tmp = out(reg) _, + inlateout("r0") a0.to_asm() => r0, + in("r1") a1.to_asm(), + in("r2") a2.to_asm(), + in("r3") a3.to_asm(), + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall5( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, +) -> RetReg { + let r0; + asm!( + "mov {tmp}, r7", + "mov r7, {nr}", + "svc 0", + "mov r7, {tmp}", + nr = in(reg) nr.to_asm(), + tmp = out(reg) _, + inlateout("r0") a0.to_asm() => r0, + in("r1") a1.to_asm(), + in("r2") a2.to_asm(), + in("r3") a3.to_asm(), + in("r4") a4.to_asm(), + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall5_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, +) -> RetReg { + let r0; + asm!( + "mov {tmp}, r7", + "mov r7, {nr}", + "svc 0", + "mov r7, {tmp}", + nr = in(reg) nr.to_asm(), + tmp = out(reg) _, + inlateout("r0") a0.to_asm() => r0, + in("r1") a1.to_asm(), + in("r2") a2.to_asm(), + in("r3") a3.to_asm(), + in("r4") a4.to_asm(), + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall6( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, + a5: ArgReg<'_, A5>, +) -> RetReg { + let r0; + asm!( + "mov {tmp}, r7", + "mov r7, {nr}", + "svc 0", + "mov r7, {tmp}", + nr = in(reg) nr.to_asm(), + tmp = out(reg) _, + inlateout("r0") a0.to_asm() => r0, + in("r1") a1.to_asm(), + in("r2") a2.to_asm(), + in("r3") a3.to_asm(), + in("r4") a4.to_asm(), + in("r5") a5.to_asm(), + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall6_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, + a5: ArgReg<'_, A5>, +) -> RetReg { + let r0; + asm!( + "mov {tmp}, r7", + "mov r7, {nr}", + "svc 0", + "mov r7, {tmp}", + nr = in(reg) nr.to_asm(), + tmp = out(reg) _, + inlateout("r0") a0.to_asm() => r0, + in("r1") a1.to_asm(), + in("r2") a2.to_asm(), + in("r3") a3.to_asm(), + in("r4") a4.to_asm(), + in("r5") a5.to_asm(), + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} diff --git a/vendor/rustix/src/backend/linux_raw/arch/x86.rs b/vendor/rustix/src/backend/linux_raw/arch/x86.rs new file mode 100644 index 000000000..581cde278 --- /dev/null +++ b/vendor/rustix/src/backend/linux_raw/arch/x86.rs @@ -0,0 +1,489 @@ +//! 32-bit x86 Linux system calls. +//! +//! There are two forms; `indirect_*` which take a callee, which allow calling +//! through the vDSO when possible, and plain forms, which use the `int 0x80` +//! instruction. +//! +//! Most `rustix` syscalls use the vsyscall mechanism rather than going using +//! `int 0x80` sequences, as vsyscall is much faster. +//! +//! Syscalls made with `int 0x80` preserve the flags register, while syscalls +//! made using vsyscall do not. + +#![allow(dead_code)] + +use crate::backend::reg::{ + ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm, A0, A1, A2, A3, A4, A5, R0, +}; +use crate::backend::vdso_wrappers::SyscallType; +use core::arch::asm; + +#[inline] +pub(in crate::backend) unsafe fn indirect_syscall0( + callee: SyscallType, + nr: SyscallNumber<'_>, +) -> RetReg { + let r0; + asm!( + "call {callee}", + callee = in(reg) callee, + inlateout("eax") nr.to_asm() => r0, + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn indirect_syscall1( + callee: SyscallType, + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, +) -> RetReg { + let r0; + asm!( + "call {callee}", + callee = in(reg) callee, + inlateout("eax") nr.to_asm() => r0, + in("ebx") a0.to_asm(), + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn indirect_syscall1_noreturn( + callee: SyscallType, + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, +) -> ! { + asm!( + "call {callee}", + callee = in(reg) callee, + in("eax") nr.to_asm(), + in("ebx") a0.to_asm(), + options(noreturn) + ) +} + +#[inline] +pub(in crate::backend) unsafe fn indirect_syscall2( + callee: SyscallType, + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, +) -> RetReg { + let r0; + asm!( + "call {callee}", + callee = in(reg) callee, + inlateout("eax") nr.to_asm() => r0, + in("ebx") a0.to_asm(), + in("ecx") a1.to_asm(), + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn indirect_syscall3( + callee: SyscallType, + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, +) -> RetReg { + let r0; + asm!( + "call {callee}", + callee = in(reg) callee, + inlateout("eax") nr.to_asm() => r0, + in("ebx") a0.to_asm(), + in("ecx") a1.to_asm(), + in("edx") a2.to_asm(), + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn indirect_syscall4( + callee: SyscallType, + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, +) -> RetReg { + let r0; + // a3 should go in esi, but `asm!` won't let us use it as an operand. + // Temporarily swap it into place, and then swap it back afterward. + // + // We hard-code the callee operand to use edi instead of `in(reg)` because + // even though we can't name esi as an operand, the compiler can use esi to + // satisfy `in(reg)`. + asm!( + "xchg esi, {a3}", + "call edi", + "xchg esi, {a3}", + a3 = in(reg) a3.to_asm(), + in("edi") callee, + inlateout("eax") nr.to_asm() => r0, + in("ebx") a0.to_asm(), + in("ecx") a1.to_asm(), + in("edx") a2.to_asm(), + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn indirect_syscall5( + callee: SyscallType, + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, +) -> RetReg { + let r0; + // Oof. a3 should go in esi, and `asm!` won't let us use that register as + // an operand. And we can't request stack slots. And there are no other + // registers free. Use eax as a temporary pointer to a slice, since it gets + // clobbered as the return value anyway. + asm!( + "push esi", + "push DWORD PTR [eax + 0]", + "mov esi, DWORD PTR [eax + 4]", + "mov eax, DWORD PTR [eax + 8]", + "call DWORD PTR [esp]", + "pop esi", + "pop esi", + inout("eax") &[callee as _, a3.to_asm(), nr.to_asm()] => r0, + in("ebx") a0.to_asm(), + in("ecx") a1.to_asm(), + in("edx") a2.to_asm(), + in("edi") a4.to_asm(), + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn indirect_syscall6( + callee: SyscallType, + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, + a5: ArgReg<'_, A5>, +) -> RetReg { + let r0; + // Oof again. a3 should go in esi, and a5 should go in ebp, and `asm!` + // won't let us use either of those registers as operands. And we can't + // request stack slots. And there are no other registers free. Use eax as a + // temporary pointer to a slice, since it gets clobbered as the return + // value anyway. + // + // This is another reason that syscalls should be compiler intrinsics + // rather than inline asm. + asm!( + "push ebp", + "push esi", + "push DWORD PTR [eax + 0]", + "mov esi, DWORD PTR [eax + 4]", + "mov ebp, DWORD PTR [eax + 8]", + "mov eax, DWORD PTR [eax + 12]", + "call DWORD PTR [esp]", + "pop esi", + "pop esi", + "pop ebp", + inout("eax") &[callee as _, a3.to_asm(), a5.to_asm(), nr.to_asm()] => r0, + in("ebx") a0.to_asm(), + in("ecx") a1.to_asm(), + in("edx") a2.to_asm(), + in("edi") a4.to_asm(), + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber<'_>) -> RetReg { + let r0; + asm!( + "int $$0x80", + inlateout("eax") nr.to_asm() => r0, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> RetReg { + let r0; + asm!( + "int $$0x80", + inlateout("eax") nr.to_asm() => r0, + in("ebx") a0.to_asm(), + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, +) -> RetReg { + let r0; + asm!( + "int $$0x80", + inlateout("eax") nr.to_asm() => r0, + in("ebx") a0.to_asm(), + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1_noreturn(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> ! { + asm!( + "int $$0x80", + in("eax") nr.to_asm(), + in("ebx") a0.to_asm(), + options(nostack, noreturn) + ) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall2( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, +) -> RetReg { + let r0; + asm!( + "int $$0x80", + inlateout("eax") nr.to_asm() => r0, + in("ebx") a0.to_asm(), + in("ecx") a1.to_asm(), + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall2_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, +) -> RetReg { + let r0; + asm!( + "int $$0x80", + inlateout("eax") nr.to_asm() => r0, + in("ebx") a0.to_asm(), + in("ecx") a1.to_asm(), + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall3( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, +) -> RetReg { + let r0; + asm!( + "int $$0x80", + inlateout("eax") nr.to_asm() => r0, + in("ebx") a0.to_asm(), + in("ecx") a1.to_asm(), + in("edx") a2.to_asm(), + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall3_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, +) -> RetReg { + let r0; + asm!( + "int $$0x80", + inlateout("eax") nr.to_asm() => r0, + in("ebx") a0.to_asm(), + in("ecx") a1.to_asm(), + in("edx") a2.to_asm(), + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall4( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, +) -> RetReg { + let r0; + // a3 should go in esi, but `asm!` won't let us use it as an operand. + // Temporarily swap it into place, and then swap it back afterward. + asm!( + "xchg esi, {a3}", + "int $$0x80", + "xchg esi, {a3}", + a3 = in(reg) a3.to_asm(), + inlateout("eax") nr.to_asm() => r0, + in("ebx") a0.to_asm(), + in("ecx") a1.to_asm(), + in("edx") a2.to_asm(), + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall4_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, +) -> RetReg { + let r0; + asm!( + "xchg esi, {a3}", + "int $$0x80", + "xchg esi, {a3}", + a3 = in(reg) a3.to_asm(), + inlateout("eax") nr.to_asm() => r0, + in("ebx") a0.to_asm(), + in("ecx") a1.to_asm(), + in("edx") a2.to_asm(), + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall5( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, +) -> RetReg { + let r0; + // As in `syscall4`, use xchg to handle a3. a4 should go in edi, and we can + // use that register as an operand. Unlike in `indirect_syscall5`, we don't + // have a `callee` operand taking up a register, so we have enough + // registers and don't need to use a slice. + asm!( + "xchg esi, {a3}", + "int $$0x80", + "xchg esi, {a3}", + a3 = in(reg) a3.to_asm(), + inlateout("eax") nr.to_asm() => r0, + in("ebx") a0.to_asm(), + in("ecx") a1.to_asm(), + in("edx") a2.to_asm(), + in("edi") a4.to_asm(), + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall5_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, +) -> RetReg { + let r0; + // See the comments in `syscall5`. + asm!( + "xchg esi, {a3}", + "int $$0x80", + "xchg esi, {a3}", + a3 = in(reg) a3.to_asm(), + inlateout("eax") nr.to_asm() => r0, + in("ebx") a0.to_asm(), + in("ecx") a1.to_asm(), + in("edx") a2.to_asm(), + in("edi") a4.to_asm(), + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall6( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, + a5: ArgReg<'_, A5>, +) -> RetReg { + let r0; + // See the comments in `indirect_syscall6`. + asm!( + "push ebp", + "push esi", + "mov esi, DWORD PTR [eax + 0]", + "mov ebp, DWORD PTR [eax + 4]", + "mov eax, DWORD PTR [eax + 8]", + "int $$0x80", + "pop esi", + "pop ebp", + inout("eax") &[a3.to_asm(), a5.to_asm(), nr.to_asm()] => r0, + in("ebx") a0.to_asm(), + in("ecx") a1.to_asm(), + in("edx") a2.to_asm(), + in("edi") a4.to_asm(), + options(preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall6_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, + a5: ArgReg<'_, A5>, +) -> RetReg { + let r0; + // See the comments in `indirect_syscall6`. + asm!( + "push ebp", + "push esi", + "mov esi, DWORD PTR [eax + 0]", + "mov ebp, DWORD PTR [eax + 4]", + "mov eax, DWORD PTR [eax + 8]", + "int $$0x80", + "pop esi", + "pop ebp", + inout("eax") &[a3.to_asm(), a5.to_asm(), nr.to_asm()] => r0, + in("ebx") a0.to_asm(), + in("ecx") a1.to_asm(), + in("edx") a2.to_asm(), + in("edi") a4.to_asm(), + options(preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} diff --git a/vendor/rustix/src/backend/linux_raw/arch/x86_64.rs b/vendor/rustix/src/backend/linux_raw/arch/x86_64.rs new file mode 100644 index 000000000..62f35d90f --- /dev/null +++ b/vendor/rustix/src/backend/linux_raw/arch/x86_64.rs @@ -0,0 +1,293 @@ +//! x86-64 Linux system calls. + +use crate::backend::reg::{ + ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm, A0, A1, A2, A3, A4, A5, R0, +}; +use core::arch::asm; + +#[cfg(target_pointer_width = "32")] +compile_error!("x32 is not yet supported"); + +#[inline] +pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber<'_>) -> RetReg { + let r0; + asm!( + "syscall", + inlateout("rax") nr.to_asm() => r0, + lateout("rcx") _, + lateout("r11") _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> RetReg { + let r0; + asm!( + "syscall", + inlateout("rax") nr.to_asm() => r0, + in("rdi") a0.to_asm(), + lateout("rcx") _, + lateout("r11") _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, +) -> RetReg { + let r0; + asm!( + "syscall", + inlateout("rax") nr.to_asm() => r0, + in("rdi") a0.to_asm(), + lateout("rcx") _, + lateout("r11") _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1_noreturn(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> ! { + asm!( + "syscall", + in("rax") nr.to_asm(), + in("rdi") a0.to_asm(), + options(nostack, noreturn) + ) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall2( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, +) -> RetReg { + let r0; + asm!( + "syscall", + inlateout("rax") nr.to_asm() => r0, + in("rdi") a0.to_asm(), + in("rsi") a1.to_asm(), + lateout("rcx") _, + lateout("r11") _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall2_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, +) -> RetReg { + let r0; + asm!( + "syscall", + inlateout("rax") nr.to_asm() => r0, + in("rdi") a0.to_asm(), + in("rsi") a1.to_asm(), + lateout("rcx") _, + lateout("r11") _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall3( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, +) -> RetReg { + let r0; + asm!( + "syscall", + inlateout("rax") nr.to_asm() => r0, + in("rdi") a0.to_asm(), + in("rsi") a1.to_asm(), + in("rdx") a2.to_asm(), + lateout("rcx") _, + lateout("r11") _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall3_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, +) -> RetReg { + let r0; + asm!( + "syscall", + inlateout("rax") nr.to_asm() => r0, + in("rdi") a0.to_asm(), + in("rsi") a1.to_asm(), + in("rdx") a2.to_asm(), + lateout("rcx") _, + lateout("r11") _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall4( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, +) -> RetReg { + let r0; + asm!( + "syscall", + inlateout("rax") nr.to_asm() => r0, + in("rdi") a0.to_asm(), + in("rsi") a1.to_asm(), + in("rdx") a2.to_asm(), + in("r10") a3.to_asm(), + lateout("rcx") _, + lateout("r11") _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall4_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, +) -> RetReg { + let r0; + asm!( + "syscall", + inlateout("rax") nr.to_asm() => r0, + in("rdi") a0.to_asm(), + in("rsi") a1.to_asm(), + in("rdx") a2.to_asm(), + in("r10") a3.to_asm(), + lateout("rcx") _, + lateout("r11") _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall5( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, +) -> RetReg { + let r0; + asm!( + "syscall", + inlateout("rax") nr.to_asm() => r0, + in("rdi") a0.to_asm(), + in("rsi") a1.to_asm(), + in("rdx") a2.to_asm(), + in("r10") a3.to_asm(), + in("r8") a4.to_asm(), + lateout("rcx") _, + lateout("r11") _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall5_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, +) -> RetReg { + let r0; + asm!( + "syscall", + inlateout("rax") nr.to_asm() => r0, + in("rdi") a0.to_asm(), + in("rsi") a1.to_asm(), + in("rdx") a2.to_asm(), + in("r10") a3.to_asm(), + in("r8") a4.to_asm(), + lateout("rcx") _, + lateout("r11") _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall6( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, + a5: ArgReg<'_, A5>, +) -> RetReg { + let r0; + asm!( + "syscall", + inlateout("rax") nr.to_asm() => r0, + in("rdi") a0.to_asm(), + in("rsi") a1.to_asm(), + in("rdx") a2.to_asm(), + in("r10") a3.to_asm(), + in("r8") a4.to_asm(), + in("r9") a5.to_asm(), + lateout("rcx") _, + lateout("r11") _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall6_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, + a5: ArgReg<'_, A5>, +) -> RetReg { + let r0; + asm!( + "syscall", + inlateout("rax") nr.to_asm() => r0, + in("rdi") a0.to_asm(), + in("rsi") a1.to_asm(), + in("rdx") a2.to_asm(), + in("r10") a3.to_asm(), + in("r8") a4.to_asm(), + in("r9") a5.to_asm(), + lateout("rcx") _, + lateout("r11") _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} diff --git a/vendor/rustix/src/backend/linux_raw/c.rs b/vendor/rustix/src/backend/linux_raw/c.rs index f336392bb..65ddb1466 100644 --- a/vendor/rustix/src/backend/linux_raw/c.rs +++ b/vendor/rustix/src/backend/linux_raw/c.rs @@ -9,6 +9,7 @@ pub type size_t = usize; pub(crate) use linux_raw_sys::ctypes::*; pub(crate) use linux_raw_sys::errno::EINVAL; +pub(crate) use linux_raw_sys::ioctl::{FIONBIO, FIONREAD}; // Import the kernel's `uid_t` and `gid_t` if they're 32-bit. #[cfg(not(any(target_arch = "arm", target_arch = "sparc", target_arch = "x86")))] pub(crate) use linux_raw_sys::general::{__kernel_gid_t as gid_t, __kernel_uid_t as uid_t}; @@ -25,7 +26,7 @@ pub(crate) use linux_raw_sys::general::epoll_event; feature = "fs", all( not(feature = "use-libc-auxv"), - not(target_vendor = "mustang"), + not(feature = "use-explicitly-provided-auxv"), any( feature = "param", feature = "runtime", @@ -39,6 +40,8 @@ pub(crate) use linux_raw_sys::general::{ XATTR_REPLACE, }; +pub(crate) use linux_raw_sys::ioctl::{BLKPBSZGET, BLKSSZGET, FICLONE}; + #[cfg(feature = "io_uring")] pub(crate) use linux_raw_sys::{general::open_how, io_uring::*}; @@ -65,10 +68,10 @@ pub(crate) use linux_raw_sys::{ IP_MULTICAST_TTL, IP_TTL, MSG_CMSG_CLOEXEC, MSG_CONFIRM, MSG_DONTROUTE, MSG_DONTWAIT, MSG_EOR, MSG_ERRQUEUE, MSG_MORE, MSG_NOSIGNAL, MSG_OOB, MSG_PEEK, MSG_TRUNC, MSG_WAITALL, SCM_CREDENTIALS, SCM_RIGHTS, SHUT_RD, SHUT_RDWR, SHUT_WR, SOCK_DGRAM, SOCK_RAW, SOCK_RDM, - SOCK_SEQPACKET, SOCK_STREAM, SOL_SOCKET, SO_BROADCAST, SO_ERROR, SO_KEEPALIVE, SO_LINGER, - SO_PASSCRED, SO_RCVBUF, SO_RCVTIMEO_NEW, SO_RCVTIMEO_NEW as SO_RCVTIMEO, SO_RCVTIMEO_OLD, - SO_REUSEADDR, SO_SNDBUF, SO_SNDTIMEO_NEW, SO_SNDTIMEO_NEW as SO_SNDTIMEO, SO_SNDTIMEO_OLD, - SO_TYPE, TCP_NODELAY, + SOCK_SEQPACKET, SOCK_STREAM, SOL_SOCKET, SO_BROADCAST, SO_DOMAIN, SO_ERROR, SO_KEEPALIVE, + SO_LINGER, SO_PASSCRED, SO_RCVBUF, SO_RCVTIMEO_NEW, SO_RCVTIMEO_NEW as SO_RCVTIMEO, + SO_RCVTIMEO_OLD, SO_REUSEADDR, SO_SNDBUF, SO_SNDTIMEO_NEW, SO_SNDTIMEO_NEW as SO_SNDTIMEO, + SO_SNDTIMEO_OLD, SO_TYPE, TCP_NODELAY, }, netlink::*, }; @@ -76,12 +79,25 @@ pub(crate) use linux_raw_sys::{ #[cfg(any(feature = "process", feature = "runtime"))] pub(crate) use linux_raw_sys::general::siginfo_t; +#[cfg(any(feature = "process", feature = "runtime"))] +pub(crate) const EXIT_SUCCESS: c_int = 0; +#[cfg(any(feature = "process", feature = "runtime"))] +pub(crate) const EXIT_FAILURE: c_int = 1; #[cfg(feature = "process")] -pub(crate) use linux_raw_sys::general::{ - CLD_CONTINUED, CLD_DUMPED, CLD_EXITED, CLD_KILLED, CLD_STOPPED, CLD_TRAPPED, - O_NONBLOCK as PIDFD_NONBLOCK, P_ALL, P_PID, P_PIDFD, +pub(crate) const EXIT_SIGNALED_SIGABRT: c_int = 128 + linux_raw_sys::general::SIGABRT as c_int; + +#[cfg(feature = "process")] +pub(crate) use linux_raw_sys::{ + general::{ + CLD_CONTINUED, CLD_DUMPED, CLD_EXITED, CLD_KILLED, CLD_STOPPED, CLD_TRAPPED, + O_NONBLOCK as PIDFD_NONBLOCK, P_ALL, P_PID, P_PIDFD, + }, + ioctl::TIOCSCTTY, }; +#[cfg(feature = "pty")] +pub(crate) use linux_raw_sys::ioctl::TIOCGPTPEER; + #[cfg(feature = "termios")] pub(crate) use linux_raw_sys::{ general::{ @@ -99,7 +115,7 @@ pub(crate) use linux_raw_sys::{ VKILL, VLNEXT, VMIN, VQUIT, VREPRINT, VSTART, VSTOP, VSUSP, VSWTC, VT0, VT1, VTDLY, VTIME, VWERASE, XCASE, XTABS, }, - ioctl::{TCGETS2, TCSETS2, TCSETSF2, TCSETSW2}, + ioctl::{TCGETS2, TCSETS2, TCSETSF2, TCSETSW2, TIOCEXCL, TIOCNXCL}, }; // On MIPS, `TCSANOW` et al have `TCSETS` added to them, so we need it to diff --git a/vendor/rustix/src/backend/linux_raw/conv.rs b/vendor/rustix/src/backend/linux_raw/conv.rs index c87136f8f..f915db140 100644 --- a/vendor/rustix/src/backend/linux_raw/conv.rs +++ b/vendor/rustix/src/backend/linux_raw/conv.rs @@ -186,45 +186,45 @@ pub(super) fn no_fd<'a, Num: ArgNumber>() -> ArgReg<'a, Num> { } #[inline] -pub(super) fn slice_just_addr(v: &[T]) -> ArgReg { +pub(super) fn slice_just_addr(v: &[T]) -> ArgReg<'_, Num> { let mut_ptr = v.as_ptr() as *mut T; raw_arg(mut_ptr.cast()) } #[inline] -pub(super) fn slice_just_addr_mut(v: &mut [T]) -> ArgReg { +pub(super) fn slice_just_addr_mut(v: &mut [T]) -> ArgReg<'_, Num> { raw_arg(v.as_mut_ptr().cast()) } #[inline] pub(super) fn slice( v: &[T], -) -> (ArgReg, ArgReg) { +) -> (ArgReg<'_, Num0>, ArgReg<'_, Num1>) { (slice_just_addr(v), pass_usize(v.len())) } #[inline] pub(super) fn slice_mut( v: &mut [T], -) -> (ArgReg, ArgReg) { +) -> (ArgReg<'_, Num0>, ArgReg<'_, Num1>) { (raw_arg(v.as_mut_ptr().cast()), pass_usize(v.len())) } #[inline] -pub(super) fn by_ref(t: &T) -> ArgReg { +pub(super) fn by_ref(t: &T) -> ArgReg<'_, Num> { let mut_ptr = as_ptr(t) as *mut T; raw_arg(mut_ptr.cast()) } #[inline] -pub(super) fn by_mut(t: &mut T) -> ArgReg { +pub(super) fn by_mut(t: &mut T) -> ArgReg<'_, Num> { raw_arg(as_mut_ptr(t).cast()) } /// Convert an optional mutable reference into a `usize` for passing to a /// syscall. #[inline] -pub(super) fn opt_mut(t: Option<&mut T>) -> ArgReg { +pub(super) fn opt_mut(t: Option<&mut T>) -> ArgReg<'_, Num> { // This optimizes into the equivalent of `transmute(t)`, and has the // advantage of not requiring `unsafe`. match t { @@ -237,7 +237,7 @@ pub(super) fn opt_mut(t: Option<&mut T>) -> ArgReg(t: Option<&T>) -> ArgReg { +pub(super) fn opt_ref(t: Option<&T>) -> ArgReg<'_, Num> { // This optimizes into the equivalent of `transmute(t)`, and has the // advantage of not requiring `unsafe`. match t { @@ -300,7 +300,7 @@ pub(super) fn socklen_t<'a, Num: ArgNumber>(i: socklen_t) -> ArgReg<'a, Num> { feature = "fs", all( not(feature = "use-libc-auxv"), - not(target_vendor = "mustang"), + not(feature = "use-explicitly-provided-auxv"), any( feature = "param", feature = "runtime", @@ -581,7 +581,7 @@ impl<'a, Num: ArgNumber> From for ArgReg<'a, Num> { } } -#[cfg(feature = "event")] +#[cfg(all(feature = "alloc", feature = "event"))] impl<'a, Num: ArgNumber> From for ArgReg<'a, Num> { #[inline] fn from(flags: crate::event::epoll::CreateFlags) -> Self { diff --git a/vendor/rustix/src/backend/linux_raw/elf.rs b/vendor/rustix/src/backend/linux_raw/elf.rs deleted file mode 100644 index 415f79f88..000000000 --- a/vendor/rustix/src/backend/linux_raw/elf.rs +++ /dev/null @@ -1,181 +0,0 @@ -//! The ELF ABI. 🧝 - -#![allow(non_snake_case)] -#![cfg_attr( - all(not(target_vendor = "mustang"), feature = "use-libc-auxv"), - allow(dead_code) -)] - -pub(super) const SELFMAG: usize = 4; -pub(super) const ELFMAG: [u8; SELFMAG] = [0x7f, b'E', b'L', b'F']; -pub(super) const EI_CLASS: usize = 4; -pub(super) const EI_DATA: usize = 5; -pub(super) const EI_VERSION: usize = 6; -pub(super) const EI_OSABI: usize = 7; -pub(super) const EI_ABIVERSION: usize = 8; -pub(super) const EV_CURRENT: u8 = 1; -#[cfg(target_pointer_width = "32")] -pub(super) const ELFCLASS: u8 = 1; // ELFCLASS32 -#[cfg(target_pointer_width = "64")] -pub(super) const ELFCLASS: u8 = 2; // ELFCLASS64 -#[cfg(target_endian = "little")] -pub(super) const ELFDATA: u8 = 1; // ELFDATA2LSB -#[cfg(target_endian = "big")] -pub(super) const ELFDATA: u8 = 2; // ELFDATA2MSB -pub(super) const ELFOSABI_SYSV: u8 = 0; -pub(super) const ELFOSABI_LINUX: u8 = 3; -// At present all of our supported platforms use 0. -pub(super) const ELFABIVERSION: u8 = 0; -pub(super) const ET_DYN: u16 = 3; -pub(super) const EI_NIDENT: usize = 16; -pub(super) const SHN_UNDEF: u16 = 0; -pub(super) const SHN_ABS: u16 = 0xfff1; -pub(super) const PN_XNUM: u16 = 0xffff; -pub(super) const PT_LOAD: u32 = 1; -pub(super) const PT_DYNAMIC: u32 = 2; -pub(super) const PT_INTERP: u32 = 3; -pub(super) const PT_PHDR: u32 = 6; -pub(super) const PT_TLS: u32 = 7; -pub(super) const PT_GNU_STACK: u32 = 0x6474_e551; -pub(super) const PT_GNU_RELRO: u32 = 0x6474_e552; -pub(super) const PF_X: u32 = 1; -pub(super) const PF_W: u32 = 2; -pub(super) const PF_R: u32 = 4; -pub(super) const DT_NULL: i32 = 0; -pub(super) const DT_HASH: i32 = 4; -pub(super) const DT_STRTAB: i32 = 5; -pub(super) const DT_SYMTAB: i32 = 6; -pub(super) const DT_SYMENT: i32 = 11; -pub(super) const DT_VERSYM: i32 = 0x6fff_fff0; -pub(super) const DT_VERDEF: i32 = 0x6fff_fffc; -pub(super) const STB_WEAK: u8 = 2; -pub(super) const STB_GLOBAL: u8 = 1; -pub(super) const STT_NOTYPE: u8 = 0; -pub(super) const STT_FUNC: u8 = 2; -pub(super) const STN_UNDEF: u32 = 0; -pub(super) const VER_FLG_BASE: u16 = 0x1; -pub(super) const VER_DEF_CURRENT: u16 = 1; -pub(super) const STV_DEFAULT: u8 = 0; -#[cfg(target_arch = "arm")] -pub(super) const EM_CURRENT: u16 = 40; // EM_ARM -#[cfg(target_arch = "x86")] -pub(super) const EM_CURRENT: u16 = 3; // EM_386 -#[cfg(target_arch = "powerpc64")] -pub(super) const EM_CURRENT: u16 = 21; // EM_PPC64 -#[cfg(any( - target_arch = "mips", - target_arch = "mips32r6", - target_arch = "mips64", - target_arch = "mips64r6" -))] -pub(super) const EM_CURRENT: u16 = 8; // EM_MIPS -#[cfg(target_arch = "x86_64")] -pub(super) const EM_CURRENT: u16 = 62; // EM_X86_64 -#[cfg(target_arch = "aarch64")] -pub(super) const EM_CURRENT: u16 = 183; // EM_AARCH64 -#[cfg(target_arch = "riscv64")] -pub(super) const EM_CURRENT: u16 = 243; // EM_RISCV - -#[inline] -pub(super) const fn ELF_ST_VISIBILITY(o: u8) -> u8 { - o & 0x03 -} - -#[inline] -pub(super) const fn ELF_ST_BIND(val: u8) -> u8 { - val >> 4 -} - -#[inline] -pub(super) const fn ELF_ST_TYPE(val: u8) -> u8 { - val & 0xf -} - -#[repr(C)] -pub(super) struct Elf_Ehdr { - pub(super) e_ident: [u8; EI_NIDENT], - pub(super) e_type: u16, - pub(super) e_machine: u16, - pub(super) e_version: u32, - pub(super) e_entry: usize, - pub(super) e_phoff: usize, - pub(super) e_shoff: usize, - pub(super) e_flags: u32, - pub(super) e_ehsize: u16, - pub(super) e_phentsize: u16, - pub(super) e_phnum: u16, - pub(super) e_shentsize: u16, - pub(super) e_shnum: u16, - pub(super) e_shstrndx: u16, -} - -#[cfg(target_pointer_width = "32")] -#[repr(C)] -pub(super) struct Elf_Phdr { - pub(super) p_type: u32, - pub(super) p_offset: usize, - pub(super) p_vaddr: usize, - pub(super) p_paddr: usize, - pub(super) p_filesz: usize, - pub(super) p_memsz: usize, - pub(super) p_flags: u32, - pub(super) p_align: usize, -} - -#[cfg(target_pointer_width = "64")] -#[repr(C)] -pub(super) struct Elf_Phdr { - pub(super) p_type: u32, - pub(super) p_flags: u32, - pub(super) p_offset: usize, - pub(super) p_vaddr: usize, - pub(super) p_paddr: usize, - pub(super) p_filesz: usize, - pub(super) p_memsz: usize, - pub(super) p_align: usize, -} - -#[cfg(target_pointer_width = "32")] -#[repr(C)] -pub(super) struct Elf_Sym { - pub(super) st_name: u32, - pub(super) st_value: usize, - pub(super) st_size: usize, - pub(super) st_info: u8, - pub(super) st_other: u8, - pub(super) st_shndx: u16, -} - -#[cfg(target_pointer_width = "64")] -#[repr(C)] -pub(super) struct Elf_Sym { - pub(super) st_name: u32, - pub(super) st_info: u8, - pub(super) st_other: u8, - pub(super) st_shndx: u16, - pub(super) st_value: usize, - pub(super) st_size: usize, -} - -#[repr(C)] -pub(super) struct Elf_Dyn { - pub(super) d_tag: i32, - pub(super) d_val: usize, -} - -#[repr(C)] -pub(super) struct Elf_Verdef { - pub(super) vd_version: u16, - pub(super) vd_flags: u16, - pub(super) vd_ndx: u16, - pub(super) vd_cnt: u16, - pub(super) vd_hash: u32, - pub(super) vd_aux: u32, - pub(super) vd_next: u32, -} - -#[repr(C)] -pub(super) struct Elf_Verdaux { - pub(super) vda_name: u32, - pub(super) _vda_next: u32, -} diff --git a/vendor/rustix/src/backend/linux_raw/event/epoll.rs b/vendor/rustix/src/backend/linux_raw/event/epoll.rs index 6577feb51..ecd48b784 100644 --- a/vendor/rustix/src/backend/linux_raw/event/epoll.rs +++ b/vendor/rustix/src/backend/linux_raw/event/epoll.rs @@ -92,6 +92,9 @@ bitflags! { pub struct CreateFlags: c::c_uint { /// `EPOLL_CLOEXEC` const CLOEXEC = linux_raw_sys::general::EPOLL_CLOEXEC; + + /// + const _ = !0; } } @@ -144,6 +147,9 @@ bitflags! { /// `EPOLLEXCLUSIVE` const EXCLUSIVE = linux_raw_sys::general::EPOLLEXCLUSIVE as u32; + + /// + const _ = !0; } } @@ -160,8 +166,8 @@ pub fn create(flags: CreateFlags) -> io::Result { /// `epoll_ctl(self, EPOLL_CTL_ADD, data, event)`—Adds an element to an /// epoll object. /// -/// This registers interest in any of the events set in `events` occurring -/// on the file descriptor associated with `data`. +/// This registers interest in any of the events set in `events` occurring on +/// the file descriptor associated with `data`. /// /// If [`delete`] is not called on the I/O source passed into this function /// before the I/O source is `close`d, then the `epoll` will act as if the I/O @@ -191,8 +197,8 @@ pub fn add( } } -/// `epoll_ctl(self, EPOLL_CTL_MOD, target, event)`—Modifies an element in -/// a given epoll object. +/// `epoll_ctl(self, EPOLL_CTL_MOD, target, event)`—Modifies an element in a +/// given epoll object. /// /// This sets the events of interest with `target` to `events`. #[doc(alias = "epoll_ctl")] @@ -218,8 +224,8 @@ pub fn modify( } } -/// `epoll_ctl(self, EPOLL_CTL_DEL, target, NULL)`—Removes an element in -/// a given epoll object. +/// `epoll_ctl(self, EPOLL_CTL_DEL, target, NULL)`—Removes an element in a +/// given epoll object. #[doc(alias = "epoll_ctl")] #[inline] pub fn delete(epoll: impl AsFd, source: impl AsFd) -> io::Result<()> { @@ -317,8 +323,8 @@ impl EventData { /// Return the value as a `u64`. /// - /// If the stored value was a pointer, the pointer is zero-extended to - /// a `u64`. + /// If the stored value was a pointer, the pointer is zero-extended to a + /// `u64`. #[inline] pub fn u64(self) -> u64 { unsafe { self.as_u64 } diff --git a/vendor/rustix/src/backend/linux_raw/event/mod.rs b/vendor/rustix/src/backend/linux_raw/event/mod.rs index 605de2538..4148a8c7f 100644 --- a/vendor/rustix/src/backend/linux_raw/event/mod.rs +++ b/vendor/rustix/src/backend/linux_raw/event/mod.rs @@ -1,3 +1,4 @@ +#[cfg(feature = "alloc")] pub mod epoll; pub(crate) mod poll_fd; pub(crate) mod syscalls; diff --git a/vendor/rustix/src/backend/linux_raw/event/poll_fd.rs b/vendor/rustix/src/backend/linux_raw/event/poll_fd.rs index 906efe0ef..c56c9152d 100644 --- a/vendor/rustix/src/backend/linux_raw/event/poll_fd.rs +++ b/vendor/rustix/src/backend/linux_raw/event/poll_fd.rs @@ -30,6 +30,9 @@ bitflags! { const NVAL = linux_raw_sys::general::POLLNVAL as u16; /// `POLLRDHUP` const RDHUP = linux_raw_sys::general::POLLRDHUP as u16; + + /// + const _ = !0; } } @@ -81,7 +84,7 @@ impl<'fd> PollFd<'fd> { /// Returns the ready events. #[inline] pub fn revents(&self) -> PollFlags { - // Use `unwrap()` here because in theory we know we know all the bits + // Use `.unwrap()` here because in theory we know we know all the bits // the OS might set here, but OS's have added extensions in the past. PollFlags::from_bits(self.revents).unwrap() } diff --git a/vendor/rustix/src/backend/linux_raw/event/syscalls.rs b/vendor/rustix/src/backend/linux_raw/event/syscalls.rs index 6d6b35d75..a8003b004 100644 --- a/vendor/rustix/src/backend/linux_raw/event/syscalls.rs +++ b/vendor/rustix/src/backend/linux_raw/event/syscalls.rs @@ -3,17 +3,20 @@ //! # Safety //! //! See the `rustix::backend` module documentation for details. -#![allow(unsafe_code)] -#![allow(clippy::undocumented_unsafe_blocks)] +#![allow(unsafe_code, clippy::undocumented_unsafe_blocks)] use crate::backend::c; -use crate::backend::conv::{ - by_ref, c_int, c_uint, pass_usize, raw_fd, ret, ret_owned_fd, ret_usize, slice_mut, zero, -}; -use crate::event::{epoll, EventfdFlags, PollFd}; -use crate::fd::{BorrowedFd, OwnedFd}; +use crate::backend::conv::{c_int, c_uint, ret_owned_fd, ret_usize, slice_mut}; +use crate::event::{EventfdFlags, PollFd}; +use crate::fd::OwnedFd; use crate::io; -use linux_raw_sys::general::{EPOLL_CTL_ADD, EPOLL_CTL_DEL, EPOLL_CTL_MOD}; +#[cfg(feature = "alloc")] +use { + crate::backend::conv::{by_ref, pass_usize, raw_fd, ret, zero}, + crate::event::epoll, + crate::fd::BorrowedFd, + linux_raw_sys::general::{EPOLL_CTL_ADD, EPOLL_CTL_DEL, EPOLL_CTL_MOD}, +}; #[cfg(any(target_arch = "aarch64", target_arch = "riscv64"))] use { crate::backend::conv::{opt_ref, size_of}, @@ -49,11 +52,13 @@ pub(crate) fn poll(fds: &mut [PollFd<'_>], timeout: c::c_int) -> io::Result io::Result { unsafe { ret_owned_fd(syscall_readonly!(__NR_epoll_create1, flags)) } } +#[cfg(feature = "alloc")] #[inline] pub(crate) unsafe fn epoll_add( epfd: BorrowedFd<'_>, @@ -69,6 +74,7 @@ pub(crate) unsafe fn epoll_add( )) } +#[cfg(feature = "alloc")] #[inline] pub(crate) unsafe fn epoll_mod( epfd: BorrowedFd<'_>, @@ -84,6 +90,7 @@ pub(crate) unsafe fn epoll_mod( )) } +#[cfg(feature = "alloc")] #[inline] pub(crate) unsafe fn epoll_del(epfd: BorrowedFd<'_>, fd: c::c_int) -> io::Result<()> { ret(syscall_readonly!( @@ -95,6 +102,7 @@ pub(crate) unsafe fn epoll_del(epfd: BorrowedFd<'_>, fd: c::c_int) -> io::Result )) } +#[cfg(feature = "alloc")] #[inline] pub(crate) fn epoll_wait( epfd: BorrowedFd<'_>, diff --git a/vendor/rustix/src/backend/linux_raw/event/types.rs b/vendor/rustix/src/backend/linux_raw/event/types.rs index e6273959c..3821f8f64 100644 --- a/vendor/rustix/src/backend/linux_raw/event/types.rs +++ b/vendor/rustix/src/backend/linux_raw/event/types.rs @@ -14,5 +14,8 @@ bitflags! { const NONBLOCK = linux_raw_sys::general::EFD_NONBLOCK; /// `EFD_SEMAPHORE` const SEMAPHORE = linux_raw_sys::general::EFD_SEMAPHORE; + + /// + const _ = !0; } } diff --git a/vendor/rustix/src/backend/linux_raw/fs/inotify.rs b/vendor/rustix/src/backend/linux_raw/fs/inotify.rs index cb9d87b82..ef205ffdf 100644 --- a/vendor/rustix/src/backend/linux_raw/fs/inotify.rs +++ b/vendor/rustix/src/backend/linux_raw/fs/inotify.rs @@ -17,6 +17,9 @@ bitflags! { const CLOEXEC = linux_raw_sys::general::IN_CLOEXEC; /// `IN_NONBLOCK` const NONBLOCK = linux_raw_sys::general::IN_NONBLOCK; + + /// + const _ = !0; } } @@ -71,6 +74,9 @@ bitflags! { const ONESHOT = linux_raw_sys::general::IN_ONESHOT; /// `IN_ONLYDIR` const ONLYDIR = linux_raw_sys::general::IN_ONLYDIR; + + /// + const _ = !0; } } @@ -99,14 +105,13 @@ pub fn inotify_add_watch( path: P, flags: WatchFlags, ) -> io::Result { - let path = path.as_cow_c_str().unwrap(); - syscalls::inotify_add_watch(inot, &path, flags) + path.into_with_c_str(|path| syscalls::inotify_add_watch(inot, path, flags)) } /// `inotify_rm_watch(self, wd)`—Removes a watch from this inotify /// -/// The watch descriptor provided should have previously been returned -/// by [`inotify_add_watch`] and not previously have been removed. +/// The watch descriptor provided should have previously been returned by +/// [`inotify_add_watch`] and not previously have been removed. #[doc(alias = "inotify_rm_watch")] #[inline] pub fn inotify_remove_watch(inot: BorrowedFd<'_>, wd: i32) -> io::Result<()> { diff --git a/vendor/rustix/src/backend/linux_raw/fs/mod.rs b/vendor/rustix/src/backend/linux_raw/fs/mod.rs index acf43ce4f..ba72c5b6d 100644 --- a/vendor/rustix/src/backend/linux_raw/fs/mod.rs +++ b/vendor/rustix/src/backend/linux_raw/fs/mod.rs @@ -1,5 +1,13 @@ +#[cfg(feature = "alloc")] pub(crate) mod dir; pub mod inotify; pub(crate) mod makedev; pub(crate) mod syscalls; pub(crate) mod types; + +// TODO: Fix linux-raw-sys to define ioctl codes for sparc. +#[cfg(all(linux_kernel, any(target_arch = "sparc", target_arch = "sparc64")))] +pub(crate) const EXT4_IOC_RESIZE_FS: u32 = 0x8008_6610; + +#[cfg(all(linux_kernel, not(any(target_arch = "sparc", target_arch = "sparc64"))))] +pub(crate) use linux_raw_sys::ioctl::EXT4_IOC_RESIZE_FS; diff --git a/vendor/rustix/src/backend/linux_raw/fs/syscalls.rs b/vendor/rustix/src/backend/linux_raw/fs/syscalls.rs index b3d4cd66c..e72afb8ab 100644 --- a/vendor/rustix/src/backend/linux_raw/fs/syscalls.rs +++ b/vendor/rustix/src/backend/linux_raw/fs/syscalls.rs @@ -32,15 +32,14 @@ use crate::fs::{ StatVfsMountFlags, StatxFlags, Timestamps, Uid, XattrFlags, }; use crate::io; -use core::mem::{transmute, zeroed, MaybeUninit}; +use core::mem::MaybeUninit; #[cfg(any(target_arch = "mips64", target_arch = "mips64r6"))] use linux_raw_sys::general::stat as linux_stat64; use linux_raw_sys::general::{ - __kernel_fsid_t, __kernel_timespec, open_how, statx, AT_EACCESS, AT_FDCWD, AT_REMOVEDIR, - AT_SYMLINK_NOFOLLOW, F_ADD_SEALS, F_GETFL, F_GET_SEALS, F_SETFL, SEEK_CUR, SEEK_DATA, SEEK_END, - SEEK_HOLE, SEEK_SET, STATX__RESERVED, + __kernel_fsid_t, open_how, statx, AT_EACCESS, AT_FDCWD, AT_REMOVEDIR, AT_SYMLINK_NOFOLLOW, + F_ADD_SEALS, F_GETFL, F_GET_SEALS, F_SETFL, SEEK_CUR, SEEK_DATA, SEEK_END, SEEK_HOLE, SEEK_SET, + STATX__RESERVED, }; -use linux_raw_sys::ioctl::{BLKPBSZGET, BLKSSZGET, EXT4_IOC_RESIZE_FS, FICLONE}; #[cfg(target_pointer_width = "32")] use { crate::backend::conv::{hi, lo, slice_just_addr}, @@ -159,6 +158,30 @@ pub(crate) fn chownat( } } +#[inline] +pub(crate) fn chown(path: &CStr, owner: Option, group: Option) -> io::Result<()> { + // Most architectures have a `chown` syscall. + #[cfg(not(any(target_arch = "aarch64", target_arch = "riscv64")))] + unsafe { + let (ow, gr) = crate::ugid::translate_fchown_args(owner, group); + ret(syscall_readonly!(__NR_chown, path, c_uint(ow), c_uint(gr))) + } + + // Aarch64 and RISC-V don't, so use `fchownat`. + #[cfg(any(target_arch = "aarch64", target_arch = "riscv64"))] + unsafe { + let (ow, gr) = crate::ugid::translate_fchown_args(owner, group); + ret(syscall_readonly!( + __NR_fchownat, + raw_fd(AT_FDCWD), + path, + c_uint(ow), + c_uint(gr), + zero() + )) + } +} + #[inline] pub(crate) fn fchown(fd: BorrowedFd<'_>, owner: Option, group: Option) -> io::Result<()> { unsafe { @@ -207,9 +230,7 @@ pub(crate) fn seek(fd: BorrowedFd<'_>, pos: SeekFrom) -> io::Result { } SeekFrom::End(offset) => (SEEK_END, offset), SeekFrom::Current(offset) => (SEEK_CUR, offset), - #[cfg(target_os = "linux")] SeekFrom::Data(offset) => (SEEK_DATA, offset), - #[cfg(target_os = "linux")] SeekFrom::Hole(offset) => (SEEK_HOLE, offset), }; _seek(fd, offset, whence) @@ -915,6 +936,7 @@ fn statfs_to_statvfs(statfs: StatFs) -> StatVfs { } } +#[cfg(feature = "alloc")] #[inline] pub(crate) fn readlink(path: &CStr, buf: &mut [u8]) -> io::Result { let (buf_addr_mut, buf_len) = slice_mut(buf); @@ -929,6 +951,7 @@ pub(crate) fn readlink(path: &CStr, buf: &mut [u8]) -> io::Result { } } +#[cfg(feature = "alloc")] #[inline] pub(crate) fn readlinkat( dirfd: BorrowedFd<'_>, @@ -1028,38 +1051,37 @@ pub(crate) fn fcntl_lock(fd: BorrowedFd<'_>, operation: FlockOperation) -> io::R FlockOperation::NonBlockingUnlock => (F_SETLK, F_UNLCK), }; - unsafe { - let lock = flock { - l_type: l_type as _, + let lock = flock { + l_type: l_type as _, - // When `l_len` is zero, this locks all the bytes from - // `l_whence`/`l_start` to the end of the file, even as the - // file grows dynamically. - l_whence: SEEK_SET as _, - l_start: 0, - l_len: 0, + // When `l_len` is zero, this locks all the bytes from + // `l_whence`/`l_start` to the end of the file, even as the + // file grows dynamically. + l_whence: SEEK_SET as _, + l_start: 0, + l_len: 0, - ..zeroed() - }; + // Unused. + l_pid: 0, + }; - #[cfg(target_pointer_width = "32")] - { - ret(syscall_readonly!( - __NR_fcntl64, - fd, - c_uint(cmd), - by_ref(&lock) - )) - } - #[cfg(target_pointer_width = "64")] - { - ret(syscall_readonly!( - __NR_fcntl, - fd, - c_uint(cmd), - by_ref(&lock) - )) - } + #[cfg(target_pointer_width = "32")] + unsafe { + ret(syscall_readonly!( + __NR_fcntl64, + fd, + c_uint(cmd), + by_ref(&lock) + )) + } + #[cfg(target_pointer_width = "64")] + unsafe { + ret(syscall_readonly!( + __NR_fcntl, + fd, + c_uint(cmd), + by_ref(&lock) + )) } } @@ -1235,6 +1257,7 @@ pub(crate) fn mkdirat(dirfd: BorrowedFd<'_>, path: &CStr, mode: Mode) -> io::Res unsafe { ret(syscall_readonly!(__NR_mkdirat, dirfd, path, mode)) } } +#[cfg(feature = "alloc")] #[inline] pub(crate) fn getdents(fd: BorrowedFd<'_>, dirent: &mut [u8]) -> io::Result { let (dirent_addr_mut, dirent_len) = slice_mut(dirent); @@ -1269,9 +1292,6 @@ fn _utimensat( times: &Timestamps, flags: AtFlags, ) -> io::Result<()> { - // Assert that `Timestamps` has the expected layout. - let _ = unsafe { transmute::(times.clone()) }; - // `utimensat_time64` was introduced in Linux 5.1. The old `utimensat` // syscall is not y2038-compatible on 32-bit architectures. #[cfg(target_pointer_width = "32")] @@ -1626,37 +1646,10 @@ pub(crate) fn fremovexattr(fd: BorrowedFd<'_>, name: &CStr) -> io::Result<()> { unsafe { ret(syscall_readonly!(__NR_fremovexattr, fd, name)) } } -#[inline] -pub(crate) fn ioctl_blksszget(fd: BorrowedFd) -> io::Result { - let mut result = MaybeUninit::::uninit(); - unsafe { - ret(syscall!(__NR_ioctl, fd, c_uint(BLKSSZGET), &mut result))?; - Ok(result.assume_init() as u32) - } -} - -#[inline] -pub(crate) fn ioctl_blkpbszget(fd: BorrowedFd) -> io::Result { - let mut result = MaybeUninit::::uninit(); - unsafe { - ret(syscall!(__NR_ioctl, fd, c_uint(BLKPBSZGET), &mut result))?; - Ok(result.assume_init() as u32) - } -} - -#[inline] -pub(crate) fn ioctl_ficlone(fd: BorrowedFd<'_>, src_fd: BorrowedFd<'_>) -> io::Result<()> { - unsafe { ret(syscall_readonly!(__NR_ioctl, fd, c_uint(FICLONE), src_fd)) } -} +#[test] +fn test_sizes() { + assert_eq_size!(linux_raw_sys::general::__kernel_loff_t, u64); -#[inline] -pub(crate) fn ext4_ioc_resize_fs(fd: BorrowedFd<'_>, blocks: u64) -> io::Result<()> { - unsafe { - ret(syscall_readonly!( - __NR_ioctl, - fd, - c_uint(EXT4_IOC_RESIZE_FS), - by_ref(&blocks) - )) - } + // Assert that `Timestamps` has the expected layout. + assert_eq_size!([linux_raw_sys::general::__kernel_timespec; 2], Timestamps); } diff --git a/vendor/rustix/src/backend/linux_raw/fs/types.rs b/vendor/rustix/src/backend/linux_raw/fs/types.rs index e18dc0b4d..6e2e14f1e 100644 --- a/vendor/rustix/src/backend/linux_raw/fs/types.rs +++ b/vendor/rustix/src/backend/linux_raw/fs/types.rs @@ -19,6 +19,9 @@ bitflags! { /// `F_OK` const EXISTS = linux_raw_sys::general::F_OK; + + /// + const _ = !0; } } @@ -57,6 +60,9 @@ bitflags! { /// `AT_STATX_DONT_SYNC` const STATX_DONT_SYNC = linux_raw_sys::general::AT_STATX_DONT_SYNC; + + /// + const _ = !0; } } @@ -113,6 +119,9 @@ bitflags! { /// `S_ISVTX` const SVTX = linux_raw_sys::general::S_ISVTX; + + /// + const _ = !0; } } @@ -210,6 +219,8 @@ bitflags! { const WRONLY = linux_raw_sys::general::O_WRONLY; /// `O_RDWR` + /// + /// This is not equal to `RDONLY | WRONLY`. It's a distinct flag. const RDWR = linux_raw_sys::general::O_RDWR; /// `O_NOCTTY` @@ -238,6 +249,9 @@ bitflags! { /// `O_DIRECT` const DIRECT = linux_raw_sys::general::O_DIRECT; + + /// + const _ = !0; } } @@ -265,6 +279,9 @@ bitflags! { /// `RESOLVE_CACHED` (since Linux 5.12) const CACHED = linux_raw_sys::general::RESOLVE_CACHED as u64; + + /// + const _ = !0; } } @@ -283,6 +300,9 @@ bitflags! { /// `RENAME_WHITEOUT` const WHITEOUT = linux_raw_sys::general::RENAME_WHITEOUT; + + /// + const _ = !0; } } @@ -432,6 +452,9 @@ bitflags! { const HUGE_2GB = linux_raw_sys::general::MFD_HUGE_2GB; /// `MFD_HUGE_16GB` const HUGE_16GB = linux_raw_sys::general::MFD_HUGE_16GB; + + /// + const _ = !0; } } @@ -444,16 +467,19 @@ bitflags! { #[repr(transparent)] #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] pub struct SealFlags: u32 { - /// `F_SEAL_SEAL`. - const SEAL = linux_raw_sys::general::F_SEAL_SEAL; - /// `F_SEAL_SHRINK`. - const SHRINK = linux_raw_sys::general::F_SEAL_SHRINK; - /// `F_SEAL_GROW`. - const GROW = linux_raw_sys::general::F_SEAL_GROW; - /// `F_SEAL_WRITE`. - const WRITE = linux_raw_sys::general::F_SEAL_WRITE; - /// `F_SEAL_FUTURE_WRITE` (since Linux 5.1) - const FUTURE_WRITE = linux_raw_sys::general::F_SEAL_FUTURE_WRITE; + /// `F_SEAL_SEAL`. + const SEAL = linux_raw_sys::general::F_SEAL_SEAL; + /// `F_SEAL_SHRINK`. + const SHRINK = linux_raw_sys::general::F_SEAL_SHRINK; + /// `F_SEAL_GROW`. + const GROW = linux_raw_sys::general::F_SEAL_GROW; + /// `F_SEAL_WRITE`. + const WRITE = linux_raw_sys::general::F_SEAL_WRITE; + /// `F_SEAL_FUTURE_WRITE` (since Linux 5.1) + const FUTURE_WRITE = linux_raw_sys::general::F_SEAL_FUTURE_WRITE; + + /// + const _ = !0; } } @@ -511,6 +537,9 @@ bitflags! { /// `STATX_ALL` const ALL = linux_raw_sys::general::STATX_ALL; + + /// + const _ = !0; } } @@ -535,6 +564,9 @@ bitflags! { const INSERT_RANGE = linux_raw_sys::general::FALLOC_FL_INSERT_RANGE; /// `FALLOC_FL_UNSHARE_RANGE` const UNSHARE_RANGE = linux_raw_sys::general::FALLOC_FL_UNSHARE_RANGE; + + /// + const _ = !0; } } @@ -569,6 +601,9 @@ bitflags! { /// `ST_SYNCHRONOUS` const SYNCHRONOUS = linux_raw_sys::general::MS_SYNCHRONOUS as u64; + + /// + const _ = !0; } } diff --git a/vendor/rustix/src/backend/linux_raw/io/errno.rs b/vendor/rustix/src/backend/linux_raw/io/errno.rs index af057e2da..7730a7237 100644 --- a/vendor/rustix/src/backend/linux_raw/io/errno.rs +++ b/vendor/rustix/src/backend/linux_raw/io/errno.rs @@ -16,10 +16,32 @@ use crate::backend::reg::{RetNumber, RetReg}; use crate::io; use linux_raw_sys::errno; -/// The error type for `rustix` APIs. +/// `errno`—An error code. /// -/// This is similar to `std::io::Error`, but only holds an OS error code, -/// and no extra error value. +/// The error type for `rustix` APIs. This is similar to [`std::io::Error`], +/// but only holds an OS error code, and no extra error value. +/// +/// # References +/// - [POSIX] +/// - [Linux] +/// - [Winsock2] +/// - [FreeBSD] +/// - [NetBSD] +/// - [OpenBSD] +/// - [DragonFly BSD] +/// - [illumos] +/// - [glibc] +/// +/// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/errno.html +/// [Linux]: https://man7.org/linux/man-pages/man3/errno.3.html +/// [Winsock2]: https://learn.microsoft.com/en-us/windows/win32/winsock/windows-sockets-error-codes-2 +/// [FreeBSD]: https://man.freebsd.org/cgi/man.cgi?errno +/// [NetBSD]: https://man.netbsd.org/errno.2 +/// [OpenBSD]: https://man.openbsd.org/errno.2 +/// [DragonFly BSD]: https://man.dragonflybsd.org/?command=errno§ion=2 +/// [illumos]: https://illumos.org/man/3C/errno +/// [glibc]: https://www.gnu.org/software/libc/manual/html_node/Error-Codes.html +/// [`std::io::Error`]: Result #[repr(transparent)] #[doc(alias = "errno")] #[derive(Eq, PartialEq, Hash, Copy, Clone)] diff --git a/vendor/rustix/src/backend/linux_raw/io/syscalls.rs b/vendor/rustix/src/backend/linux_raw/io/syscalls.rs index 88eed3d72..d2cbba0c3 100644 --- a/vendor/rustix/src/backend/linux_raw/io/syscalls.rs +++ b/vendor/rustix/src/backend/linux_raw/io/syscalls.rs @@ -10,16 +10,11 @@ use crate::backend::conv::loff_t_from_u64; #[cfg(all( target_pointer_width = "32", - any( - target_arch = "arm", - target_arch = "mips", - target_arch = "mips32r6", - target_arch = "power" - ), + any(target_arch = "arm", target_arch = "mips", target_arch = "mips32r6"), ))] use crate::backend::conv::zero; use crate::backend::conv::{ - by_ref, c_uint, raw_fd, ret, ret_c_uint, ret_discarded_fd, ret_owned_fd, ret_usize, slice, + c_uint, raw_fd, ret, ret_c_int, ret_c_uint, ret_discarded_fd, ret_owned_fd, ret_usize, slice, slice_mut, }; #[cfg(target_pointer_width = "32")] @@ -27,12 +22,11 @@ use crate::backend::conv::{hi, lo}; use crate::backend::{c, MAX_IOV}; use crate::fd::{AsFd, BorrowedFd, OwnedFd, RawFd}; use crate::io::{self, DupFlags, FdFlags, IoSlice, IoSliceMut, ReadWriteFlags}; +use crate::ioctl::{IoctlOutput, RawOpcode}; #[cfg(all(feature = "fs", feature = "net"))] use crate::net::{RecvFlags, SendFlags}; use core::cmp; -use core::mem::MaybeUninit; use linux_raw_sys::general::{F_DUPFD_CLOEXEC, F_GETFD, F_SETFD}; -use linux_raw_sys::ioctl::{FIONBIO, FIONREAD}; #[inline] pub(crate) fn read(fd: BorrowedFd<'_>, buf: &mut [u8]) -> io::Result { @@ -48,12 +42,7 @@ pub(crate) fn pread(fd: BorrowedFd<'_>, buf: &mut [u8], pos: u64) -> io::Result< // #[cfg(all( target_pointer_width = "32", - any( - target_arch = "arm", - target_arch = "mips", - target_arch = "mips32r6", - target_arch = "power" - ), + any(target_arch = "arm", target_arch = "mips", target_arch = "mips32r6"), ))] unsafe { ret_usize(syscall!( @@ -68,12 +57,7 @@ pub(crate) fn pread(fd: BorrowedFd<'_>, buf: &mut [u8], pos: u64) -> io::Result< } #[cfg(all( target_pointer_width = "32", - not(any( - target_arch = "arm", - target_arch = "mips", - target_arch = "mips32r6", - target_arch = "power" - )), + not(any(target_arch = "arm", target_arch = "mips", target_arch = "mips32r6")), ))] unsafe { ret_usize(syscall!( @@ -183,12 +167,7 @@ pub(crate) fn pwrite(fd: BorrowedFd<'_>, buf: &[u8], pos: u64) -> io::Result #[cfg(all( target_pointer_width = "32", - any( - target_arch = "arm", - target_arch = "mips", - target_arch = "mips32r6", - target_arch = "power" - ), + any(target_arch = "arm", target_arch = "mips", target_arch = "mips32r6"), ))] unsafe { ret_usize(syscall_readonly!( @@ -203,12 +182,7 @@ pub(crate) fn pwrite(fd: BorrowedFd<'_>, buf: &[u8], pos: u64) -> io::Result) -> io::Result { - unsafe { - let mut result = MaybeUninit::::uninit(); - ret(syscall!(__NR_ioctl, fd, c_uint(FIONREAD), &mut result))?; - Ok(result.assume_init() as u64) - } +pub(crate) unsafe fn ioctl( + fd: BorrowedFd<'_>, + request: RawOpcode, + arg: *mut c::c_void, +) -> io::Result { + ret_c_int(syscall!(__NR_ioctl, fd, c_uint(request), arg)) } #[inline] -pub(crate) fn ioctl_fionbio(fd: BorrowedFd<'_>, value: bool) -> io::Result<()> { - unsafe { - let data = c::c_int::from(value); - ret(syscall_readonly!( - __NR_ioctl, - fd, - c_uint(FIONBIO), - by_ref(&data) - )) - } +pub(crate) unsafe fn ioctl_readonly( + fd: BorrowedFd<'_>, + request: RawOpcode, + arg: *mut c::c_void, +) -> io::Result { + ret_c_int(syscall_readonly!(__NR_ioctl, fd, c_uint(request), arg)) } #[cfg(all(feature = "fs", feature = "net"))] @@ -376,6 +346,7 @@ pub(crate) fn dup(fd: BorrowedFd<'_>) -> io::Result { unsafe { ret_owned_fd(syscall_readonly!(__NR_dup, fd)) } } +#[allow(clippy::needless_pass_by_ref_mut)] #[inline] pub(crate) fn dup2(fd: BorrowedFd<'_>, new: &mut OwnedFd) -> io::Result<()> { #[cfg(any(target_arch = "aarch64", target_arch = "riscv64"))] @@ -392,6 +363,7 @@ pub(crate) fn dup2(fd: BorrowedFd<'_>, new: &mut OwnedFd) -> io::Result<()> { } } +#[allow(clippy::needless_pass_by_ref_mut)] #[inline] pub(crate) fn dup3(fd: BorrowedFd<'_>, new: &mut OwnedFd, flags: DupFlags) -> io::Result<()> { unsafe { ret_discarded_fd(syscall_readonly!(__NR_dup3, fd, new.as_fd(), flags)) } diff --git a/vendor/rustix/src/backend/linux_raw/io/types.rs b/vendor/rustix/src/backend/linux_raw/io/types.rs index c06134440..fb7e913a0 100644 --- a/vendor/rustix/src/backend/linux_raw/io/types.rs +++ b/vendor/rustix/src/backend/linux_raw/io/types.rs @@ -11,6 +11,9 @@ bitflags! { pub struct FdFlags: c::c_uint { /// `FD_CLOEXEC` const CLOEXEC = linux_raw_sys::general::FD_CLOEXEC; + + /// + const _ = !0; } } @@ -32,6 +35,9 @@ bitflags! { const NOWAIT = linux_raw_sys::general::RWF_NOWAIT; /// `RWF_APPEND` (since Linux 4.16) const APPEND = linux_raw_sys::general::RWF_APPEND; + + /// + const _ = !0; } } @@ -44,5 +50,8 @@ bitflags! { pub struct DupFlags: c::c_uint { /// `O_CLOEXEC` const CLOEXEC = linux_raw_sys::general::O_CLOEXEC; + + /// + const _ = !0; } } diff --git a/vendor/rustix/src/backend/linux_raw/io_uring/syscalls.rs b/vendor/rustix/src/backend/linux_raw/io_uring/syscalls.rs index 90c82c129..d10cd1395 100644 --- a/vendor/rustix/src/backend/linux_raw/io_uring/syscalls.rs +++ b/vendor/rustix/src/backend/linux_raw/io_uring/syscalls.rs @@ -3,8 +3,7 @@ //! # Safety //! //! See the `rustix::backend::syscalls` module documentation for details. -#![allow(unsafe_code)] -#![allow(clippy::undocumented_unsafe_blocks)] +#![allow(unsafe_code, clippy::undocumented_unsafe_blocks)] use crate::backend::conv::{by_mut, c_uint, pass_usize, ret_c_uint, ret_owned_fd}; use crate::fd::{BorrowedFd, OwnedFd}; diff --git a/vendor/rustix/src/backend/linux_raw/mm/types.rs b/vendor/rustix/src/backend/linux_raw/mm/types.rs index 2d5eebc58..0dfb41050 100644 --- a/vendor/rustix/src/backend/linux_raw/mm/types.rs +++ b/vendor/rustix/src/backend/linux_raw/mm/types.rs @@ -16,6 +16,9 @@ bitflags! { const WRITE = linux_raw_sys::general::PROT_WRITE; /// `PROT_EXEC` const EXEC = linux_raw_sys::general::PROT_EXEC; + + /// + const _ = !0; } } @@ -52,6 +55,9 @@ bitflags! { /// `PROT_ADI` #[cfg(any(target_arch = "sparc", target_arch = "sparc64"))] const ADI = linux_raw_sys::general::PROT_ADI; + + /// + const _ = !0; } } @@ -99,6 +105,9 @@ bitflags! { /// `MAP_UNINITIALIZED` #[cfg(not(any(target_arch = "mips", target_arch = "mips32r6", target_arch = "mips64", target_arch = "mips64r6")))] const UNINITIALIZED = linux_raw_sys::general::MAP_UNINITIALIZED; + + /// + const _ = !0; } } @@ -116,6 +125,9 @@ bitflags! { const MAYMOVE = linux_raw_sys::general::MREMAP_MAYMOVE; /// `MREMAP_DONTUNMAP` (since Linux 5.7) const DONTUNMAP = linux_raw_sys::general::MREMAP_DONTUNMAP; + + /// + const _ = !0; } } @@ -135,6 +147,9 @@ bitflags! { /// file (so that they can be updated with the fresh values just /// written). const INVALIDATE = linux_raw_sys::general::MS_INVALIDATE; + + /// + const _ = !0; } } @@ -147,6 +162,9 @@ bitflags! { pub struct MlockFlags: u32 { /// `MLOCK_ONFAULT` const ONFAULT = linux_raw_sys::general::MLOCK_ONFAULT; + + /// + const _ = !0; } } @@ -239,5 +257,8 @@ bitflags! { const CLOEXEC = linux_raw_sys::general::O_CLOEXEC; /// `O_NONBLOCK` const NONBLOCK = linux_raw_sys::general::O_NONBLOCK; + + /// + const _ = !0; } } diff --git a/vendor/rustix/src/backend/linux_raw/mod.rs b/vendor/rustix/src/backend/linux_raw/mod.rs index c3018930f..9a07467f4 100644 --- a/vendor/rustix/src/backend/linux_raw/mod.rs +++ b/vendor/rustix/src/backend/linux_raw/mod.rs @@ -17,13 +17,6 @@ #[macro_use] mod arch; mod conv; -#[cfg(any( - feature = "param", - feature = "runtime", - feature = "time", - target_arch = "x86" -))] -mod elf; mod reg; #[cfg(any(feature = "time", target_arch = "x86"))] mod vdso; @@ -36,7 +29,7 @@ pub(crate) mod event; feature = "fs", all( not(feature = "use-libc-auxv"), - not(target_vendor = "mustang"), + not(feature = "use-explicitly-provided-auxv"), any( feature = "param", feature = "runtime", @@ -104,7 +97,7 @@ pub(crate) mod prctl; feature = "thread", all( not(feature = "use-libc-auxv"), - not(target_vendor = "mustang"), + not(feature = "use-explicitly-provided-auxv"), any( feature = "param", feature = "runtime", diff --git a/vendor/rustix/src/backend/linux_raw/mount/types.rs b/vendor/rustix/src/backend/linux_raw/mount/types.rs index 808710c13..221f8f315 100644 --- a/vendor/rustix/src/backend/linux_raw/mount/types.rs +++ b/vendor/rustix/src/backend/linux_raw/mount/types.rs @@ -56,6 +56,9 @@ bitflags! { /// `MS_NOSYMFOLLOW` const NOSYMFOLLOW = linux_raw_sys::general::MS_NOSYMFOLLOW; + + /// + const _ = !0; } } @@ -74,6 +77,9 @@ bitflags! { const EXPIRE = linux_raw_sys::general::MNT_EXPIRE; /// `UMOUNT_NOFOLLOW` const NOFOLLOW = linux_raw_sys::general::UMOUNT_NOFOLLOW; + + /// + const _ = !0; } } @@ -85,9 +91,11 @@ bitflags! { #[repr(transparent)] #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] pub struct FsOpenFlags: c::c_uint { - /// `FSOPEN_CLOEXEC` const FSOPEN_CLOEXEC = linux_raw_sys::general::FSOPEN_CLOEXEC; + + /// + const _ = !0; } } @@ -101,6 +109,9 @@ bitflags! { pub struct FsMountFlags: c::c_uint { /// `FSMOUNT_CLOEXEC` const FSMOUNT_CLOEXEC = linux_raw_sys::general::FSMOUNT_CLOEXEC; + + /// + const _ = !0; } } @@ -177,6 +188,9 @@ bitflags! { /// `MOUNT_ATTR__ATIME_FLAGS` const MOUNT_ATTR_SIZE_VER0 = linux_raw_sys::general::MOUNT_ATTR_SIZE_VER0; + + /// + const _ = !0; } } @@ -215,6 +229,9 @@ bitflags! { /// `MOVE_MOUNT__MASK` const MOVE_MOUNT__MASK = linux_raw_sys::general::MOVE_MOUNT__MASK; + + /// + const _ = !0; } } @@ -243,6 +260,9 @@ bitflags! { /// `AT_SYMLINK_NOFOLLOW` const AT_SYMLINK_NOFOLLOW = linux_raw_sys::general::AT_SYMLINK_NOFOLLOW; + + /// + const _ = !0; } } @@ -265,6 +285,9 @@ bitflags! { /// `FSPICK_EMPTY_PATH` const FSPICK_EMPTY_PATH = linux_raw_sys::general::FSPICK_EMPTY_PATH; + + /// + const _ = !0; } } @@ -287,6 +310,9 @@ bitflags! { const UNBINDABLE = linux_raw_sys::general::MS_UNBINDABLE; /// `MS_REC` const REC = linux_raw_sys::general::MS_REC; + + /// + const _ = !0; } } @@ -296,6 +322,9 @@ bitflags! { pub(crate) struct InternalMountFlags: c::c_uint { const REMOUNT = linux_raw_sys::general::MS_REMOUNT; const MOVE = linux_raw_sys::general::MS_MOVE; + + /// + const _ = !0; } } diff --git a/vendor/rustix/src/backend/linux_raw/net/addr.rs b/vendor/rustix/src/backend/linux_raw/net/addr.rs index 4a203ed16..e6b307a16 100644 --- a/vendor/rustix/src/backend/linux_raw/net/addr.rs +++ b/vendor/rustix/src/backend/linux_raw/net/addr.rs @@ -117,9 +117,7 @@ impl Eq for SocketAddrUnix {} impl PartialOrd for SocketAddrUnix { #[inline] fn partial_cmp(&self, other: &Self) -> Option { - let self_len = self.len() - offsetof_sun_path(); - let other_len = other.len() - offsetof_sun_path(); - self.unix.sun_path[..self_len].partial_cmp(&other.unix.sun_path[..other_len]) + Some(self.cmp(other)) } } diff --git a/vendor/rustix/src/backend/linux_raw/net/msghdr.rs b/vendor/rustix/src/backend/linux_raw/net/msghdr.rs index 3c435bcfa..659093920 100644 --- a/vendor/rustix/src/backend/linux_raw/net/msghdr.rs +++ b/vendor/rustix/src/backend/linux_raw/net/msghdr.rs @@ -12,7 +12,7 @@ use crate::io::{self, IoSlice, IoSliceMut}; use crate::net::{RecvAncillaryBuffer, SendAncillaryBuffer, SocketAddrV4, SocketAddrV6}; use crate::utils::as_ptr; -use core::mem::{size_of, zeroed, MaybeUninit}; +use core::mem::{size_of, MaybeUninit}; use core::ptr::null_mut; fn msg_iov_len(len: usize) -> c::size_t { @@ -42,9 +42,7 @@ pub(crate) fn with_recv_msghdr( msg_iovlen: msg_iov_len(iov.len()), msg_control: control.as_control_ptr().cast(), msg_controllen: msg_control_len(control.control_len()), - - // Zero-initialize any padding bytes. - ..unsafe { zeroed() } + msg_flags: 0, }; let res = f(&mut msghdr); @@ -72,9 +70,7 @@ pub(crate) fn with_noaddr_msghdr( msg_iovlen: msg_iov_len(iov.len()), msg_control: control.as_control_ptr().cast(), msg_controllen: msg_control_len(control.control_len()), - - // Zero-initialize any padding bytes. - ..unsafe { zeroed() } + msg_flags: 0, }) } @@ -85,7 +81,7 @@ pub(crate) fn with_v4_msghdr( control: &mut SendAncillaryBuffer<'_, '_, '_>, f: impl FnOnce(c::msghdr) -> R, ) -> R { - let encoded = unsafe { encode_sockaddr_v4(addr) }; + let encoded = encode_sockaddr_v4(addr); f(c::msghdr { msg_name: as_ptr(&encoded) as _, @@ -94,9 +90,7 @@ pub(crate) fn with_v4_msghdr( msg_iovlen: msg_iov_len(iov.len()), msg_control: control.as_control_ptr().cast(), msg_controllen: msg_control_len(control.control_len()), - - // Zero-initialize any padding bytes. - ..unsafe { zeroed() } + msg_flags: 0, }) } @@ -107,7 +101,7 @@ pub(crate) fn with_v6_msghdr( control: &mut SendAncillaryBuffer<'_, '_, '_>, f: impl FnOnce(c::msghdr) -> R, ) -> R { - let encoded = unsafe { encode_sockaddr_v6(addr) }; + let encoded = encode_sockaddr_v6(addr); f(c::msghdr { msg_name: as_ptr(&encoded) as _, @@ -116,9 +110,7 @@ pub(crate) fn with_v6_msghdr( msg_iovlen: msg_iov_len(iov.len()), msg_control: control.as_control_ptr().cast(), msg_controllen: msg_control_len(control.control_len()), - - // Zero-initialize any padding bytes. - ..unsafe { zeroed() } + msg_flags: 0, }) } @@ -136,8 +128,19 @@ pub(crate) fn with_unix_msghdr( msg_iovlen: msg_iov_len(iov.len()), msg_control: control.as_control_ptr().cast(), msg_controllen: msg_control_len(control.control_len()), - - // Zero-initialize any padding bytes. - ..unsafe { zeroed() } + msg_flags: 0, }) } + +/// Create a zero-initialized message header struct value. +pub(crate) fn zero_msghdr() -> c::msghdr { + c::msghdr { + msg_name: null_mut(), + msg_namelen: 0, + msg_iov: null_mut(), + msg_iovlen: 0, + msg_control: null_mut(), + msg_controllen: 0, + msg_flags: 0, + } +} diff --git a/vendor/rustix/src/backend/linux_raw/net/send_recv.rs b/vendor/rustix/src/backend/linux_raw/net/send_recv.rs index 6e39a13aa..43b35341a 100644 --- a/vendor/rustix/src/backend/linux_raw/net/send_recv.rs +++ b/vendor/rustix/src/backend/linux_raw/net/send_recv.rs @@ -23,6 +23,9 @@ bitflags! { const NOSIGNAL = c::MSG_NOSIGNAL; /// `MSG_OOB` const OOB = c::MSG_OOB; + + /// + const _ = !0; } } @@ -48,5 +51,8 @@ bitflags! { const TRUNC = c::MSG_TRUNC; /// `MSG_WAITALL` const WAITALL = c::MSG_WAITALL; + + /// + const _ = !0; } } diff --git a/vendor/rustix/src/backend/linux_raw/net/syscalls.rs b/vendor/rustix/src/backend/linux_raw/net/syscalls.rs index df35e63c8..e5ebcc1dd 100644 --- a/vendor/rustix/src/backend/linux_raw/net/syscalls.rs +++ b/vendor/rustix/src/backend/linux_raw/net/syscalls.rs @@ -3,8 +3,7 @@ //! # Safety //! //! See the `rustix::backend` module documentation for details. -#![allow(unsafe_code)] -#![allow(clippy::undocumented_unsafe_blocks)] +#![allow(unsafe_code, clippy::undocumented_unsafe_blocks)] use super::msghdr::{ with_noaddr_msghdr, with_recv_msghdr, with_unix_msghdr, with_v4_msghdr, with_v6_msghdr, @@ -51,7 +50,7 @@ pub(crate) fn socket( ret_owned_fd(syscall_readonly!( __NR_socketcall, x86_sys(SYS_SOCKET), - slice_just_addr::, _>(&[ + slice_just_addr::, _>(&[ family.into(), type_.into(), protocol.into(), @@ -81,7 +80,7 @@ pub(crate) fn socket_with( ret_owned_fd(syscall_readonly!( __NR_socketcall, x86_sys(SYS_SOCKET), - slice_just_addr::, _>(&[ + slice_just_addr::, _>(&[ family.into(), (type_, flags).into(), protocol.into(), @@ -116,7 +115,7 @@ pub(crate) fn socketpair( ret(syscall!( __NR_socketcall, x86_sys(SYS_SOCKETPAIR), - slice_just_addr::, _>(&[ + slice_just_addr::, _>(&[ family.into(), (type_, flags).into(), protocol.into(), @@ -140,7 +139,7 @@ pub(crate) fn accept(fd: BorrowedFd<'_>) -> io::Result { let fd = ret_owned_fd(syscall_readonly!( __NR_socketcall, x86_sys(SYS_ACCEPT), - slice_just_addr::, _>(&[fd.into(), zero(), zero()]) + slice_just_addr::, _>(&[fd.into(), zero(), zero()]) ))?; Ok(fd) } @@ -158,7 +157,7 @@ pub(crate) fn accept_with(fd: BorrowedFd<'_>, flags: SocketFlags) -> io::Result< let fd = ret_owned_fd(syscall_readonly!( __NR_socketcall, x86_sys(SYS_ACCEPT4), - slice_just_addr::, _>(&[fd.into(), zero(), zero(), flags.into()]) + slice_just_addr::, _>(&[fd.into(), zero(), zero(), flags.into()]) ))?; Ok(fd) } @@ -188,7 +187,7 @@ pub(crate) fn acceptfrom(fd: BorrowedFd<'_>) -> io::Result<(OwnedFd, Option, _>(&[ + slice_just_addr::, _>(&[ fd.into(), (&mut storage).into(), by_mut(&mut addrlen), @@ -229,7 +228,7 @@ pub(crate) fn acceptfrom_with( let fd = ret_owned_fd(syscall!( __NR_socketcall, x86_sys(SYS_ACCEPT4), - slice_just_addr::, _>(&[ + slice_just_addr::, _>(&[ fd.into(), (&mut storage).into(), by_mut(&mut addrlen), @@ -262,7 +261,7 @@ pub(crate) fn recvmsg( ret_usize(syscall!( __NR_socketcall, x86_sys(SYS_RECVMSG), - slice_just_addr::, _>(&[ + slice_just_addr::, _>(&[ sockfd.into(), by_mut(msghdr), msg_flags.into(), @@ -301,7 +300,7 @@ pub(crate) fn sendmsg( ret_usize(syscall!( __NR_socketcall, x86_sys(SYS_SENDMSG), - slice_just_addr::, _>(&[ + slice_just_addr::, _>(&[ sockfd.into(), by_ref(&msghdr), msg_flags.into() @@ -331,7 +330,7 @@ pub(crate) fn sendmsg_v4( ret_usize(syscall!( __NR_socketcall, x86_sys(SYS_SENDMSG), - slice_just_addr::, _>(&[ + slice_just_addr::, _>(&[ sockfd.into(), by_ref(&msghdr), msg_flags.into(), @@ -361,7 +360,7 @@ pub(crate) fn sendmsg_v6( ret_usize(syscall!( __NR_socketcall, x86_sys(SYS_SENDMSG), - slice_just_addr::, _>(&[ + slice_just_addr::, _>(&[ sockfd.into(), by_ref(&msghdr), msg_flags.into() @@ -391,7 +390,7 @@ pub(crate) fn sendmsg_unix( ret_usize(syscall!( __NR_socketcall, x86_sys(SYS_SENDMSG), - slice_just_addr::, _>(&[ + slice_just_addr::, _>(&[ sockfd.into(), by_ref(&msghdr), msg_flags.into() @@ -418,7 +417,7 @@ pub(crate) fn shutdown(fd: BorrowedFd<'_>, how: Shutdown) -> io::Result<()> { ret(syscall_readonly!( __NR_socketcall, x86_sys(SYS_SHUTDOWN), - slice_just_addr::, _>(&[fd.into(), c_uint(how as c::c_uint)]) + slice_just_addr::, _>(&[fd.into(), c_uint(how as c::c_uint)]) )) } } @@ -461,7 +460,12 @@ pub(crate) fn send(fd: BorrowedFd<'_>, buf: &[u8], flags: SendFlags) -> io::Resu ret_usize(syscall_readonly!( __NR_socketcall, x86_sys(SYS_SEND), - slice_just_addr::, _>(&[fd.into(), buf_addr, buf_len, flags.into()]) + slice_just_addr::, _>(&[ + fd.into(), + buf_addr, + buf_len, + flags.into() + ]) )) } } @@ -492,7 +496,7 @@ pub(crate) fn sendto_v4( ret_usize(syscall_readonly!( __NR_socketcall, x86_sys(SYS_SENDTO), - slice_just_addr::, _>(&[ + slice_just_addr::, _>(&[ fd.into(), buf_addr, buf_len, @@ -530,7 +534,7 @@ pub(crate) fn sendto_v6( ret_usize(syscall_readonly!( __NR_socketcall, x86_sys(SYS_SENDTO), - slice_just_addr::, _>(&[ + slice_just_addr::, _>(&[ fd.into(), buf_addr, buf_len, @@ -568,7 +572,7 @@ pub(crate) fn sendto_unix( ret_usize(syscall_readonly!( __NR_socketcall, x86_sys(SYS_SENDTO), - slice_just_addr::, _>(&[ + slice_just_addr::, _>(&[ fd.into(), buf_addr, buf_len, @@ -618,7 +622,7 @@ pub(crate) fn recv(fd: BorrowedFd<'_>, buf: &mut [u8], flags: RecvFlags) -> io:: ret_usize(syscall!( __NR_socketcall, x86_sys(SYS_RECV), - slice_just_addr::, _>(&[ + slice_just_addr::, _>(&[ fd.into(), buf_addr_mut, buf_len, @@ -659,7 +663,7 @@ pub(crate) fn recvfrom( let nread = ret_usize(syscall!( __NR_socketcall, x86_sys(SYS_RECVFROM), - slice_just_addr::, _>(&[ + slice_just_addr::, _>(&[ fd.into(), buf_addr_mut, buf_len, @@ -700,7 +704,7 @@ pub(crate) fn getpeername(fd: BorrowedFd<'_>) -> io::Result, _>(&[ + slice_just_addr::, _>(&[ fd.into(), (&mut storage).into(), by_mut(&mut addrlen), @@ -737,7 +741,7 @@ pub(crate) fn getsockname(fd: BorrowedFd<'_>) -> io::Result { ret(syscall!( __NR_socketcall, x86_sys(SYS_GETSOCKNAME), - slice_just_addr::, _>(&[ + slice_just_addr::, _>(&[ fd.into(), (&mut storage).into(), by_mut(&mut addrlen), @@ -766,7 +770,7 @@ pub(crate) fn bind_v4(fd: BorrowedFd<'_>, addr: &SocketAddrV4) -> io::Result<()> ret(syscall_readonly!( __NR_socketcall, x86_sys(SYS_BIND), - slice_just_addr::, _>(&[ + slice_just_addr::, _>(&[ fd.into(), by_ref(&encode_sockaddr_v4(addr)), size_of::(), @@ -791,7 +795,7 @@ pub(crate) fn bind_v6(fd: BorrowedFd<'_>, addr: &SocketAddrV6) -> io::Result<()> ret(syscall_readonly!( __NR_socketcall, x86_sys(SYS_BIND), - slice_just_addr::, _>(&[ + slice_just_addr::, _>(&[ fd.into(), by_ref(&encode_sockaddr_v6(addr)), size_of::(), @@ -816,7 +820,7 @@ pub(crate) fn bind_unix(fd: BorrowedFd<'_>, addr: &SocketAddrUnix) -> io::Result ret(syscall_readonly!( __NR_socketcall, x86_sys(SYS_BIND), - slice_just_addr::, _>(&[ + slice_just_addr::, _>(&[ fd.into(), by_ref(&addr.unix), socklen_t(addr.addr_len()), @@ -841,7 +845,7 @@ pub(crate) fn connect_v4(fd: BorrowedFd<'_>, addr: &SocketAddrV4) -> io::Result< ret(syscall_readonly!( __NR_socketcall, x86_sys(SYS_CONNECT), - slice_just_addr::, _>(&[ + slice_just_addr::, _>(&[ fd.into(), by_ref(&encode_sockaddr_v4(addr)), size_of::(), @@ -866,7 +870,7 @@ pub(crate) fn connect_v6(fd: BorrowedFd<'_>, addr: &SocketAddrV6) -> io::Result< ret(syscall_readonly!( __NR_socketcall, x86_sys(SYS_CONNECT), - slice_just_addr::, _>(&[ + slice_just_addr::, _>(&[ fd.into(), by_ref(&encode_sockaddr_v6(addr)), size_of::(), @@ -891,7 +895,7 @@ pub(crate) fn connect_unix(fd: BorrowedFd<'_>, addr: &SocketAddrUnix) -> io::Res ret(syscall_readonly!( __NR_socketcall, x86_sys(SYS_CONNECT), - slice_just_addr::, _>(&[ + slice_just_addr::, _>(&[ fd.into(), by_ref(&addr.unix), socklen_t(addr.addr_len()), @@ -911,7 +915,7 @@ pub(crate) fn listen(fd: BorrowedFd<'_>, backlog: c::c_int) -> io::Result<()> { ret(syscall_readonly!( __NR_socketcall, x86_sys(SYS_LISTEN), - slice_just_addr::, _>(&[fd.into(), c_int(backlog)]) + slice_just_addr::, _>(&[fd.into(), c_int(backlog)]) )) } } @@ -920,10 +924,11 @@ pub(crate) mod sockopt { use super::{c, BorrowedFd}; use crate::io; use crate::net::sockopt::Timeout; - use crate::net::{Ipv4Addr, Ipv6Addr, SocketType}; + use crate::net::{AddressFamily, Ipv4Addr, Ipv6Addr, SocketType}; use c::{SO_RCVTIMEO_NEW, SO_RCVTIMEO_OLD, SO_SNDTIMEO_NEW, SO_SNDTIMEO_OLD}; use core::time::Duration; use linux_raw_sys::general::{__kernel_timespec, timeval}; + use linux_raw_sys::net::{SO_ACCEPTCONN, TCP_KEEPCNT, TCP_KEEPIDLE, TCP_KEEPINTVL}; #[inline] fn getsockopt(fd: BorrowedFd<'_>, level: u32, optname: u32) -> io::Result { @@ -960,7 +965,7 @@ pub(crate) mod sockopt { ret(syscall!( __NR_socketcall, x86_sys(SYS_GETSOCKOPT), - slice_just_addr::, _>(&[ + slice_just_addr::, _>(&[ fd.into(), c_uint(level), c_uint(optname), @@ -1008,7 +1013,7 @@ pub(crate) mod sockopt { ret(syscall_readonly!( __NR_socketcall, x86_sys(SYS_SETSOCKOPT), - slice_just_addr::, _>(&[ + slice_just_addr::, _>(&[ fd.into(), c_uint(level), c_uint(optname), @@ -1034,6 +1039,11 @@ pub(crate) mod sockopt { ) } + #[inline] + pub(crate) fn get_socket_reuseaddr(fd: BorrowedFd<'_>) -> io::Result { + getsockopt(fd, c::SOL_SOCKET as _, c::SO_REUSEADDR).map(to_bool) + } + #[inline] pub(crate) fn set_socket_broadcast(fd: BorrowedFd<'_>, broadcast: bool) -> io::Result<()> { setsockopt( @@ -1056,11 +1066,7 @@ pub(crate) mod sockopt { ) -> io::Result<()> { // Convert `linger` to seconds, rounding up. let l_linger = if let Some(linger) = linger { - let mut l_linger = linger.as_secs(); - if linger.subsec_nanos() != 0 { - l_linger = l_linger.checked_add(1).ok_or(io::Errno::INVAL)?; - } - l_linger.try_into().map_err(|_e| io::Errno::INVAL)? + duration_to_secs(linger)? } else { 0 }; @@ -1271,6 +1277,19 @@ pub(crate) mod sockopt { getsockopt(fd, c::SOL_SOCKET as _, c::SO_SNDBUF).map(|size: u32| size as usize) } + #[inline] + pub(crate) fn get_socket_domain(fd: BorrowedFd<'_>) -> io::Result { + let domain: c::c_int = getsockopt(fd, c::SOL_SOCKET as _, c::SO_DOMAIN)?; + Ok(AddressFamily( + domain.try_into().map_err(|_| io::Errno::OPNOTSUPP)?, + )) + } + + #[inline] + pub(crate) fn get_socket_acceptconn(fd: BorrowedFd<'_>) -> io::Result { + getsockopt(fd, c::SOL_SOCKET as _, SO_ACCEPTCONN).map(to_bool) + } + #[inline] pub(crate) fn set_ip_ttl(fd: BorrowedFd<'_>, ttl: u32) -> io::Result<()> { setsockopt(fd, c::IPPROTO_IP as _, c::IP_TTL, ttl) @@ -1419,6 +1438,40 @@ pub(crate) mod sockopt { getsockopt(fd, c::IPPROTO_TCP as _, c::TCP_NODELAY).map(to_bool) } + #[inline] + pub(crate) fn set_tcp_keepcnt(fd: BorrowedFd<'_>, count: u32) -> io::Result<()> { + setsockopt(fd, c::IPPROTO_TCP as _, TCP_KEEPCNT, count) + } + + #[inline] + pub(crate) fn get_tcp_keepcnt(fd: BorrowedFd<'_>) -> io::Result { + getsockopt(fd, c::IPPROTO_TCP as _, TCP_KEEPCNT) + } + + #[inline] + pub(crate) fn set_tcp_keepidle(fd: BorrowedFd<'_>, duration: Duration) -> io::Result<()> { + let secs: c::c_uint = duration_to_secs(duration)?; + setsockopt(fd, c::IPPROTO_TCP as _, TCP_KEEPIDLE, secs) + } + + #[inline] + pub(crate) fn get_tcp_keepidle(fd: BorrowedFd<'_>) -> io::Result { + let secs: c::c_uint = getsockopt(fd, c::IPPROTO_TCP as _, TCP_KEEPIDLE)?; + Ok(Duration::from_secs(secs as u64)) + } + + #[inline] + pub(crate) fn set_tcp_keepintvl(fd: BorrowedFd<'_>, duration: Duration) -> io::Result<()> { + let secs: c::c_uint = duration_to_secs(duration)?; + setsockopt(fd, c::IPPROTO_TCP as _, TCP_KEEPINTVL, secs) + } + + #[inline] + pub(crate) fn get_tcp_keepintvl(fd: BorrowedFd<'_>) -> io::Result { + let secs: c::c_uint = getsockopt(fd, c::IPPROTO_TCP as _, TCP_KEEPINTVL)?; + Ok(Duration::from_secs(secs as u64)) + } + #[inline] fn to_imr(multiaddr: &Ipv4Addr, interface: &Ipv4Addr) -> c::ip_mreq { c::ip_mreq { @@ -1465,4 +1518,14 @@ pub(crate) mod sockopt { fn to_bool(value: c::c_uint) -> bool { value != 0 } + + /// Convert to seconds, rounding up if necessary. + #[inline] + fn duration_to_secs>(duration: Duration) -> io::Result { + let mut secs = duration.as_secs(); + if duration.subsec_nanos() != 0 { + secs = secs.checked_add(1).ok_or(io::Errno::INVAL)?; + } + T::try_from(secs).map_err(|_e| io::Errno::INVAL) + } } diff --git a/vendor/rustix/src/backend/linux_raw/net/write_sockaddr.rs b/vendor/rustix/src/backend/linux_raw/net/write_sockaddr.rs index 28da05cd0..417f76e43 100644 --- a/vendor/rustix/src/backend/linux_raw/net/write_sockaddr.rs +++ b/vendor/rustix/src/backend/linux_raw/net/write_sockaddr.rs @@ -17,7 +17,7 @@ pub(crate) unsafe fn write_sockaddr( } } -pub(crate) unsafe fn encode_sockaddr_v4(v4: &SocketAddrV4) -> c::sockaddr_in { +pub(crate) fn encode_sockaddr_v4(v4: &SocketAddrV4) -> c::sockaddr_in { c::sockaddr_in { sin_family: c::AF_INET as _, sin_port: u16::to_be(v4.port()), @@ -34,7 +34,7 @@ unsafe fn write_sockaddr_v4(v4: &SocketAddrV4, storage: *mut SocketAddrStorage) size_of::() } -pub(crate) unsafe fn encode_sockaddr_v6(v6: &SocketAddrV6) -> c::sockaddr_in6 { +pub(crate) fn encode_sockaddr_v6(v6: &SocketAddrV6) -> c::sockaddr_in6 { c::sockaddr_in6 { sin6_family: c::AF_INET6 as _, sin6_port: u16::to_be(v6.port()), diff --git a/vendor/rustix/src/backend/linux_raw/param/auxv.rs b/vendor/rustix/src/backend/linux_raw/param/auxv.rs index 144ff10cd..8b0423ae4 100644 --- a/vendor/rustix/src/backend/linux_raw/param/auxv.rs +++ b/vendor/rustix/src/backend/linux_raw/param/auxv.rs @@ -6,24 +6,23 @@ #![allow(unsafe_code)] use crate::backend::c; -use crate::backend::elf::*; use crate::fd::OwnedFd; #[cfg(feature = "param")] use crate::ffi::CStr; use crate::fs::{Mode, OFlags}; use crate::utils::{as_ptr, check_raw_pointer}; +#[cfg(feature = "alloc")] use alloc::vec::Vec; -use core::ffi::c_void; use core::mem::size_of; use core::ptr::{null_mut, read_unaligned, NonNull}; -#[cfg(feature = "runtime")] -use core::slice; use core::sync::atomic::Ordering::Relaxed; use core::sync::atomic::{AtomicPtr, AtomicUsize}; +use linux_raw_sys::elf::*; use linux_raw_sys::general::{ - AT_BASE, AT_CLKTCK, AT_EXECFN, AT_HWCAP, AT_HWCAP2, AT_NULL, AT_PAGESZ, AT_PHDR, AT_PHENT, - AT_PHNUM, AT_SYSINFO_EHDR, + AT_BASE, AT_CLKTCK, AT_EXECFN, AT_HWCAP, AT_HWCAP2, AT_NULL, AT_PAGESZ, AT_SYSINFO_EHDR, }; +#[cfg(feature = "runtime")] +use linux_raw_sys::general::{AT_ENTRY, AT_PHDR, AT_PHENT, AT_PHNUM}; #[cfg(feature = "param")] #[inline] @@ -83,31 +82,23 @@ pub(crate) fn linux_execfn() -> &'static CStr { #[cfg(feature = "runtime")] #[inline] -pub(crate) fn exe_phdrs() -> (*const c::c_void, usize) { +pub(crate) fn exe_phdrs() -> (*const c::c_void, usize, usize) { let mut phdr = PHDR.load(Relaxed); + let mut phent = PHENT.load(Relaxed); let mut phnum = PHNUM.load(Relaxed); if phdr.is_null() || phnum == 0 { init_auxv(); phdr = PHDR.load(Relaxed); + phent = PHENT.load(Relaxed); phnum = PHNUM.load(Relaxed); } - (phdr.cast(), phnum) + (phdr.cast(), phent, phnum) } -#[cfg(feature = "runtime")] -#[inline] -pub(in super::super) fn exe_phdrs_slice() -> &'static [Elf_Phdr] { - let (phdr, phnum) = exe_phdrs(); - - // SAFETY: We assume the `AT_PHDR` and `AT_PHNUM` values provided by the - // kernel form a valid slice. - unsafe { slice::from_raw_parts(phdr.cast(), phnum) } -} - -/// `AT_SYSINFO_EHDR` isn't present on all platforms in all configurations, -/// so if we don't see it, this function returns a null pointer. +/// `AT_SYSINFO_EHDR` isn't present on all platforms in all configurations, so +/// if we don't see it, this function returns a null pointer. #[inline] pub(in super::super) fn sysinfo_ehdr() -> *const Elf_Ehdr { let mut ehdr = SYSINFO_EHDR.load(Relaxed); @@ -120,15 +111,35 @@ pub(in super::super) fn sysinfo_ehdr() -> *const Elf_Ehdr { ehdr } +#[cfg(feature = "runtime")] +#[inline] +pub(crate) fn entry() -> usize { + let mut entry = ENTRY.load(Relaxed); + + if entry == 0 { + init_auxv(); + entry = ENTRY.load(Relaxed); + } + + entry +} + static PAGE_SIZE: AtomicUsize = AtomicUsize::new(0); static CLOCK_TICKS_PER_SECOND: AtomicUsize = AtomicUsize::new(0); static HWCAP: AtomicUsize = AtomicUsize::new(0); static HWCAP2: AtomicUsize = AtomicUsize::new(0); +static EXECFN: AtomicPtr = AtomicPtr::new(null_mut()); static SYSINFO_EHDR: AtomicPtr = AtomicPtr::new(null_mut()); +#[cfg(feature = "runtime")] static PHDR: AtomicPtr = AtomicPtr::new(null_mut()); +#[cfg(feature = "runtime")] +static PHENT: AtomicUsize = AtomicUsize::new(0); +#[cfg(feature = "runtime")] static PHNUM: AtomicUsize = AtomicUsize::new(0); -static EXECFN: AtomicPtr = AtomicPtr::new(null_mut()); +#[cfg(feature = "runtime")] +static ENTRY: AtomicUsize = AtomicUsize::new(0); +#[cfg(feature = "alloc")] fn pr_get_auxv() -> crate::io::Result> { use super::super::conv::{c_int, pass_usize, ret_usize}; const PR_GET_AUXV: c::c_int = 0x41555856; @@ -138,7 +149,9 @@ fn pr_get_auxv() -> crate::io::Result> { __NR_prctl, c_int(PR_GET_AUXV), buffer.as_ptr(), - pass_usize(buffer.len()) + pass_usize(buffer.len()), + pass_usize(0), + pass_usize(0) ))? }; if len <= buffer.len() { @@ -151,28 +164,33 @@ fn pr_get_auxv() -> crate::io::Result> { __NR_prctl, c_int(PR_GET_AUXV), buffer.as_ptr(), - pass_usize(buffer.len()) + pass_usize(buffer.len()), + pass_usize(0), + pass_usize(0) ))? }; assert_eq!(len, buffer.len()); return Ok(buffer); } -/// On non-Mustang platforms, we read the aux vector via the `prctl` -/// `PR_GET_AUXV`, with a fallback to /proc/self/auxv for kernels that don't -/// support `PR_GET_AUXV`. +/// If we don't have "use-explicitly-provided-auxv" or "use-libc-auxv", we +/// read the aux vector via the `prctl` `PR_GET_AUXV`, with a fallback to +/// /proc/self/auxv for kernels that don't support `PR_GET_AUXV`. #[cold] fn init_auxv() { - match pr_get_auxv() { - Ok(buffer) => { - // SAFETY: We assume the kernel returns a valid auxv. - unsafe { - init_from_auxp(buffer.as_ptr().cast()); + #[cfg(feature = "alloc")] + { + match pr_get_auxv() { + Ok(buffer) => { + // SAFETY: We assume the kernel returns a valid auxv. + unsafe { + init_from_aux_iter(AuxPointer(buffer.as_ptr().cast())); + } + return; + } + Err(_) => { + // Fall back to /proc/self/auxv on error. } - return; - } - Err(_) => { - // Fall back to /proc/self/auxv on error. } } @@ -182,10 +200,17 @@ fn init_auxv() { // auxv records. let file = crate::fs::open("/proc/self/auxv", OFlags::RDONLY, Mode::empty()).unwrap(); - let _ = init_from_auxv_file(file); + #[cfg(feature = "alloc")] + init_from_auxv_file(file).unwrap(); + + #[cfg(not(feature = "alloc"))] + unsafe { + init_from_aux_iter(AuxFile(file)).unwrap(); + } } /// Process auxv entries from the open file `auxv`. +#[cfg(feature = "alloc")] #[cold] fn init_from_auxv_file(auxv: OwnedFd) -> Option<()> { let mut buffer = Vec::::with_capacity(512); @@ -211,7 +236,7 @@ fn init_from_auxv_file(auxv: OwnedFd) -> Option<()> { } // SAFETY: We loaded from an auxv file into the buffer. - unsafe { init_from_auxp(buffer.as_ptr().cast()) } + unsafe { init_from_aux_iter(AuxPointer(buffer.as_ptr().cast())) } } /// Process auxv entries from the auxv array pointed to by `auxp`. @@ -223,37 +248,50 @@ fn init_from_auxv_file(auxv: OwnedFd) -> Option<()> { /// The buffer contains `Elf_aux_t` elements, though it need not be aligned; /// function uses `read_unaligned` to read from it. #[cold] -unsafe fn init_from_auxp(mut auxp: *const Elf_auxv_t) -> Option<()> { +unsafe fn init_from_aux_iter(aux_iter: impl Iterator) -> Option<()> { let mut pagesz = 0; let mut clktck = 0; let mut hwcap = 0; let mut hwcap2 = 0; - let mut phdr = null_mut(); - let mut phnum = 0; let mut execfn = null_mut(); let mut sysinfo_ehdr = null_mut(); + #[cfg(feature = "runtime")] + let mut phdr = null_mut(); + #[cfg(feature = "runtime")] + let mut phnum = 0; + #[cfg(feature = "runtime")] let mut phent = 0; + #[cfg(feature = "runtime")] + let mut entry = 0; - loop { - let Elf_auxv_t { a_type, a_val } = read_unaligned(auxp); - + for Elf_auxv_t { a_type, a_val } in aux_iter { match a_type as _ { AT_PAGESZ => pagesz = a_val as usize, AT_CLKTCK => clktck = a_val as usize, AT_HWCAP => hwcap = a_val as usize, AT_HWCAP2 => hwcap2 = a_val as usize, + AT_EXECFN => execfn = check_raw_pointer::(a_val as *mut _)?.as_ptr(), + AT_SYSINFO_EHDR => sysinfo_ehdr = check_elf_base(a_val as *mut _)?.as_ptr(), + + AT_BASE => { + let _ = check_elf_base(a_val.cast())?; + } + + #[cfg(feature = "runtime")] AT_PHDR => phdr = check_raw_pointer::(a_val as *mut _)?.as_ptr(), + #[cfg(feature = "runtime")] AT_PHNUM => phnum = a_val as usize, + #[cfg(feature = "runtime")] AT_PHENT => phent = a_val as usize, - AT_EXECFN => execfn = check_raw_pointer::(a_val as *mut _)?.as_ptr(), - AT_BASE => check_interpreter_base(a_val.cast())?, - AT_SYSINFO_EHDR => sysinfo_ehdr = check_vdso_base(a_val as *mut _)?.as_ptr(), + #[cfg(feature = "runtime")] + AT_ENTRY => entry = a_val as usize, + AT_NULL => break, _ => (), } - auxp = auxp.add(1); } + #[cfg(feature = "runtime")] assert_eq!(phent, size_of::()); // The base and sysinfo_ehdr (if present) matches our platform. Accept @@ -262,86 +300,29 @@ unsafe fn init_from_auxp(mut auxp: *const Elf_auxv_t) -> Option<()> { CLOCK_TICKS_PER_SECOND.store(clktck, Relaxed); HWCAP.store(hwcap, Relaxed); HWCAP2.store(hwcap2, Relaxed); - PHDR.store(phdr, Relaxed); - PHNUM.store(phnum, Relaxed); EXECFN.store(execfn, Relaxed); SYSINFO_EHDR.store(sysinfo_ehdr, Relaxed); + #[cfg(feature = "runtime")] + PHDR.store(phdr, Relaxed); + #[cfg(feature = "runtime")] + PHNUM.store(phnum, Relaxed); + #[cfg(feature = "runtime")] + ENTRY.store(entry, Relaxed); Some(()) } -/// Check that `base` is a valid pointer to the program interpreter. -/// -/// `base` is some value we got from a `AT_BASE` aux record somewhere, -/// which hopefully holds the value of the program interpreter in memory. Do a -/// series of checks to be as sure as we can that it's safe to use. -#[cold] -unsafe fn check_interpreter_base(base: *const Elf_Ehdr) -> Option<()> { - check_elf_base(base)?; - Some(()) -} - /// Check that `base` is a valid pointer to the kernel-provided vDSO. /// /// `base` is some value we got from a `AT_SYSINFO_EHDR` aux record somewhere, /// which hopefully holds the value of the kernel-provided vDSO in memory. Do a /// series of checks to be as sure as we can that it's safe to use. #[cold] -unsafe fn check_vdso_base(base: *const Elf_Ehdr) -> Option> { - // In theory, we could check that we're not attempting to parse our own ELF - // image, as an additional check. However, older Linux toolchains don't - // support this, and Rust's `#[linkage = "extern_weak"]` isn't stable yet, - // so just disable this for now. - /* - { - extern "C" { - static __ehdr_start: c::c_void; - } - - let ehdr_start: *const c::c_void = &__ehdr_start; - if base == ehdr_start { - return None; - } - } - */ - - let hdr = check_elf_base(base)?; - - // Check that the ELF is not writable, since that would indicate that this - // isn't the ELF we think it is. Here we're just using `clock_getres` just - // as an arbitrary system call which writes to a buffer and fails with - // `EFAULT` if the buffer is not writable. - { - use crate::backend::conv::{c_uint, ret}; - if ret(syscall!( - __NR_clock_getres, - c_uint(linux_raw_sys::general::CLOCK_MONOTONIC), - base - )) != Err(crate::io::Errno::FAULT) - { - // We can't gracefully fail here because we would seem to have just - // mutated some unknown memory. - #[cfg(feature = "std")] - { - std::process::abort(); - } - #[cfg(all(not(feature = "std"), feature = "rustc-dep-of-std"))] - { - core::intrinsics::abort(); - } - } - } - - Some(hdr) -} - -/// Check that `base` is a valid pointer to an ELF image. -#[cold] unsafe fn check_elf_base(base: *const Elf_Ehdr) -> Option> { - // If we're reading a 64-bit auxv on a 32-bit platform, we'll see - // a zero `a_val` because `AT_*` values are never greater than - // `u32::MAX`. Zero is used by libc's `getauxval` to indicate - // errors, so it should never be a valid value. + // If we're reading a 64-bit auxv on a 32-bit platform, we'll see a zero + // `a_val` because `AT_*` values are never greater than `u32::MAX`. Zero is + // used by libc's `getauxval` to indicate errors, so it should never be a + // valid value. if base.is_null() { return None; } @@ -400,15 +381,46 @@ unsafe fn check_elf_base(base: *const Elf_Ehdr) -> Option> { Some(NonNull::new_unchecked(as_ptr(hdr) as *mut _)) } -// ELF ABI +// Aux reading utilities + +// Read auxv records from an array in memory. +struct AuxPointer(*const Elf_auxv_t); -#[repr(C)] -#[derive(Copy, Clone)] -struct Elf_auxv_t { - a_type: usize, +impl Iterator for AuxPointer { + type Item = Elf_auxv_t; - // Some of the values in the auxv array are pointers, so we make `a_val` a - // pointer, in order to preserve their provenance. For the values which are - // integers, we cast this to `usize`. - a_val: *const c_void, + #[cold] + fn next(&mut self) -> Option { + unsafe { + let value = read_unaligned(self.0); + self.0 = self.0.add(1); + Some(value) + } + } +} + +// Read auxv records from a file. +#[cfg(not(feature = "alloc"))] +struct AuxFile(OwnedFd); + +#[cfg(not(feature = "alloc"))] +impl Iterator for AuxFile { + type Item = Elf_auxv_t; + + // This implementation does lots of `read`s and it isn't amazing, but + // hopefully we won't use it often. + #[cold] + fn next(&mut self) -> Option { + let mut buf = [0_u8; size_of::()]; + let mut slice = &mut buf[..]; + while !slice.is_empty() { + match crate::io::read(&self.0, slice) { + Ok(0) => panic!("unexpected end of auxv file"), + Ok(n) => slice = &mut slice[n..], + Err(crate::io::Errno::INTR) => continue, + Err(err) => Err(err).unwrap(), + } + } + Some(unsafe { read_unaligned(buf.as_ptr().cast()) }) + } } diff --git a/vendor/rustix/src/backend/linux_raw/param/init.rs b/vendor/rustix/src/backend/linux_raw/param/init.rs new file mode 100644 index 000000000..46aae009a --- /dev/null +++ b/vendor/rustix/src/backend/linux_raw/param/init.rs @@ -0,0 +1,149 @@ +//! Linux auxv `init` function, for "use-explicitly-provided-auxv" mode. +//! +//! # Safety +//! +//! This uses raw pointers to locate and read the kernel-provided auxv array. +#![allow(unsafe_code)] + +use crate::backend::c; +#[cfg(feature = "param")] +use crate::ffi::CStr; +use core::ffi::c_void; +use core::ptr::{null_mut, read, NonNull}; +use core::sync::atomic::{AtomicPtr, AtomicUsize, Ordering}; +use linux_raw_sys::elf::*; +use linux_raw_sys::general::{ + AT_CLKTCK, AT_EXECFN, AT_HWCAP, AT_HWCAP2, AT_NULL, AT_PAGESZ, AT_SYSINFO_EHDR, +}; +#[cfg(feature = "runtime")] +use linux_raw_sys::general::{AT_ENTRY, AT_PHDR, AT_PHENT, AT_PHNUM}; + +#[cfg(feature = "param")] +#[inline] +pub(crate) fn page_size() -> usize { + unsafe { PAGE_SIZE.load(Ordering::Relaxed) } +} + +#[cfg(feature = "param")] +#[inline] +pub(crate) fn clock_ticks_per_second() -> u64 { + unsafe { CLOCK_TICKS_PER_SECOND.load(Ordering::Relaxed) as u64 } +} + +#[cfg(feature = "param")] +#[inline] +pub(crate) fn linux_hwcap() -> (usize, usize) { + unsafe { + ( + HWCAP.load(Ordering::Relaxed), + HWCAP2.load(Ordering::Relaxed), + ) + } +} + +#[cfg(feature = "param")] +#[inline] +pub(crate) fn linux_execfn() -> &'static CStr { + let execfn = unsafe { EXECFN.load(Ordering::Relaxed) }; + + // SAFETY: We initialize `EXECFN` to a valid `CStr` pointer, and we assume + // the `AT_EXECFN` value provided by the kernel points to a valid C string. + unsafe { CStr::from_ptr(execfn.cast()) } +} + +#[cfg(feature = "runtime")] +#[inline] +pub(crate) fn exe_phdrs() -> (*const c_void, usize, usize) { + unsafe { + ( + PHDR.load(Ordering::Relaxed).cast(), + PHENT.load(Ordering::Relaxed), + PHNUM.load(Ordering::Relaxed), + ) + } +} + +/// `AT_SYSINFO_EHDR` isn't present on all platforms in all configurations, so +/// if we don't see it, this function returns a null pointer. +#[inline] +pub(in super::super) fn sysinfo_ehdr() -> *const Elf_Ehdr { + unsafe { SYSINFO_EHDR.load(Ordering::Relaxed) } +} + +#[cfg(feature = "runtime")] +#[inline] +pub(crate) fn entry() -> usize { + unsafe { ENTRY.load(Ordering::Relaxed) } +} + +static mut PAGE_SIZE: AtomicUsize = AtomicUsize::new(0); +static mut CLOCK_TICKS_PER_SECOND: AtomicUsize = AtomicUsize::new(0); +static mut HWCAP: AtomicUsize = AtomicUsize::new(0); +static mut HWCAP2: AtomicUsize = AtomicUsize::new(0); +static mut SYSINFO_EHDR: AtomicPtr = AtomicPtr::new(null_mut()); +// Initialize `EXECFN` to a valid `CStr` pointer so that we don't need to check +// for null on every `execfn` call. +static mut EXECFN: AtomicPtr = AtomicPtr::new(b"\0".as_ptr() as _); +// Use `dangling` so that we can always treat it like an empty slice. +#[cfg(feature = "runtime")] +static mut PHDR: AtomicPtr = AtomicPtr::new(NonNull::dangling().as_ptr()); +#[cfg(feature = "runtime")] +static mut PHENT: AtomicUsize = AtomicUsize::new(0); +#[cfg(feature = "runtime")] +static mut PHNUM: AtomicUsize = AtomicUsize::new(0); +#[cfg(feature = "runtime")] +static mut ENTRY: AtomicUsize = AtomicUsize::new(0); + +/// When "use-explicitly-provided-auxv" is enabled, we export a function to be +/// called during initialization, and passed a pointer to the original +/// environment variable block set up by the OS. +pub(crate) unsafe fn init(envp: *mut *mut u8) { + init_from_envp(envp); +} + +/// # Safety +/// +/// This must be passed a pointer to the environment variable buffer +/// provided by the kernel, which is followed in memory by the auxv array. +unsafe fn init_from_envp(mut envp: *mut *mut u8) { + while !(*envp).is_null() { + envp = envp.add(1); + } + init_from_auxp(envp.add(1).cast()) +} + +/// Process auxv entries from the auxv array pointed to by `auxp`. +/// +/// # Safety +/// +/// This must be passed a pointer to an auxv array. +/// +/// The buffer contains `Elf_aux_t` elements, though it need not be aligned; +/// function uses `read_unaligned` to read from it. +unsafe fn init_from_auxp(mut auxp: *const Elf_auxv_t) { + loop { + let Elf_auxv_t { a_type, a_val } = read(auxp); + + match a_type as _ { + AT_PAGESZ => PAGE_SIZE.store(a_val as usize, Ordering::Relaxed), + AT_CLKTCK => CLOCK_TICKS_PER_SECOND.store(a_val as usize, Ordering::Relaxed), + AT_HWCAP => HWCAP.store(a_val as usize, Ordering::Relaxed), + AT_HWCAP2 => HWCAP2.store(a_val as usize, Ordering::Relaxed), + AT_EXECFN => EXECFN.store(a_val.cast::(), Ordering::Relaxed), + AT_SYSINFO_EHDR => SYSINFO_EHDR.store(a_val.cast::(), Ordering::Relaxed), + + #[cfg(feature = "runtime")] + AT_PHDR => PHDR.store(a_val.cast::(), Ordering::Relaxed), + #[cfg(feature = "runtime")] + AT_PHNUM => PHNUM.store(a_val as usize, Ordering::Relaxed), + #[cfg(feature = "runtime")] + AT_PHENT => PHENT.store(a_val as usize, Ordering::Relaxed), + #[cfg(feature = "runtime")] + AT_ENTRY => ENTRY.store(a_val as usize, Ordering::Relaxed), + + AT_NULL => break, + _ => (), + } + auxp = auxp.add(1); + } +} diff --git a/vendor/rustix/src/backend/linux_raw/param/libc_auxv.rs b/vendor/rustix/src/backend/linux_raw/param/libc_auxv.rs index 97739fcb5..0e6ca6ed5 100644 --- a/vendor/rustix/src/backend/linux_raw/param/libc_auxv.rs +++ b/vendor/rustix/src/backend/linux_raw/param/libc_auxv.rs @@ -6,35 +6,39 @@ #![allow(unsafe_code)] use crate::backend::c; -use crate::backend::elf::*; #[cfg(feature = "param")] use crate::ffi::CStr; #[cfg(not(feature = "runtime"))] use core::ptr::null; -#[cfg(feature = "runtime")] -use core::slice; +use linux_raw_sys::elf::*; // `getauxval` wasn't supported in glibc until 2.16. Also this lets us use // `*mut` as the return type to preserve strict provenance. #[cfg(not(feature = "runtime"))] weak!(fn getauxval(c::c_ulong) -> *mut c::c_void); -// With the "runtime" feature, go ahead and depend on `getauxval` existing -// so that we never fail. +// With the "runtime" feature, go ahead and depend on `getauxval` existing so +// that we never fail. #[cfg(feature = "runtime")] extern "C" { fn getauxval(type_: c::c_ulong) -> *mut c::c_void; } +#[cfg(feature = "runtime")] const AT_PHDR: c::c_ulong = 3; +#[cfg(feature = "runtime")] +const AT_PHENT: c::c_ulong = 4; +#[cfg(feature = "runtime")] const AT_PHNUM: c::c_ulong = 5; +#[cfg(feature = "runtime")] +const AT_ENTRY: c::c_ulong = 9; const AT_HWCAP: c::c_ulong = 16; const AT_HWCAP2: c::c_ulong = 26; const AT_EXECFN: c::c_ulong = 31; const AT_SYSINFO_EHDR: c::c_ulong = 33; -// Declare `sysconf` ourselves so that we don't depend on all of libc -// just for this. +// Declare `sysconf` ourselves so that we don't depend on all of libc just for +// this. extern "C" { fn sysconf(name: c::c_int) -> c::c_long; } @@ -52,12 +56,16 @@ const _SC_CLK_TCK: c::c_int = 2; fn test_abi() { const_assert_eq!(self::_SC_PAGESIZE, ::libc::_SC_PAGESIZE); const_assert_eq!(self::_SC_CLK_TCK, ::libc::_SC_CLK_TCK); - const_assert_eq!(self::AT_PHDR, ::libc::AT_PHDR); - const_assert_eq!(self::AT_PHNUM, ::libc::AT_PHNUM); const_assert_eq!(self::AT_HWCAP, ::libc::AT_HWCAP); const_assert_eq!(self::AT_HWCAP2, ::libc::AT_HWCAP2); const_assert_eq!(self::AT_EXECFN, ::libc::AT_EXECFN); const_assert_eq!(self::AT_SYSINFO_EHDR, ::libc::AT_SYSINFO_EHDR); + #[cfg(feature = "runtime")] + const_assert_eq!(self::AT_PHDR, ::libc::AT_PHDR); + #[cfg(feature = "runtime")] + const_assert_eq!(self::AT_PHNUM, ::libc::AT_PHNUM); + #[cfg(feature = "runtime")] + const_assert_eq!(self::AT_ENTRY, ::libc::AT_ENTRY); } #[cfg(feature = "param")] @@ -114,24 +122,15 @@ pub(crate) fn linux_execfn() -> &'static CStr { #[cfg(feature = "runtime")] #[inline] -pub(crate) fn exe_phdrs() -> (*const c::c_void, usize) { +pub(crate) fn exe_phdrs() -> (*const c::c_void, usize, usize) { unsafe { let phdr = getauxval(AT_PHDR) as *const c::c_void; + let phent = getauxval(AT_PHENT) as usize; let phnum = getauxval(AT_PHNUM) as usize; - (phdr, phnum) + (phdr, phent, phnum) } } -#[cfg(feature = "runtime")] -#[inline] -pub(in super::super) fn exe_phdrs_slice() -> &'static [Elf_Phdr] { - let (phdr, phnum) = exe_phdrs(); - - // SAFETY: We assume the `AT_PHDR` and `AT_PHNUM` values provided by the - // kernel form a valid slice. - unsafe { slice::from_raw_parts(phdr.cast(), phnum) } -} - /// `AT_SYSINFO_EHDR` isn't present on all platforms in all configurations, /// so if we don't see it, this function returns a null pointer. #[inline] @@ -150,3 +149,9 @@ pub(in super::super) fn sysinfo_ehdr() -> *const Elf_Ehdr { getauxval(AT_SYSINFO_EHDR) as *const Elf_Ehdr } } + +#[cfg(feature = "runtime")] +#[inline] +pub(crate) fn entry() -> usize { + unsafe { getauxval(AT_ENTRY) as usize } +} diff --git a/vendor/rustix/src/backend/linux_raw/param/mod.rs b/vendor/rustix/src/backend/linux_raw/param/mod.rs index 956282074..365f01604 100644 --- a/vendor/rustix/src/backend/linux_raw/param/mod.rs +++ b/vendor/rustix/src/backend/linux_raw/param/mod.rs @@ -1,12 +1,15 @@ -// On Mustang, origin is in control of program startup and can access the -// incoming aux values on the stack. +// With "use-explicitly-provided-auxv" enabled, we expect to be initialized +// with an explicit `rustix::param::init` call. // // With "use-libc-auxv" enabled, use libc's `getauxval`. // // Otherwise, we read aux values from /proc/self/auxv. -#[cfg_attr(target_vendor = "mustang", path = "mustang_auxv.rs")] +#[cfg_attr(feature = "use-explicitly-provided-auxv", path = "init.rs")] #[cfg_attr( - all(not(target_vendor = "mustang"), feature = "use-libc-auxv"), + all( + not(feature = "use-explicitly-provided-auxv"), + feature = "use-libc-auxv" + ), path = "libc_auxv.rs" )] pub(crate) mod auxv; diff --git a/vendor/rustix/src/backend/linux_raw/param/mustang_auxv.rs b/vendor/rustix/src/backend/linux_raw/param/mustang_auxv.rs deleted file mode 100644 index f45a25faf..000000000 --- a/vendor/rustix/src/backend/linux_raw/param/mustang_auxv.rs +++ /dev/null @@ -1,159 +0,0 @@ -//! Linux auxv support, for Mustang. -//! -//! # Safety -//! -//! This uses raw pointers to locate and read the kernel-provided auxv array. -#![allow(unsafe_code)] - -use crate::backend::c; -use crate::backend::elf::*; -#[cfg(feature = "param")] -use crate::ffi::CStr; -use core::ffi::c_void; -use core::mem::size_of; -use core::ptr::{null, read}; -#[cfg(feature = "runtime")] -use core::slice; -use linux_raw_sys::general::{ - AT_CLKTCK, AT_EXECFN, AT_HWCAP, AT_HWCAP2, AT_NULL, AT_PAGESZ, AT_PHDR, AT_PHENT, AT_PHNUM, - AT_SYSINFO_EHDR, -}; - -#[cfg(feature = "param")] -#[inline] -pub(crate) fn page_size() -> usize { - // SAFETY: This is initialized during program startup. - unsafe { PAGE_SIZE } -} - -#[cfg(feature = "param")] -#[inline] -pub(crate) fn clock_ticks_per_second() -> u64 { - // SAFETY: This is initialized during program startup. - unsafe { CLOCK_TICKS_PER_SECOND as u64 } -} - -#[cfg(feature = "param")] -#[inline] -pub(crate) fn linux_hwcap() -> (usize, usize) { - // SAFETY: This is initialized during program startup. - unsafe { (HWCAP, HWCAP2) } -} - -#[cfg(feature = "param")] -#[inline] -pub(crate) fn linux_execfn() -> &'static CStr { - // SAFETY: This is initialized during program startup. And we - // assume it's a valid pointer to a NUL-terminated string. - unsafe { CStr::from_ptr(EXECFN.0.cast()) } -} - -#[cfg(feature = "runtime")] -#[inline] -pub(crate) fn exe_phdrs() -> (*const c_void, usize) { - // SAFETY: This is initialized during program startup. - unsafe { (PHDR.0.cast(), PHNUM) } -} - -#[cfg(feature = "runtime")] -#[inline] -pub(in super::super) fn exe_phdrs_slice() -> &'static [Elf_Phdr] { - let (phdr, phnum) = exe_phdrs(); - - // SAFETY: We assume the `AT_PHDR` and `AT_PHNUM` values provided by the - // kernel form a valid slice. - unsafe { slice::from_raw_parts(phdr.cast(), phnum) } -} - -/// `AT_SYSINFO_EHDR` isn't present on all platforms in all configurations, -/// so if we don't see it, this function returns a null pointer. -#[inline] -pub(in super::super) fn sysinfo_ehdr() -> *const Elf_Ehdr { - // SAFETY: This is initialized during program startup. - unsafe { SYSINFO_EHDR.0 } -} - -/// A const pointer to `T` that implements [`Sync`]. -#[repr(transparent)] -#[derive(Clone, Copy, Debug, PartialEq, Eq)] -pub struct SyncConstPtr(*const T); -unsafe impl Sync for SyncConstPtr {} - -impl SyncConstPtr { - /// Creates a `SyncConstPointer` from a raw pointer. - /// - /// Behavior is undefined if `ptr` is actually not - /// safe to share across threads. - pub const unsafe fn new(ptr: *const T) -> Self { - Self(ptr) - } -} - -static mut PAGE_SIZE: usize = 0; -static mut CLOCK_TICKS_PER_SECOND: usize = 0; -static mut HWCAP: usize = 0; -static mut HWCAP2: usize = 0; -static mut SYSINFO_EHDR: SyncConstPtr = unsafe { SyncConstPtr::new(null()) }; -static mut PHDR: SyncConstPtr = unsafe { SyncConstPtr::new(null()) }; -static mut PHNUM: usize = 0; -static mut EXECFN: SyncConstPtr = unsafe { SyncConstPtr::new(null()) }; - -/// On mustang, we export a function to be called during initialization, and -/// passed a pointer to the original environment variable block set up by the -/// OS. -pub(crate) unsafe fn init(envp: *mut *mut u8) { - init_from_envp(envp); -} - -/// # Safety -/// -/// This must be passed a pointer to the environment variable buffer -/// provided by the kernel, which is followed in memory by the auxv array. -unsafe fn init_from_envp(mut envp: *mut *mut u8) { - while !(*envp).is_null() { - envp = envp.add(1); - } - init_from_auxp(envp.add(1).cast()) -} - -/// Process auxv entries from the auxv array pointed to by `auxp`. -/// -/// # Safety -/// -/// This must be passed a pointer to an auxv array. -/// -/// The buffer contains `Elf_aux_t` elements, though it need not be aligned; -/// function uses `read_unaligned` to read from it. -unsafe fn init_from_auxp(mut auxp: *const Elf_auxv_t) { - loop { - let Elf_auxv_t { a_type, a_val } = read(auxp); - - match a_type as _ { - AT_PAGESZ => PAGE_SIZE = a_val as usize, - AT_CLKTCK => CLOCK_TICKS_PER_SECOND = a_val as usize, - AT_HWCAP => HWCAP = a_val as usize, - AT_HWCAP2 => HWCAP2 = a_val as usize, - AT_PHDR => PHDR = SyncConstPtr::new(a_val.cast::()), - AT_PHNUM => PHNUM = a_val as usize, - AT_PHENT => assert_eq!(a_val as usize, size_of::()), - AT_EXECFN => EXECFN = SyncConstPtr::new(a_val.cast::()), - AT_SYSINFO_EHDR => SYSINFO_EHDR = SyncConstPtr::new(a_val.cast::()), - AT_NULL => break, - _ => (), - } - auxp = auxp.add(1); - } -} - -// ELF ABI - -#[repr(C)] -#[derive(Copy, Clone)] -struct Elf_auxv_t { - a_type: usize, - - // Some of the values in the auxv array are pointers, so we make `a_val` a - // pointer, in order to preserve their provenance. For the values which are - // integers, we cast this to `usize`. - a_val: *const c_void, -} diff --git a/vendor/rustix/src/backend/linux_raw/pid/syscalls.rs b/vendor/rustix/src/backend/linux_raw/pid/syscalls.rs index f36bac048..9665ab3e9 100644 --- a/vendor/rustix/src/backend/linux_raw/pid/syscalls.rs +++ b/vendor/rustix/src/backend/linux_raw/pid/syscalls.rs @@ -3,8 +3,7 @@ //! # Safety //! //! See the `rustix::backend` module documentation for details. -#![allow(unsafe_code)] -#![allow(clippy::undocumented_unsafe_blocks)] +#![allow(unsafe_code, clippy::undocumented_unsafe_blocks)] use crate::backend::conv::ret_usize_infallible; use crate::pid::{Pid, RawPid}; diff --git a/vendor/rustix/src/backend/linux_raw/pipe/syscalls.rs b/vendor/rustix/src/backend/linux_raw/pipe/syscalls.rs index e05094237..ec3e459be 100644 --- a/vendor/rustix/src/backend/linux_raw/pipe/syscalls.rs +++ b/vendor/rustix/src/backend/linux_raw/pipe/syscalls.rs @@ -3,8 +3,7 @@ //! # Safety //! //! See the `rustix::backend` module documentation for details. -#![allow(unsafe_code)] -#![allow(clippy::undocumented_unsafe_blocks)] +#![allow(unsafe_code, clippy::undocumented_unsafe_blocks)] use crate::backend::conv::{c_int, c_uint, opt_mut, pass_usize, ret, ret_usize, slice}; use crate::backend::{c, MAX_IOV}; @@ -59,9 +58,9 @@ pub(crate) fn pipe_with(flags: PipeFlags) -> io::Result<(OwnedFd, OwnedFd)> { #[inline] pub fn splice( - fd_in: BorrowedFd, + fd_in: BorrowedFd<'_>, off_in: Option<&mut u64>, - fd_out: BorrowedFd, + fd_out: BorrowedFd<'_>, off_out: Option<&mut u64>, len: usize, flags: SpliceFlags, @@ -81,8 +80,8 @@ pub fn splice( #[inline] pub unsafe fn vmsplice( - fd: BorrowedFd, - bufs: &[IoSliceRaw], + fd: BorrowedFd<'_>, + bufs: &[IoSliceRaw<'_>], flags: SpliceFlags, ) -> io::Result { let (bufs_addr, bufs_len) = slice(&bufs[..cmp::min(bufs.len(), MAX_IOV)]); @@ -91,8 +90,8 @@ pub unsafe fn vmsplice( #[inline] pub fn tee( - fd_in: BorrowedFd, - fd_out: BorrowedFd, + fd_in: BorrowedFd<'_>, + fd_out: BorrowedFd<'_>, len: usize, flags: SpliceFlags, ) -> io::Result { diff --git a/vendor/rustix/src/backend/linux_raw/pipe/types.rs b/vendor/rustix/src/backend/linux_raw/pipe/types.rs index 90d2d79ab..c950b5d0a 100644 --- a/vendor/rustix/src/backend/linux_raw/pipe/types.rs +++ b/vendor/rustix/src/backend/linux_raw/pipe/types.rs @@ -15,6 +15,9 @@ bitflags! { const DIRECT = linux_raw_sys::general::O_DIRECT; /// `O_NONBLOCK` const NONBLOCK = linux_raw_sys::general::O_NONBLOCK; + + /// + const _ = !0; } } @@ -32,6 +35,9 @@ bitflags! { const MORE = linux_raw_sys::general::SPLICE_F_MORE; /// `SPLICE_F_GIFT` const GIFT = linux_raw_sys::general::SPLICE_F_GIFT; + + /// + const _ = !0; } } diff --git a/vendor/rustix/src/backend/linux_raw/prctl/syscalls.rs b/vendor/rustix/src/backend/linux_raw/prctl/syscalls.rs index 193f4b7b4..1410d5128 100644 --- a/vendor/rustix/src/backend/linux_raw/prctl/syscalls.rs +++ b/vendor/rustix/src/backend/linux_raw/prctl/syscalls.rs @@ -3,8 +3,7 @@ //! # Safety //! //! See the `rustix::backend` module documentation for details. -#![allow(unsafe_code)] -#![allow(clippy::undocumented_unsafe_blocks)] +#![allow(unsafe_code, clippy::undocumented_unsafe_blocks)] use crate::backend::c; use crate::backend::conv::{c_int, ret_c_int}; diff --git a/vendor/rustix/src/backend/linux_raw/process/syscalls.rs b/vendor/rustix/src/backend/linux_raw/process/syscalls.rs index 5ec2755ff..c0416bf5a 100644 --- a/vendor/rustix/src/backend/linux_raw/process/syscalls.rs +++ b/vendor/rustix/src/backend/linux_raw/process/syscalls.rs @@ -3,17 +3,16 @@ //! # Safety //! //! See the `rustix::backend` module documentation for details. -#![allow(unsafe_code)] -#![allow(clippy::undocumented_unsafe_blocks)] +#![allow(unsafe_code, clippy::undocumented_unsafe_blocks)] use super::types::RawCpuSet; use crate::backend::c; -#[cfg(feature = "fs")] +#[cfg(all(feature = "alloc", feature = "fs"))] use crate::backend::conv::slice_mut; use crate::backend::conv::{ by_mut, by_ref, c_int, c_uint, negative_pid, pass_usize, raw_fd, ret, ret_c_int, ret_c_int_infallible, ret_c_uint, ret_infallible, ret_owned_fd, ret_usize, size_of, - slice_just_addr, slice_just_addr_mut, zero, + slice_just_addr, zero, }; use crate::fd::{AsRawFd, BorrowedFd, OwnedFd, RawFd}; #[cfg(feature = "fs")] @@ -21,8 +20,8 @@ use crate::ffi::CStr; use crate::io; use crate::pid::RawPid; use crate::process::{ - Cpuid, Gid, MembarrierCommand, MembarrierQuery, Pid, PidfdFlags, PidfdGetfdFlags, Resource, - Rlimit, Uid, WaitId, WaitOptions, WaitStatus, WaitidOptions, WaitidStatus, + Cpuid, MembarrierCommand, MembarrierQuery, Pid, PidfdFlags, PidfdGetfdFlags, Resource, Rlimit, + Uid, WaitId, WaitOptions, WaitStatus, WaitidOptions, WaitidStatus, }; use crate::signal::Signal; use crate::utils::as_mut_ptr; @@ -32,9 +31,10 @@ use linux_raw_sys::general::{ membarrier_cmd, membarrier_cmd_flag, rlimit, rlimit64, PRIO_PGRP, PRIO_PROCESS, PRIO_USER, RLIM64_INFINITY, RLIM_INFINITY, }; -use linux_raw_sys::ioctl::TIOCSCTTY; #[cfg(feature = "fs")] use {crate::backend::conv::ret_c_uint_infallible, crate::fs::Mode}; +#[cfg(feature = "alloc")] +use {crate::backend::conv::slice_just_addr_mut, crate::process::Gid}; #[cfg(feature = "fs")] #[inline] @@ -53,7 +53,7 @@ pub(crate) fn chroot(filename: &CStr) -> io::Result<()> { unsafe { ret(syscall_readonly!(__NR_chroot, filename)) } } -#[cfg(feature = "fs")] +#[cfg(all(feature = "alloc", feature = "fs"))] #[inline] pub(crate) fn getcwd(buf: &mut [MaybeUninit]) -> io::Result { let (buf_addr_mut, buf_len) = slice_mut(buf); @@ -365,12 +365,12 @@ pub(crate) fn prlimit(pid: Option, limit: Resource, new: Rlimit) -> io::Res /// Convert a Rust [`Rlimit`] to a C `rlimit64`. #[inline] fn rlimit_from_linux(lim: rlimit64) -> Rlimit { - let current = if lim.rlim_cur == RLIM64_INFINITY as _ { + let current = if lim.rlim_cur as u64 == RLIM64_INFINITY as u64 { None } else { Some(lim.rlim_cur) }; - let maximum = if lim.rlim_max == RLIM64_INFINITY as _ { + let maximum = if lim.rlim_max as u64 == RLIM64_INFINITY as u64 { None } else { Some(lim.rlim_max) @@ -395,12 +395,12 @@ fn rlimit_to_linux(lim: Rlimit) -> rlimit64 { /// Like `rlimit_from_linux` but uses Linux's old 32-bit `rlimit`. #[allow(clippy::useless_conversion)] fn rlimit_from_linux_old(lim: rlimit) -> Rlimit { - let current = if lim.rlim_cur == RLIM_INFINITY as _ { + let current = if lim.rlim_cur as u32 == RLIM_INFINITY as u32 { None } else { Some(lim.rlim_cur.into()) }; - let maximum = if lim.rlim_max == RLIM_INFINITY as _ { + let maximum = if lim.rlim_max as u32 == RLIM_INFINITY as u32 { None } else { Some(lim.rlim_max.into()) @@ -610,6 +610,7 @@ pub(crate) fn pidfd_open(pid: Pid, flags: PidfdFlags) -> io::Result { unsafe { ret_owned_fd(syscall_readonly!(__NR_pidfd_open, pid, flags)) } } +#[cfg(feature = "alloc")] #[inline] pub(crate) fn getgroups(buf: &mut [Gid]) -> io::Result { let len = buf.len().try_into().map_err(|_| io::Errno::NOMEM)?; @@ -622,15 +623,3 @@ pub(crate) fn getgroups(buf: &mut [Gid]) -> io::Result { )) } } - -#[inline] -pub(crate) fn ioctl_tiocsctty(fd: BorrowedFd<'_>) -> io::Result<()> { - unsafe { - ret(syscall_readonly!( - __NR_ioctl, - fd, - c_uint(TIOCSCTTY), - by_ref(&0_u32) - )) - } -} diff --git a/vendor/rustix/src/backend/linux_raw/process/types.rs b/vendor/rustix/src/backend/linux_raw/process/types.rs index f31749b83..841668a60 100644 --- a/vendor/rustix/src/backend/linux_raw/process/types.rs +++ b/vendor/rustix/src/backend/linux_raw/process/types.rs @@ -1,4 +1,3 @@ -use crate::backend::c; use linux_raw_sys::general::membarrier_cmd; /// A command for use with [`membarrier`] and [`membarrier_cpu`]. @@ -78,15 +77,6 @@ pub enum Resource { Rttime = linux_raw_sys::general::RLIMIT_RTTIME, } -/// `EXIT_SUCCESS` -pub const EXIT_SUCCESS: c::c_int = 0; -/// `EXIT_FAILURE` -pub const EXIT_FAILURE: c::c_int = 1; -/// The status value of a child terminated with a [`Signal::Abort`] signal. -/// -/// [`Signal::Abort`]: crate::process::Signal::Abort -pub const EXIT_SIGNALED_SIGABRT: c::c_int = 128 + linux_raw_sys::general::SIGABRT as i32; - /// A CPU identifier as a raw integer. pub type RawCpuid = u32; diff --git a/vendor/rustix/src/backend/linux_raw/pty/syscalls.rs b/vendor/rustix/src/backend/linux_raw/pty/syscalls.rs index 529564c34..b64344fb9 100644 --- a/vendor/rustix/src/backend/linux_raw/pty/syscalls.rs +++ b/vendor/rustix/src/backend/linux_raw/pty/syscalls.rs @@ -3,22 +3,21 @@ //! # Safety //! //! See the `rustix::backend` module documentation for details. -#![allow(unsafe_code)] -#![allow(clippy::undocumented_unsafe_blocks)] +#![allow(unsafe_code, clippy::undocumented_unsafe_blocks)] -use crate::backend::c; -use crate::backend::conv::{by_ref, c_uint, ret, ret_owned_fd}; -use crate::fd::{BorrowedFd, OwnedFd}; -use crate::ffi::CString; +use crate::backend::conv::{by_ref, c_uint, ret}; +use crate::fd::BorrowedFd; use crate::io; -use crate::path::DecInt; -use crate::pty::OpenptFlags; -use alloc::vec::Vec; -use core::mem::MaybeUninit; -use linux_raw_sys::ioctl::{TIOCGPTN, TIOCGPTPEER, TIOCSPTLCK}; +use linux_raw_sys::ioctl::TIOCSPTLCK; +#[cfg(feature = "alloc")] +use { + crate::backend::c, crate::ffi::CString, crate::path::DecInt, alloc::vec::Vec, + core::mem::MaybeUninit, linux_raw_sys::ioctl::TIOCGPTN, +}; +#[cfg(feature = "alloc")] #[inline] -pub(crate) fn ptsname(fd: BorrowedFd, mut buffer: Vec) -> io::Result { +pub(crate) fn ptsname(fd: BorrowedFd<'_>, mut buffer: Vec) -> io::Result { unsafe { let mut n = MaybeUninit::::uninit(); ret(syscall!(__NR_ioctl, fd, c_uint(TIOCGPTN), &mut n))?; @@ -32,7 +31,7 @@ pub(crate) fn ptsname(fd: BorrowedFd, mut buffer: Vec) -> io::Result io::Result<()> { +pub(crate) fn unlockpt(fd: BorrowedFd<'_>) -> io::Result<()> { unsafe { ret(syscall_readonly!( __NR_ioctl, @@ -42,16 +41,3 @@ pub(crate) fn unlockpt(fd: BorrowedFd) -> io::Result<()> { )) } } - -#[cfg(target_os = "linux")] -#[inline] -pub(crate) fn ioctl_tiocgptpeer(fd: BorrowedFd, flags: OpenptFlags) -> io::Result { - unsafe { - ret_owned_fd(syscall_readonly!( - __NR_ioctl, - fd, - c_uint(TIOCGPTPEER), - flags - )) - } -} diff --git a/vendor/rustix/src/backend/linux_raw/rand/syscalls.rs b/vendor/rustix/src/backend/linux_raw/rand/syscalls.rs index 95a6efcff..e744f3193 100644 --- a/vendor/rustix/src/backend/linux_raw/rand/syscalls.rs +++ b/vendor/rustix/src/backend/linux_raw/rand/syscalls.rs @@ -3,8 +3,7 @@ //! # Safety //! //! See the `rustix::backend` module documentation for details. -#![allow(unsafe_code)] -#![allow(clippy::undocumented_unsafe_blocks)] +#![allow(unsafe_code, clippy::undocumented_unsafe_blocks)] use crate::backend::conv::{ret_usize, slice_mut}; use crate::io; diff --git a/vendor/rustix/src/backend/linux_raw/rand/types.rs b/vendor/rustix/src/backend/linux_raw/rand/types.rs index 21e950015..47b996d30 100644 --- a/vendor/rustix/src/backend/linux_raw/rand/types.rs +++ b/vendor/rustix/src/backend/linux_raw/rand/types.rs @@ -13,5 +13,8 @@ bitflags! { const NONBLOCK = linux_raw_sys::general::GRND_NONBLOCK; /// `GRND_INSECURE` const INSECURE = linux_raw_sys::general::GRND_INSECURE; + + /// + const _ = !0; } } diff --git a/vendor/rustix/src/backend/linux_raw/runtime/syscalls.rs b/vendor/rustix/src/backend/linux_raw/runtime/syscalls.rs index f82e2187b..c1ff3d239 100644 --- a/vendor/rustix/src/backend/linux_raw/runtime/syscalls.rs +++ b/vendor/rustix/src/backend/linux_raw/runtime/syscalls.rs @@ -3,8 +3,7 @@ //! # Safety //! //! See the `rustix::backend` module documentation for details. -#![allow(unsafe_code)] -#![allow(clippy::undocumented_unsafe_blocks)] +#![allow(unsafe_code, clippy::undocumented_unsafe_blocks)] use crate::backend::c; #[cfg(target_arch = "x86")] @@ -93,7 +92,10 @@ pub(crate) mod tls { ret_infallible(syscall_readonly!( __NR_arch_prctl, c_uint(ARCH_SET_FS), - data + data, + zero(), + zero(), + zero() )) } @@ -105,7 +107,14 @@ pub(crate) mod tls { #[inline] pub(crate) unsafe fn set_thread_name(name: &CStr) -> io::Result<()> { - ret(syscall_readonly!(__NR_prctl, c_uint(PR_SET_NAME), name)) + ret(syscall_readonly!( + __NR_prctl, + c_uint(PR_SET_NAME), + name, + zero(), + zero(), + zero() + )) } #[inline] diff --git a/vendor/rustix/src/backend/linux_raw/runtime/tls.rs b/vendor/rustix/src/backend/linux_raw/runtime/tls.rs index 763971591..ad1634894 100644 --- a/vendor/rustix/src/backend/linux_raw/runtime/tls.rs +++ b/vendor/rustix/src/backend/linux_raw/runtime/tls.rs @@ -7,9 +7,9 @@ #![allow(unsafe_code)] use crate::backend::c; -use crate::backend::elf::*; -use crate::backend::param::auxv::exe_phdrs_slice; -use core::ptr::null; +use crate::backend::param::auxv::exe_phdrs; +use core::ptr::{null, NonNull}; +use linux_raw_sys::elf::*; /// For use with [`set_thread_area`]. /// @@ -22,26 +22,41 @@ pub(crate) fn startup_tls_info() -> StartupTlsInfo { let mut tls_phdr = null(); let mut stack_size = 0; - let phdrs = exe_phdrs_slice(); + let (first_phdr, phent, phnum) = exe_phdrs(); + let mut current_phdr = first_phdr.cast::(); // SAFETY: We assume the phdr array pointer and length the kernel provided // to the process describe a valid phdr array. unsafe { - for phdr in phdrs { + let phdrs_end = current_phdr.cast::().add(phnum * phent).cast(); + while current_phdr != phdrs_end { + let phdr = &*current_phdr; + current_phdr = current_phdr.cast::().add(phent).cast(); + match phdr.p_type { - PT_PHDR => base = phdrs.as_ptr().cast::().sub(phdr.p_vaddr), + PT_PHDR => base = first_phdr.cast::().sub(phdr.p_vaddr), PT_TLS => tls_phdr = phdr, PT_GNU_STACK => stack_size = phdr.p_memsz, _ => {} } } - StartupTlsInfo { - addr: base.cast::().add((*tls_phdr).p_vaddr).cast(), - mem_size: (*tls_phdr).p_memsz, - file_size: (*tls_phdr).p_filesz, - align: (*tls_phdr).p_align, - stack_size, + if tls_phdr.is_null() { + StartupTlsInfo { + addr: NonNull::dangling().as_ptr(), + mem_size: 0, + file_size: 0, + align: 1, + stack_size: 0, + } + } else { + StartupTlsInfo { + addr: base.cast::().add((*tls_phdr).p_vaddr).cast(), + mem_size: (*tls_phdr).p_memsz, + file_size: (*tls_phdr).p_filesz, + align: (*tls_phdr).p_align, + stack_size, + } } } } diff --git a/vendor/rustix/src/backend/linux_raw/system/syscalls.rs b/vendor/rustix/src/backend/linux_raw/system/syscalls.rs index 514751d6f..947d5168e 100644 --- a/vendor/rustix/src/backend/linux_raw/system/syscalls.rs +++ b/vendor/rustix/src/backend/linux_raw/system/syscalls.rs @@ -3,8 +3,7 @@ //! # Safety //! //! See the `rustix::backend` module documentation for details. -#![allow(unsafe_code)] -#![allow(clippy::undocumented_unsafe_blocks)] +#![allow(unsafe_code, clippy::undocumented_unsafe_blocks)] use super::types::RawUname; use crate::backend::conv::{ret, ret_infallible, slice}; diff --git a/vendor/rustix/src/backend/linux_raw/termios/syscalls.rs b/vendor/rustix/src/backend/linux_raw/termios/syscalls.rs index 8f030e1c3..09100441f 100644 --- a/vendor/rustix/src/backend/linux_raw/termios/syscalls.rs +++ b/vendor/rustix/src/backend/linux_raw/termios/syscalls.rs @@ -3,27 +3,25 @@ //! # Safety //! //! See the `rustix::backend` module documentation for details. -#![allow(unsafe_code)] -#![allow(clippy::undocumented_unsafe_blocks)] +#![allow(unsafe_code, clippy::undocumented_unsafe_blocks)] use crate::backend::c; use crate::backend::conv::{by_ref, c_uint, ret}; use crate::fd::BorrowedFd; use crate::io; use crate::pid::Pid; -#[cfg(feature = "procfs")] +#[cfg(all(feature = "alloc", feature = "procfs"))] use crate::procfs; use crate::termios::{ Action, ControlModes, InputModes, LocalModes, OptionalActions, OutputModes, QueueSelector, SpecialCodeIndex, Termios, Winsize, }; -#[cfg(feature = "procfs")] +#[cfg(all(feature = "alloc", feature = "procfs"))] use crate::{ffi::CStr, fs::FileType, path::DecInt}; use core::mem::MaybeUninit; use linux_raw_sys::general::IBSHIFT; use linux_raw_sys::ioctl::{ - TCFLSH, TCSBRK, TCXONC, TIOCEXCL, TIOCGPGRP, TIOCGSID, TIOCGWINSZ, TIOCNXCL, TIOCSPGRP, - TIOCSWINSZ, + TCFLSH, TCSBRK, TCXONC, TIOCGPGRP, TIOCGSID, TIOCGWINSZ, TIOCSPGRP, TIOCSWINSZ, }; #[inline] @@ -56,7 +54,7 @@ pub(crate) fn tcgetpgrp(fd: BorrowedFd<'_>) -> io::Result { #[inline] pub(crate) fn tcsetattr( - fd: BorrowedFd, + fd: BorrowedFd<'_>, optional_actions: OptionalActions, termios: &Termios, ) -> io::Result<()> { @@ -84,17 +82,17 @@ pub(crate) fn tcsetattr( } #[inline] -pub(crate) fn tcsendbreak(fd: BorrowedFd) -> io::Result<()> { +pub(crate) fn tcsendbreak(fd: BorrowedFd<'_>) -> io::Result<()> { unsafe { ret(syscall_readonly!(__NR_ioctl, fd, c_uint(TCSBRK), c_uint(0))) } } #[inline] -pub(crate) fn tcdrain(fd: BorrowedFd) -> io::Result<()> { +pub(crate) fn tcdrain(fd: BorrowedFd<'_>) -> io::Result<()> { unsafe { ret(syscall_readonly!(__NR_ioctl, fd, c_uint(TCSBRK), c_uint(1))) } } #[inline] -pub(crate) fn tcflush(fd: BorrowedFd, queue_selector: QueueSelector) -> io::Result<()> { +pub(crate) fn tcflush(fd: BorrowedFd<'_>, queue_selector: QueueSelector) -> io::Result<()> { unsafe { ret(syscall_readonly!( __NR_ioctl, @@ -106,7 +104,7 @@ pub(crate) fn tcflush(fd: BorrowedFd, queue_selector: QueueSelector) -> io::Resu } #[inline] -pub(crate) fn tcflow(fd: BorrowedFd, action: Action) -> io::Result<()> { +pub(crate) fn tcflow(fd: BorrowedFd<'_>, action: Action) -> io::Result<()> { unsafe { ret(syscall_readonly!( __NR_ioctl, @@ -118,7 +116,7 @@ pub(crate) fn tcflow(fd: BorrowedFd, action: Action) -> io::Result<()> { } #[inline] -pub(crate) fn tcgetsid(fd: BorrowedFd) -> io::Result { +pub(crate) fn tcgetsid(fd: BorrowedFd<'_>) -> io::Result { unsafe { let mut result = MaybeUninit::::uninit(); ret(syscall!(__NR_ioctl, fd, c_uint(TIOCGSID), &mut result))?; @@ -128,7 +126,7 @@ pub(crate) fn tcgetsid(fd: BorrowedFd) -> io::Result { } #[inline] -pub(crate) fn tcsetwinsize(fd: BorrowedFd, winsize: Winsize) -> io::Result<()> { +pub(crate) fn tcsetwinsize(fd: BorrowedFd<'_>, winsize: Winsize) -> io::Result<()> { unsafe { ret(syscall!( __NR_ioctl, @@ -144,16 +142,6 @@ pub(crate) fn tcsetpgrp(fd: BorrowedFd<'_>, pid: Pid) -> io::Result<()> { unsafe { ret(syscall!(__NR_ioctl, fd, c_uint(TIOCSPGRP), pid)) } } -#[inline] -pub(crate) fn ioctl_tiocexcl(fd: BorrowedFd<'_>) -> io::Result<()> { - unsafe { ret(syscall_readonly!(__NR_ioctl, fd, c_uint(TIOCEXCL))) } -} - -#[inline] -pub(crate) fn ioctl_tiocnxcl(fd: BorrowedFd<'_>) -> io::Result<()> { - unsafe { ret(syscall_readonly!(__NR_ioctl, fd, c_uint(TIOCNXCL))) } -} - /// A wrapper around a conceptual `cfsetspeed` which handles an arbitrary /// integer speed value. #[inline] @@ -240,8 +228,7 @@ pub(crate) fn isatty(fd: BorrowedFd<'_>) -> bool { tcgetwinsize(fd).is_ok() } -#[cfg(feature = "procfs")] -#[allow(unsafe_code)] +#[cfg(all(feature = "alloc", feature = "procfs"))] pub(crate) fn ttyname(fd: BorrowedFd<'_>, buf: &mut [MaybeUninit]) -> io::Result { let fd_stat = crate::backend::fs::syscalls::fstat(fd)?; @@ -256,7 +243,7 @@ pub(crate) fn ttyname(fd: BorrowedFd<'_>, buf: &mut [MaybeUninit]) -> io::Re // Get a fd to '/proc/self/fd'. let proc_self_fd = procfs::proc_self_fd()?; - // Gather the ttyname by reading the 'fd' file inside 'proc_self_fd'. + // Gather the ttyname by reading the "fd" file inside `proc_self_fd`. let r = crate::backend::fs::syscalls::readlinkat( proc_self_fd, DecInt::from_fd(fd).as_c_str(), diff --git a/vendor/rustix/src/backend/linux_raw/thread/futex.rs b/vendor/rustix/src/backend/linux_raw/thread/futex.rs index 4cde309a5..263e98070 100644 --- a/vendor/rustix/src/backend/linux_raw/thread/futex.rs +++ b/vendor/rustix/src/backend/linux_raw/thread/futex.rs @@ -9,6 +9,10 @@ bitflags::bitflags! { const PRIVATE = linux_raw_sys::general::FUTEX_PRIVATE_FLAG; /// `FUTEX_CLOCK_REALTIME` const CLOCK_REALTIME = linux_raw_sys::general::FUTEX_CLOCK_REALTIME; + + // This deliberately lacks a `const _ = !0`, so that users can use + // `from_bits_truncate` to extract the `SocketFlags` from a flags + // value that also includes a `SocketType`. } } diff --git a/vendor/rustix/src/backend/linux_raw/thread/mod.rs b/vendor/rustix/src/backend/linux_raw/thread/mod.rs index 8bb80c33a..6a002c632 100644 --- a/vendor/rustix/src/backend/linux_raw/thread/mod.rs +++ b/vendor/rustix/src/backend/linux_raw/thread/mod.rs @@ -1,4 +1,2 @@ -mod futex; +pub(crate) mod futex; pub(crate) mod syscalls; - -pub use futex::{FutexFlags, FutexOperation}; diff --git a/vendor/rustix/src/backend/linux_raw/thread/syscalls.rs b/vendor/rustix/src/backend/linux_raw/thread/syscalls.rs index f23b7c2df..0095eed79 100644 --- a/vendor/rustix/src/backend/linux_raw/thread/syscalls.rs +++ b/vendor/rustix/src/backend/linux_raw/thread/syscalls.rs @@ -3,8 +3,7 @@ //! # Safety //! //! See the `rustix::backend` module documentation for details. -#![allow(unsafe_code)] -#![allow(clippy::undocumented_unsafe_blocks)] +#![allow(unsafe_code, clippy::undocumented_unsafe_blocks)] use crate::backend::c; use crate::backend::conv::{ @@ -274,7 +273,7 @@ unsafe fn futex_old( } #[inline] -pub(crate) fn setns(fd: BorrowedFd, nstype: c::c_int) -> io::Result { +pub(crate) fn setns(fd: BorrowedFd<'_>, nstype: c::c_int) -> io::Result { unsafe { ret_c_int(syscall_readonly!(__NR_setns, fd, c_int(nstype))) } } diff --git a/vendor/rustix/src/backend/linux_raw/time/syscalls.rs b/vendor/rustix/src/backend/linux_raw/time/syscalls.rs index 634ce2674..27c3652a4 100644 --- a/vendor/rustix/src/backend/linux_raw/time/syscalls.rs +++ b/vendor/rustix/src/backend/linux_raw/time/syscalls.rs @@ -3,8 +3,7 @@ //! # Safety //! //! See the `rustix::backend` module documentation for details. -#![allow(unsafe_code)] -#![allow(clippy::undocumented_unsafe_blocks)] +#![allow(unsafe_code, clippy::undocumented_unsafe_blocks)] use crate::backend::conv::{ret, ret_infallible}; use crate::clockid::ClockId; diff --git a/vendor/rustix/src/backend/linux_raw/time/types.rs b/vendor/rustix/src/backend/linux_raw/time/types.rs index 62cb167e6..ab43aed7c 100644 --- a/vendor/rustix/src/backend/linux_raw/time/types.rs +++ b/vendor/rustix/src/backend/linux_raw/time/types.rs @@ -20,6 +20,9 @@ bitflags! { /// `TFD_CLOEXEC` const CLOEXEC = linux_raw_sys::general::TFD_CLOEXEC; + + /// + const _ = !0; } } @@ -35,6 +38,9 @@ bitflags! { /// `TFD_TIMER_CANCEL_ON_SET` const CANCEL_ON_SET = linux_raw_sys::general::TFD_TIMER_CANCEL_ON_SET; + + /// + const _ = !0; } } @@ -47,10 +53,10 @@ bitflags! { pub enum TimerfdClockId { /// `CLOCK_REALTIME`—A clock that tells the “real” time. /// - /// This is a clock that tells the amount of time elapsed since the - /// Unix epoch, 1970-01-01T00:00:00Z. The clock is externally settable, so - /// it is not monotonic. Successive reads may see decreasing times, so it - /// isn't reliable for measuring durations. + /// This is a clock that tells the amount of time elapsed since the Unix + /// epoch, 1970-01-01T00:00:00Z. The clock is externally settable, so it is + /// not monotonic. Successive reads may see decreasing times, so it isn't + /// reliable for measuring durations. Realtime = linux_raw_sys::general::CLOCK_REALTIME, /// `CLOCK_MONOTONIC`—A clock that tells an abstract time. diff --git a/vendor/rustix/src/backend/linux_raw/ugid/syscalls.rs b/vendor/rustix/src/backend/linux_raw/ugid/syscalls.rs index 12ff6dce1..5f1551e7c 100644 --- a/vendor/rustix/src/backend/linux_raw/ugid/syscalls.rs +++ b/vendor/rustix/src/backend/linux_raw/ugid/syscalls.rs @@ -3,8 +3,7 @@ //! # Safety //! //! See the `rustix::backend` module documentation for details. -#![allow(unsafe_code)] -#![allow(clippy::undocumented_unsafe_blocks)] +#![allow(unsafe_code, clippy::undocumented_unsafe_blocks)] use crate::backend::c; use crate::backend::conv::ret_usize_infallible; diff --git a/vendor/rustix/src/backend/linux_raw/vdso.rs b/vendor/rustix/src/backend/linux_raw/vdso.rs index 606aee7d1..1b0ae5375 100644 --- a/vendor/rustix/src/backend/linux_raw/vdso.rs +++ b/vendor/rustix/src/backend/linux_raw/vdso.rs @@ -13,12 +13,12 @@ #![allow(unsafe_code)] use super::c; -use super::elf::*; use crate::ffi::CStr; use crate::utils::check_raw_pointer; use core::ffi::c_void; use core::mem::size_of; use core::ptr::{null, null_mut}; +use linux_raw_sys::elf::*; pub(super) struct Vdso { // Load information @@ -143,28 +143,31 @@ fn init_from_sysinfo_ehdr() -> Option { match d.d_tag { DT_STRTAB => { vdso.symstrings = - check_raw_pointer::(vdso.addr_from_elf(d.d_val)? as *mut _)?.as_ptr(); + check_raw_pointer::(vdso.addr_from_elf(d.d_un.d_ptr)? as *mut _)? + .as_ptr(); } DT_SYMTAB => { vdso.symtab = - check_raw_pointer::(vdso.addr_from_elf(d.d_val)? as *mut _)? + check_raw_pointer::(vdso.addr_from_elf(d.d_un.d_ptr)? as *mut _)? .as_ptr(); } DT_HASH => { - hash = - check_raw_pointer::(vdso.addr_from_elf(d.d_val)? as *mut _)?.as_ptr(); + hash = check_raw_pointer::(vdso.addr_from_elf(d.d_un.d_ptr)? as *mut _)? + .as_ptr(); } DT_VERSYM => { vdso.versym = - check_raw_pointer::(vdso.addr_from_elf(d.d_val)? as *mut _)?.as_ptr(); + check_raw_pointer::(vdso.addr_from_elf(d.d_un.d_ptr)? as *mut _)? + .as_ptr(); } DT_VERDEF => { - vdso.verdef = - check_raw_pointer::(vdso.addr_from_elf(d.d_val)? as *mut _)? - .as_ptr(); + vdso.verdef = check_raw_pointer::( + vdso.addr_from_elf(d.d_un.d_ptr)? as *mut _, + )? + .as_ptr(); } DT_SYMENT => { - if d.d_val != size_of::() { + if d.d_un.d_ptr != size_of::() { return None; // Failed } } @@ -194,8 +197,8 @@ fn init_from_sysinfo_ehdr() -> Option { impl Vdso { /// Parse the vDSO. /// - /// Returns `None` if the vDSO can't be located or if it doesn't conform - /// to our expectations. + /// Returns `None` if the vDSO can't be located or if it doesn't conform to + /// our expectations. #[inline] pub(super) fn new() -> Option { init_from_sysinfo_ehdr() diff --git a/vendor/rustix/src/backend/linux_raw/vdso_wrappers.rs b/vendor/rustix/src/backend/linux_raw/vdso_wrappers.rs index 316d26a1c..1ff50415b 100644 --- a/vendor/rustix/src/backend/linux_raw/vdso_wrappers.rs +++ b/vendor/rustix/src/backend/linux_raw/vdso_wrappers.rs @@ -287,11 +287,10 @@ unsafe fn _rustix_clock_gettime_via_syscall_old( clockid: c::c_int, res: *mut Timespec, ) -> io::Result<()> { - // Ordinarily `rustix` doesn't like to emulate system calls, but in - // the case of time APIs, it's specific to Linux, specific to - // 32-bit architectures *and* specific to old kernel versions, and - // it's not that hard to fix up here, so that no other code needs - // to worry about this. + // Ordinarily `rustix` doesn't like to emulate system calls, but in the + // case of time APIs, it's specific to Linux, specific to 32-bit + // architectures *and* specific to old kernel versions, and it's not that + // hard to fix up here, so that no other code needs to worry about this. let mut old_result = MaybeUninit::<__kernel_old_timespec>::uninit(); let r0 = syscall!(__NR_clock_gettime, c_int(clockid), &mut old_result); match ret(r0) { diff --git a/vendor/rustix/src/bitcast.rs b/vendor/rustix/src/bitcast.rs index 3924c29d5..735101766 100644 --- a/vendor/rustix/src/bitcast.rs +++ b/vendor/rustix/src/bitcast.rs @@ -1,6 +1,7 @@ +#![allow(unused_macros)] + // Ensure that the source and destination types are both primitive integer // types and the same size, and then bitcast. -#[allow(unused_macros)] macro_rules! bitcast { ($x:expr) => {{ if false { @@ -24,7 +25,6 @@ macro_rules! bitcast { /// Return a [`bitcast`] of the value of `$x.bits()`, where `$x` is a /// `bitflags` type. -#[allow(unused_macros)] macro_rules! bitflags_bits { ($x:expr) => {{ bitcast!($x.bits()) diff --git a/vendor/rustix/src/check_types.rs b/vendor/rustix/src/check_types.rs index 861d7d7b5..bea04e0b7 100644 --- a/vendor/rustix/src/check_types.rs +++ b/vendor/rustix/src/check_types.rs @@ -1,3 +1,5 @@ +//! Macros for checking that types have the same layout as other types. + #![allow(unused_macros)] /// Check that the size and alignment of a type match the `sys` bindings. @@ -77,9 +79,9 @@ macro_rules! check_struct { // Check that we have all the fields. if false { + #[allow(unreachable_code)] let _test = $name { - // SAFETY: This code is guarded by `if false`. - $($field: unsafe { core::mem::zeroed() }),* + $($field: panic!()),* }; } diff --git a/vendor/rustix/src/event/kqueue.rs b/vendor/rustix/src/event/kqueue.rs index ff0ffddc0..05ee4d71b 100644 --- a/vendor/rustix/src/event/kqueue.rs +++ b/vendor/rustix/src/event/kqueue.rs @@ -99,6 +99,12 @@ impl Event { self.inner.udata as _ } + /// Get the raw data for this event. + pub fn data(&self) -> i64 { + // On some bsds, data is an isize and not an i64 + self.inner.data as _ + } + /// Get the filter of this event. pub fn filter(&self) -> EventFilter { match self.inner.filter as _ { @@ -256,6 +262,9 @@ bitflags::bitflags! { /// TODO const ERROR = c::EV_ERROR as _; + + /// + const _ = !0; } } @@ -284,6 +293,9 @@ bitflags::bitflags! { /// The link count of the file has changed. const LINK = c::NOTE_LINK; + + /// + const _ = !0; } } @@ -301,11 +313,14 @@ bitflags::bitflags! { /// The process executed a new process. const EXEC = c::NOTE_EXEC; - /// Follow the process through `fork()` calls (write only). + /// Follow the process through `fork` calls (write only). const TRACK = c::NOTE_TRACK; /// An error has occurred with following the process. const TRACKERR = c::NOTE_TRACKERR; + + /// + const _ = !0; } } @@ -335,6 +350,9 @@ bitflags::bitflags! { /// Trigger the event. const TRIGGER = c::NOTE_TRIGGER; + + /// + const _ = !0; } } diff --git a/vendor/rustix/src/event/mod.rs b/vendor/rustix/src/event/mod.rs index 192afdcaa..03abc9f12 100644 --- a/vendor/rustix/src/event/mod.rs +++ b/vendor/rustix/src/event/mod.rs @@ -1,15 +1,25 @@ //! Event operations. -#[cfg(any(linux_kernel, target_os = "freebsd", target_os = "illumos"))] +#[cfg(any( + linux_kernel, + target_os = "freebsd", + target_os = "illumos", + target_os = "espidf" +))] mod eventfd; -#[cfg(bsd)] +#[cfg(all(feature = "alloc", bsd))] pub mod kqueue; mod poll; #[cfg(solarish)] pub mod port; -#[cfg(linux_kernel)] +#[cfg(all(feature = "alloc", linux_kernel))] pub use crate::backend::event::epoll; -#[cfg(any(linux_kernel, target_os = "freebsd", target_os = "illumos"))] +#[cfg(any( + linux_kernel, + target_os = "freebsd", + target_os = "illumos", + target_os = "espidf" +))] pub use eventfd::{eventfd, EventfdFlags}; pub use poll::{poll, PollFd, PollFlags}; diff --git a/vendor/rustix/src/event/port.rs b/vendor/rustix/src/event/port.rs index b04f7c496..39fe5ac16 100644 --- a/vendor/rustix/src/event/port.rs +++ b/vendor/rustix/src/event/port.rs @@ -72,8 +72,8 @@ pub unsafe fn port_associate_fd( ) } -/// `port_dissociate(_, PORT_SOURCE_FD, _)`—Dissociates a file descriptor from -/// a port. +/// `port_dissociate(_, PORT_SOURCE_FD, _)`—Dissociates a file descriptor +/// from a port. /// /// # Safety /// @@ -116,6 +116,7 @@ pub fn port_get(port: impl AsFd, timeout: Option) -> io::Result /// /// [OpenSolaris]: https://www.unix.com/man-page/opensolaris/3C/port_getn/ /// [illumos]: https://illumos.org/man/3C/port_getn +#[cfg(feature = "alloc")] pub fn port_getn( port: impl AsFd, events: &mut Vec, diff --git a/vendor/rustix/src/ffi.rs b/vendor/rustix/src/ffi.rs index bd04a9cb4..ef9f87d81 100644 --- a/vendor/rustix/src/ffi.rs +++ b/vendor/rustix/src/ffi.rs @@ -9,8 +9,7 @@ pub use { // If we don't have std, we can depend on core and alloc having these features // in Rust 1.64+. +#[cfg(all(feature = "alloc", not(feature = "std")))] +pub use alloc::ffi::{CString, NulError}; #[cfg(not(feature = "std"))] -pub use { - alloc::ffi::{CString, NulError}, - core::ffi::{c_char, CStr, FromBytesWithNulError}, -}; +pub use core::ffi::{c_char, CStr, FromBytesWithNulError}; diff --git a/vendor/rustix/src/fs/abs.rs b/vendor/rustix/src/fs/abs.rs index 81e991772..f57bd00fe 100644 --- a/vendor/rustix/src/fs/abs.rs +++ b/vendor/rustix/src/fs/abs.rs @@ -1,7 +1,6 @@ //! POSIX-style filesystem functions which operate on bare paths. use crate::fd::OwnedFd; -use crate::ffi::{CStr, CString}; #[cfg(not(target_os = "espidf"))] use crate::fs::Access; #[cfg(not(any( @@ -17,9 +16,15 @@ use crate::fs::StatFs; #[cfg(not(any(target_os = "haiku", target_os = "redox", target_os = "wasi")))] use crate::fs::StatVfs; use crate::fs::{Mode, OFlags, Stat}; -use crate::path::SMALL_PATH_BUFFER_SIZE; +#[cfg(not(target_os = "wasi"))] +use crate::ugid::{Gid, Uid}; use crate::{backend, io, path}; -use alloc::vec::Vec; +#[cfg(feature = "alloc")] +use { + crate::ffi::{CStr, CString}, + crate::path::SMALL_PATH_BUFFER_SIZE, + alloc::vec::Vec, +}; /// `open(path, oflags, mode)`—Opens a file. /// @@ -101,11 +106,13 @@ pub fn lstat(path: P) -> io::Result { /// /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/readlink.html /// [Linux]: https://man7.org/linux/man-pages/man2/readlink.2.html +#[cfg(feature = "alloc")] #[inline] pub fn readlink>>(path: P, reuse: B) -> io::Result { path.into_with_c_str(|path| _readlink(path, reuse.into())) } +#[cfg(feature = "alloc")] fn _readlink(path: &CStr, mut buffer: Vec) -> io::Result { // This code would benefit from having a better way to read into // uninitialized memory, but that requires `unsafe`. @@ -170,12 +177,21 @@ pub fn rmdir(path: P) -> io::Result<()> { /// `link(old_path, new_path)`—Creates a hard link. /// +/// POSIX leaves it implementation-defined whether `link` follows a symlink in +/// `old_path`, or creates a new link to the symbolic link itself. On platforms +/// which have it, [`linkat`] avoids this problem since it has an [`AtFlags`] +/// paramter and the [`AtFlags::SYMLINK_FOLLOW`] flag determines whether +/// symlinks should be followed. +/// /// # References /// - [POSIX] /// - [Linux] /// /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/link.html /// [Linux]: https://man7.org/linux/man-pages/man2/link.2.html +/// [`linkat`]: crate::fs::linkat +/// [`AtFlags`]: crate::fs::AtFlags +/// [`AtFlags::SYMLINK_FOLLOW`]: crate::fs::AtFlags::SYMLINK_FOLLOW #[inline] pub fn link(old_path: P, new_path: Q) -> io::Result<()> { old_path.into_with_c_str(|old_path| { @@ -266,3 +282,17 @@ pub fn statfs(path: P) -> io::Result { pub fn statvfs(path: P) -> io::Result { path.into_with_c_str(backend::fs::syscalls::statvfs) } + +/// `chown(path, owner, group)`—Sets open file or directory ownership. +/// +/// # References +/// - [POSIX] +/// - [Linux] +/// +/// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/chown.html +/// [Linux]: https://man7.org/linux/man-pages/man2/chown.2.html +#[cfg(not(target_os = "wasi"))] +#[inline] +pub fn chown(path: P, owner: Option, group: Option) -> io::Result<()> { + path.into_with_c_str(|path| backend::fs::syscalls::chown(path, owner, group)) +} diff --git a/vendor/rustix/src/fs/at.rs b/vendor/rustix/src/fs/at.rs index 5bd90fab5..0434b56ef 100644 --- a/vendor/rustix/src/fs/at.rs +++ b/vendor/rustix/src/fs/at.rs @@ -3,26 +3,32 @@ //! The `dirfd` argument to these functions may be a file descriptor for a //! directory, or the special value [`CWD`]. //! -//! [`cwd`]: crate::fs::cwd::CWD +//! [`cwd`]: crate::fs::CWD use crate::fd::OwnedFd; -use crate::ffi::{CStr, CString}; #[cfg(apple)] use crate::fs::CloneFlags; #[cfg(not(any(apple, target_os = "espidf", target_os = "wasi")))] use crate::fs::FileType; #[cfg(linux_kernel)] use crate::fs::RenameFlags; +#[cfg(not(any(target_os = "aix", target_os = "espidf")))] +use crate::fs::Stat; #[cfg(not(any(target_os = "espidf", target_os = "wasi")))] use crate::fs::{Gid, Uid}; use crate::fs::{Mode, OFlags}; -use crate::path::SMALL_PATH_BUFFER_SIZE; use crate::{backend, io, path}; -use alloc::vec::Vec; -use backend::fd::{AsFd, BorrowedFd}; +use backend::fd::AsFd; +#[cfg(feature = "alloc")] +use { + crate::ffi::{CStr, CString}, + crate::path::SMALL_PATH_BUFFER_SIZE, + alloc::vec::Vec, + backend::fd::BorrowedFd, +}; #[cfg(not(target_os = "espidf"))] use { - crate::fs::{Access, AtFlags, Stat, Timestamps}, + crate::fs::{Access, AtFlags, Timestamps}, crate::timespec::Nsecs, }; @@ -76,6 +82,7 @@ pub fn openat( /// /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/readlinkat.html /// [Linux]: https://man7.org/linux/man-pages/man2/readlinkat.2.html +#[cfg(feature = "alloc")] #[inline] pub fn readlinkat>>( dirfd: Fd, @@ -85,6 +92,7 @@ pub fn readlinkat>>( path.into_with_c_str(|path| _readlinkat(dirfd.as_fd(), path, reuse.into())) } +#[cfg(feature = "alloc")] #[allow(unsafe_code)] fn _readlinkat(dirfd: BorrowedFd<'_>, path: &CStr, mut buffer: Vec) -> io::Result { buffer.clear(); @@ -96,8 +104,10 @@ fn _readlinkat(dirfd: BorrowedFd<'_>, path: &CStr, mut buffer: Vec) -> io::R debug_assert!(nread <= buffer.capacity()); if nread < buffer.capacity() { - // SAFETY from the man page: + // SAFETY: From the [documentation]: // "On success, these calls return the number of bytes placed in buf." + // + // [documentation]: https://man7.org/linux/man-pages/man2/readlinkat.2.html unsafe { buffer.set_len(nread); } @@ -280,7 +290,8 @@ pub fn symlinkat( /// [Linux]: https://man7.org/linux/man-pages/man2/fstatat.2.html /// [`Mode::from_raw_mode`]: crate::fs::Mode::from_raw_mode /// [`FileType::from_raw_mode`]: crate::fs::FileType::from_raw_mode -#[cfg(not(target_os = "espidf"))] +// TODO: Add `stat64xat` to upstream libc bindings and reenable this for AIX. +#[cfg(not(any(target_os = "aix", target_os = "espidf")))] #[inline] #[doc(alias = "fstatat")] pub fn statat(dirfd: Fd, path: P, flags: AtFlags) -> io::Result { diff --git a/vendor/rustix/src/fs/fcntl.rs b/vendor/rustix/src/fs/fcntl.rs index f7f4790cb..facbc9fa3 100644 --- a/vendor/rustix/src/fs/fcntl.rs +++ b/vendor/rustix/src/fs/fcntl.rs @@ -15,7 +15,7 @@ use crate::{backend, io}; use backend::fd::AsFd; use backend::fs::types::OFlags; -// These `fcntl` functions like in the `io` module because they're not specific +// These `fcntl` functions live in the `io` module because they're not specific // to files, directories, or memfd objects. We re-export them here in the `fs` // module because the other the `fcntl` functions are here. #[cfg(not(any(target_os = "espidf", target_os = "wasi")))] diff --git a/vendor/rustix/src/fs/fd.rs b/vendor/rustix/src/fs/fd.rs index 43b2e57b1..94de43daa 100644 --- a/vendor/rustix/src/fs/fd.rs +++ b/vendor/rustix/src/fs/fd.rs @@ -105,7 +105,7 @@ pub fn tell(fd: Fd) -> io::Result { backend::fs::syscalls::tell(fd.as_fd()) } -/// `fchmod(fd)`—Sets open file or directory permissions. +/// `fchmod(fd, mode)`—Sets open file or directory permissions. /// /// This implementation does not support `O_PATH` file descriptors, even on /// platforms where the host libc emulates it. @@ -122,7 +122,7 @@ pub fn fchmod(fd: Fd, mode: Mode) -> io::Result<()> { backend::fs::syscalls::fchmod(fd.as_fd(), mode) } -/// `fchown(fd)`—Sets open file or directory ownership. +/// `fchown(fd, owner, group)`—Sets open file or directory ownership. /// /// # References /// - [POSIX] @@ -256,7 +256,7 @@ pub(crate) fn _is_file_read_write(fd: BorrowedFd<'_>) -> io::Result<(bool, bool) let mode = backend::fs::syscalls::fcntl_getfl(fd)?; // Check for `O_PATH`. - #[cfg(any(linux_kernel, target_os = "fuchsia", target_os = "emscripten"))] + #[cfg(any(linux_kernel, target_os = "emscripten", target_os = "fuchsia"))] if mode.contains(OFlags::PATH) { return Ok((false, false)); } diff --git a/vendor/rustix/src/fs/ioctl.rs b/vendor/rustix/src/fs/ioctl.rs index 28e0c8588..75222752f 100644 --- a/vendor/rustix/src/fs/ioctl.rs +++ b/vendor/rustix/src/fs/ioctl.rs @@ -1,11 +1,17 @@ //! Filesystem-oriented `ioctl` functions. +#![allow(unsafe_code)] + #[cfg(linux_kernel)] use { crate::fd::AsFd, - crate::{backend, io}, + crate::{backend, io, ioctl}, + backend::c, }; +#[cfg(all(linux_kernel, not(any(target_arch = "sparc", target_arch = "sparc64"))))] +use crate::fd::{AsRawFd, BorrowedFd}; + /// `ioctl(fd, BLKSSZGET)`—Returns the logical block size of a block device. /// /// This is mentioned in the [Linux `openat` manual page]. @@ -15,7 +21,11 @@ use { #[inline] #[doc(alias = "BLKSSZGET")] pub fn ioctl_blksszget(fd: Fd) -> io::Result { - backend::fs::syscalls::ioctl_blksszget(fd.as_fd()) + // SAFETY: BLZSSZGET is a getter opcode that gets a u32. + unsafe { + let ctl = ioctl::Getter::, c::c_uint>::new(); + ioctl::ioctl(fd, ctl) + } } /// `ioctl(fd, BLKPBSZGET)`—Returns the physical block size of a block device. @@ -23,7 +33,11 @@ pub fn ioctl_blksszget(fd: Fd) -> io::Result { #[inline] #[doc(alias = "BLKPBSZGET")] pub fn ioctl_blkpbszget(fd: Fd) -> io::Result { - backend::fs::syscalls::ioctl_blkpbszget(fd.as_fd()) + // SAFETY: BLKPBSZGET is a getter opcode that gets a u32. + unsafe { + let ctl = ioctl::Getter::, c::c_uint>::new(); + ioctl::ioctl(fd, ctl) + } } /// `ioctl(fd, FICLONE, src_fd)`—Share data between open files. @@ -38,7 +52,7 @@ pub fn ioctl_blkpbszget(fd: Fd) -> io::Result { #[inline] #[doc(alias = "FICLONE")] pub fn ioctl_ficlone(fd: Fd, src_fd: SrcFd) -> io::Result<()> { - backend::fs::syscalls::ioctl_ficlone(fd.as_fd(), src_fd.as_fd()) + unsafe { ioctl::ioctl(fd, Ficlone(src_fd.as_fd())) } } /// `ioctl(fd, EXT4_IOC_RESIZE_FS, blocks)`—Resize ext4 filesystem on fd. @@ -46,5 +60,33 @@ pub fn ioctl_ficlone(fd: Fd, src_fd: SrcFd) -> io::Result #[inline] #[doc(alias = "EXT4_IOC_RESIZE_FS")] pub fn ext4_ioc_resize_fs(fd: Fd, blocks: u64) -> io::Result<()> { - backend::fs::syscalls::ext4_ioc_resize_fs(fd.as_fd(), blocks) + // SAFETY: EXT4_IOC_RESIZE_FS is a pointer setter opcode. + unsafe { + let ctl = ioctl::Setter::, u64>::new( + blocks, + ); + ioctl::ioctl(fd, ctl) + } +} + +#[cfg(all(linux_kernel, not(any(target_arch = "sparc", target_arch = "sparc64"))))] +struct Ficlone<'a>(BorrowedFd<'a>); + +#[cfg(all(linux_kernel, not(any(target_arch = "sparc", target_arch = "sparc64"))))] +unsafe impl ioctl::Ioctl for Ficlone<'_> { + type Output = (); + + const IS_MUTATING: bool = false; + const OPCODE: ioctl::Opcode = ioctl::Opcode::old(c::FICLONE as ioctl::RawOpcode); + + fn as_ptr(&mut self) -> *mut c::c_void { + self.0.as_raw_fd() as *mut c::c_void + } + + unsafe fn output_from_ptr( + _: ioctl::IoctlOutput, + _: *mut c::c_void, + ) -> io::Result { + Ok(()) + } } diff --git a/vendor/rustix/src/fs/mod.rs b/vendor/rustix/src/fs/mod.rs index fbfaa12c9..1ea0d1351 100644 --- a/vendor/rustix/src/fs/mod.rs +++ b/vendor/rustix/src/fs/mod.rs @@ -9,7 +9,7 @@ mod copy_file_range; #[cfg(not(any(target_os = "espidf", target_os = "redox")))] #[cfg(not(target_os = "haiku"))] // Haiku needs mod cwd; -#[cfg(not(any(target_os = "espidf", target_os = "redox")))] +#[cfg(all(feature = "alloc", not(any(target_os = "espidf", target_os = "redox"))))] mod dir; #[cfg(not(any( apple, @@ -71,7 +71,7 @@ pub use copy_file_range::copy_file_range; #[cfg(not(any(target_os = "espidf", target_os = "redox")))] #[cfg(not(target_os = "haiku"))] // Haiku needs pub use cwd::*; -#[cfg(not(any(target_os = "espidf", target_os = "redox")))] +#[cfg(all(feature = "alloc", not(any(target_os = "espidf", target_os = "redox"))))] pub use dir::{Dir, DirEntry}; #[cfg(not(any( apple, diff --git a/vendor/rustix/src/fs/mount.rs b/vendor/rustix/src/fs/mount.rs index d1e6a8238..0f04b7f69 100644 --- a/vendor/rustix/src/fs/mount.rs +++ b/vendor/rustix/src/fs/mount.rs @@ -3,43 +3,53 @@ //! These have been moved to a new `rustix::mount` module. #[deprecated(note = "rustix::fs::UnmountFlags` moved to `rustix::mount::UnmountFlags`.")] +#[doc(hidden)] pub use crate::mount::UnmountFlags; #[deprecated(note = "rustix::fs::MountFlags` moved to `rustix::mount::MountFlags`.")] +#[doc(hidden)] pub use crate::mount::MountFlags; #[deprecated( note = "rustix::fs::MountPropagationFlags` moved to `rustix::mount::MountPropagationFlags`." )] +#[doc(hidden)] pub use crate::mount::MountPropagationFlags; #[deprecated(note = "`rustix::fs::mount` moved to `rustix::mount::mount`.")] +#[doc(hidden)] pub use crate::mount::mount; #[deprecated(note = "`rustix::fs::unmount` moved to `rustix::mount::unmount`.")] +#[doc(hidden)] pub use crate::mount::unmount; #[deprecated( note = "`rustix::fs::remount` is renamed and moved to `rustix::mount::mount_remount`." )] +#[doc(hidden)] pub use crate::mount::mount_remount as remount; #[deprecated( note = "`rustix::fs::bind_mount` is renamed and moved to `rustix::mount::mount_bind`." )] +#[doc(hidden)] pub use crate::mount::mount_bind as bind_mount; #[deprecated( note = "`rustix::fs::recursive_bind_mount` is renamed and moved to `rustix::mount::mount_recursive_bind`." )] +#[doc(hidden)] pub use crate::mount::mount_recursive_bind as recursive_bind_mount; #[deprecated( note = "`rustix::fs::change_mount` is renamed and moved to `rustix::mount::mount_change`." )] +#[doc(hidden)] pub use crate::mount::mount_change as change_mount; #[deprecated( note = "`rustix::fs::move_mount` is renamed and moved to `rustix::mount::mount_move`." )] +#[doc(hidden)] pub use crate::mount::mount_move as move_mount; diff --git a/vendor/rustix/src/fs/raw_dir.rs b/vendor/rustix/src/fs/raw_dir.rs index 3131e0649..fd8aefa3a 100644 --- a/vendor/rustix/src/fs/raw_dir.rs +++ b/vendor/rustix/src/fs/raw_dir.rs @@ -136,7 +136,7 @@ impl<'buf, Fd: AsFd> RawDir<'buf, Fd> { } } -/// A raw directory entry, similar to `std::fs::DirEntry`. +/// A raw directory entry, similar to [`std::fs::DirEntry`]. /// /// Unlike the std version, this may represent the `.` or `..` entries. pub struct RawDirEntry<'a> { @@ -193,10 +193,10 @@ impl<'buf, Fd: AsFd> RawDir<'buf, Fd> { /// with GAT support once one becomes available. #[allow(unsafe_code)] #[allow(clippy::should_implement_trait)] - pub fn next(&mut self) -> Option> { + pub fn next(&mut self) -> Option>> { if self.is_buffer_empty() { match getdents_uninit(self.fd.as_fd(), self.buf) { - Ok(bytes_read) if bytes_read == 0 => return None, + Ok(0) => return None, Ok(bytes_read) => { self.initialized = bytes_read; self.offset = 0; diff --git a/vendor/rustix/src/fs/seek_from.rs b/vendor/rustix/src/fs/seek_from.rs index cca23ed62..c08abd2e6 100644 --- a/vendor/rustix/src/fs/seek_from.rs +++ b/vendor/rustix/src/fs/seek_from.rs @@ -4,9 +4,12 @@ /// Enumeration of possible methods to seek within an I/O object. /// -/// It is used by the [`Seek`] trait. +/// It is used by the [`seek`] function. /// -/// [`Seek`]: std::io::Seek +/// This is similar to [`std::io::SeekFrom`], however it adds platform-specific +/// seek options. +/// +/// [`seek`]: crate::fs::seek #[derive(Copy, PartialEq, Eq, Clone, Debug)] #[cfg_attr(staged_api, stable(feature = "rust1", since = "1.0.0"))] pub enum SeekFrom { @@ -30,19 +33,21 @@ pub enum SeekFrom { #[cfg_attr(staged_api, stable(feature = "rust1", since = "1.0.0"))] Current(#[cfg_attr(staged_api, stable(feature = "rust1", since = "1.0.0"))] i64), - /// Sets the offset to the current position plus the specified number of bytes, - /// plus the distance to the next byte which is not in a hole. + /// Sets the offset to the current position plus the specified number of + /// bytes, plus the distance to the next byte which is not in a hole. /// - /// If the offset is in a hole at the end of the file, the seek will produce - /// an `NXIO` error. - #[cfg(any(freebsdlike, target_os = "linux", target_os = "solaris"))] + /// If the offset is in a hole at the end of the file, the seek will fail + /// with [`Errno::NXIO`]. + /// + /// [`Errno::NXIO`]: crate::io::Errno::NXIO + #[cfg(any(apple, freebsdlike, linux_kernel, solarish))] Data(i64), - /// Sets the offset to the current position plus the specified number of bytes, - /// plus the distance to the next byte which is in a hole. + /// Sets the offset to the current position plus the specified number of + /// bytes, plus the distance to the next byte which is in a hole. /// - /// If there is no hole past the offset, it will be set to the end of the file - /// i.e. there is an implicit hole at the end of any file. - #[cfg(any(freebsdlike, target_os = "linux", target_os = "solaris"))] + /// If there is no hole past the offset, it will be set to the end of the + /// file i.e. there is an implicit hole at the end of any file. + #[cfg(any(apple, freebsdlike, linux_kernel, solarish))] Hole(i64), } diff --git a/vendor/rustix/src/fs/statx.rs b/vendor/rustix/src/fs/statx.rs index 32ae84ed3..1791697af 100644 --- a/vendor/rustix/src/fs/statx.rs +++ b/vendor/rustix/src/fs/statx.rs @@ -21,6 +21,35 @@ use compat::statx as _statx; /// # References /// - [Linux] /// +/// # Examples +/// +/// ``` +/// # use std::path::Path; +/// # use std::io; +/// # use rustix::fs::{AtFlags, StatxFlags}; +/// # use rustix::fd::BorrowedFd; +/// /// Try to determine if the provided path is a mount root. Will return `Ok(None)` if +/// /// the kernel is not new enough to support statx() or [`libc::STATX_ATTR_MOUNT_ROOT`]. +/// fn is_mountpoint(root: BorrowedFd<'_>, path: &Path) -> io::Result> { +/// use rustix::fs::{AtFlags, StatxFlags}; +/// +/// let mountroot_flag = libc::STATX_ATTR_MOUNT_ROOT as u64; +/// match rustix::fs::statx( +/// root, +/// path, +/// AtFlags::NO_AUTOMOUNT | AtFlags::SYMLINK_NOFOLLOW, +/// StatxFlags::empty(), +/// ) { +/// Ok(r) => { +/// let present = (r.stx_attributes_mask & mountroot_flag) > 0; +/// Ok(present.then(|| r.stx_attributes & mountroot_flag > 0)) +/// } +/// Err(e) if e == rustix::io::Errno::NOSYS => Ok(None), +/// Err(e) => Err(e.into()), +/// } +/// } +/// ``` +/// /// [Linux]: https://man7.org/linux/man-pages/man2/statx.2.html #[inline] pub fn statx( diff --git a/vendor/rustix/src/fs/xattr.rs b/vendor/rustix/src/fs/xattr.rs index 01fe7d569..53612f71f 100644 --- a/vendor/rustix/src/fs/xattr.rs +++ b/vendor/rustix/src/fs/xattr.rs @@ -14,6 +14,9 @@ bitflags! { /// `XATTR_REPLACE` const REPLACE = c::XATTR_REPLACE as c::c_uint; + + /// + const _ = !0; } } diff --git a/vendor/rustix/src/io/errno.rs b/vendor/rustix/src/io/errno.rs index 7640d3111..2b72de005 100644 --- a/vendor/rustix/src/io/errno.rs +++ b/vendor/rustix/src/io/errno.rs @@ -12,31 +12,6 @@ use std::error; /// A specialized [`Result`] type for `rustix` APIs. pub type Result = result::Result; -/// `errno`—An error code. -/// -/// The error type for `rustix` APIs. This is similar to `std::io::Error`, but -/// only holds an OS error code, and no extra error value. -/// -/// # References -/// - [POSIX] -/// - [Linux] -/// - [Winsock2] -/// - [FreeBSD] -/// - [NetBSD] -/// - [OpenBSD] -/// - [DragonFly BSD] -/// - [illumos] -/// - [glibc] -/// -/// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/errno.html -/// [Linux]: https://man7.org/linux/man-pages/man3/errno.3.html -/// [Winsock2]: https://learn.microsoft.com/en-us/windows/win32/winsock/windows-sockets-error-codes-2 -/// [FreeBSD]: https://man.freebsd.org/cgi/man.cgi?errno -/// [NetBSD]: https://man.netbsd.org/errno.2 -/// [OpenBSD]: https://man.openbsd.org/errno.2 -/// [DragonFly BSD]: https://man.dragonflybsd.org/?command=errno§ion=2 -/// [illumos]: https://illumos.org/man/3C/errno -/// [glibc]: https://www.gnu.org/software/libc/manual/html_node/Error-Codes.html pub use backend::io::errno::Errno; impl Errno { diff --git a/vendor/rustix/src/io/ioctl.rs b/vendor/rustix/src/io/ioctl.rs index d9bfa1fb3..e85719a4d 100644 --- a/vendor/rustix/src/io/ioctl.rs +++ b/vendor/rustix/src/io/ioctl.rs @@ -6,7 +6,10 @@ //! Some ioctls, such as those related to filesystems, terminals, and //! processes, live in other top-level API modules. -use crate::{backend, io}; +#![allow(unsafe_code)] + +use crate::{backend, io, ioctl}; +use backend::c; use backend::fd::AsFd; /// `ioctl(fd, FIOCLEX, NULL)`—Set the close-on-exec flag. @@ -26,7 +29,11 @@ use backend::fd::AsFd; #[doc(alias = "FIOCLEX")] #[doc(alias = "FD_CLOEXEC")] pub fn ioctl_fioclex(fd: Fd) -> io::Result<()> { - backend::io::syscalls::ioctl_fioclex(fd.as_fd()) + // SAFETY: FIOCLEX is a no-argument setter opcode. + unsafe { + let ctl = ioctl::NoArg::>::new(); + ioctl::ioctl(fd, ctl) + } } /// `ioctl(fd, FIONBIO, &value)`—Enables or disables non-blocking mode. @@ -42,7 +49,11 @@ pub fn ioctl_fioclex(fd: Fd) -> io::Result<()> { #[inline] #[doc(alias = "FIONBIO")] pub fn ioctl_fionbio(fd: Fd, value: bool) -> io::Result<()> { - backend::io::syscalls::ioctl_fionbio(fd.as_fd(), value) + // SAFETY: FIONBIO is a pointer setter opcode. + unsafe { + let ctl = ioctl::Setter::, c::c_int>::new(value.into()); + ioctl::ioctl(fd, ctl) + } } /// `ioctl(fd, FIONREAD)`—Returns the number of bytes ready to be read. @@ -66,5 +77,9 @@ pub fn ioctl_fionbio(fd: Fd, value: bool) -> io::Result<()> { #[inline] #[doc(alias = "FIONREAD")] pub fn ioctl_fionread(fd: Fd) -> io::Result { - backend::io::syscalls::ioctl_fionread(fd.as_fd()) + // SAFETY: FIONREAD is a getter opcode that gets a c_int. + unsafe { + let ctl = ioctl::Getter::, c::c_int>::new(); + ioctl::ioctl(fd, ctl).map(|n| n as u64) + } } diff --git a/vendor/rustix/src/io_uring.rs b/vendor/rustix/src/io_uring.rs index 93feb2780..09a4d6d62 100644 --- a/vendor/rustix/src/io_uring.rs +++ b/vendor/rustix/src/io_uring.rs @@ -27,7 +27,7 @@ use crate::fd::{AsFd, BorrowedFd, OwnedFd, RawFd}; use crate::{backend, io}; use core::ffi::c_void; -use core::mem::{zeroed, MaybeUninit}; +use core::mem::MaybeUninit; use core::ptr::{null_mut, write_bytes}; use linux_raw_sys::net; @@ -120,6 +120,12 @@ bitflags::bitflags! { /// `IORING_ENTER_EXT_ARG` const EXT_ARG = sys::IORING_ENTER_EXT_ARG; + + /// `IORING_ENTER_REGISTERED_RING` + const REGISTERED_RING = sys::IORING_ENTER_REGISTERED_RING; + + /// + const _ = !0; } } @@ -455,6 +461,9 @@ bitflags::bitflags! { /// `IORING_SETUP_DEFER_TASKRUN` const DEFER_TASKRUN = sys::IORING_SETUP_DEFER_TASKRUN; + + /// + const _ = !0; } } @@ -483,6 +492,9 @@ bitflags::bitflags! { /// `1 << IOSQE_CQE_SKIP_SUCCESS_BIT` const CQE_SKIP_SUCCESS = 1 << sys::IOSQE_CQE_SKIP_SUCCESS_BIT as u8; + + /// + const _ = !0; } } @@ -502,6 +514,9 @@ bitflags::bitflags! { /// `IORING_CQE_F_NOTIF` const NOTIF = bitcast!(sys::IORING_CQE_F_NOTIF); + + /// + const _ = !0; } } @@ -512,6 +527,9 @@ bitflags::bitflags! { pub struct IoringFsyncFlags: u32 { /// `IORING_FSYNC_DATASYNC` const DATASYNC = sys::IORING_FSYNC_DATASYNC; + + /// + const _ = !0; } } @@ -544,6 +562,9 @@ bitflags::bitflags! { /// `IORING_LINK_TIMEOUT_UPDATE` const LINK_TIMEOUT_UPDATE = sys::IORING_LINK_TIMEOUT_UPDATE; + + /// + const _ = !0; } } @@ -554,6 +575,9 @@ bitflags::bitflags! { pub struct SpliceFlags: u32 { /// `SPLICE_F_FD_IN_FIXED` const FD_IN_FIXED = sys::SPLICE_F_FD_IN_FIXED; + + /// + const _ = !0; } } @@ -564,6 +588,9 @@ bitflags::bitflags! { pub struct IoringMsgringFlags: u32 { /// `IORING_MSG_RING_CQE_SKIP` const CQE_SKIP = sys::IORING_MSG_RING_CQE_SKIP; + + /// + const _ = !0; } } @@ -583,6 +610,9 @@ bitflags::bitflags! { /// `IORING_ASYNC_CANCEL_FD` const FD_FIXED = sys::IORING_ASYNC_CANCEL_FD_FIXED; + + /// + const _ = !0; } } @@ -629,6 +659,9 @@ bitflags::bitflags! { /// `IORING_FEAT_LINKED_FILE` const LINKED_FILE = sys::IORING_FEAT_LINKED_FILE; + + /// + const _ = !0; } } @@ -639,6 +672,9 @@ bitflags::bitflags! { pub struct IoringOpFlags: u16 { /// `IO_URING_OP_SUPPORTED` const SUPPORTED = sys::IO_URING_OP_SUPPORTED as _; + + /// + const _ = !0; } } @@ -649,6 +685,9 @@ bitflags::bitflags! { pub struct IoringRsrcFlags: u32 { /// `IORING_RSRC_REGISTER_SPARSE` const REGISTER_SPARSE = sys::IORING_RSRC_REGISTER_SPARSE as _; + + /// + const _ = !0; } } @@ -665,6 +704,9 @@ bitflags::bitflags! { /// `IORING_SQ_TASKRUN` const TASKRUN = sys::IORING_SQ_TASKRUN; + + /// + const _ = !0; } } @@ -675,6 +717,9 @@ bitflags::bitflags! { pub struct IoringCqFlags: u32 { /// `IORING_CQ_EVENTFD_DISABLED` const EVENTFD_DISABLED = sys::IORING_CQ_EVENTFD_DISABLED; + + /// + const _ = !0; } } @@ -694,6 +739,9 @@ bitflags::bitflags! { /// `IORING_POLL_ADD_LEVEL` const ADD_LEVEL = sys::IORING_POLL_ADD_LEVEL; + + /// + const _ = !0; } } @@ -714,6 +762,9 @@ bitflags::bitflags! { /// `IORING_SEND_ZC_REPORT_USAGE` (since Linux 6.2) const ZC_REPORT_USAGE = sys::IORING_SEND_ZC_REPORT_USAGE as _; + + /// + const _ = !0; } } @@ -734,6 +785,9 @@ bitflags::bitflags! { /// /// See also [`IoringSendFlags::FIXED_BUF`]. const FIXED_BUF = sys::IORING_RECVSEND_FIXED_BUF as _; + + /// + const _ = !0; } } @@ -744,6 +798,9 @@ bitflags::bitflags! { pub struct IoringAcceptFlags: u16 { /// `IORING_ACCEPT_MULTISHOT` const MULTISHOT = sys::IORING_ACCEPT_MULTISHOT as _; + + /// + const _ = !0; } } @@ -766,6 +823,9 @@ bitflags::bitflags! { /// `MSG_ERRQUEUE` const ERRQUEUE = net::MSG_ERRQUEUE; + + /// + const _ = !0; } } @@ -1245,72 +1305,63 @@ pub struct io_uring_buf { impl Default for ioprio_union { #[inline] fn default() -> Self { - // SAFETY: All of Linux's io_uring structs may be zero-initialized. - unsafe { zeroed::() } + default_union!(ioprio_union, ioprio) } } impl Default for len_union { #[inline] fn default() -> Self { - // SAFETY: All of Linux's io_uring structs may be zero-initialized. - unsafe { zeroed::() } + default_union!(len_union, len) } } impl Default for off_or_addr2_union { #[inline] fn default() -> Self { - // SAFETY: All of Linux's io_uring structs may be zero-initialized. - unsafe { zeroed::() } + default_union!(off_or_addr2_union, off) } } impl Default for addr_or_splice_off_in_union { #[inline] fn default() -> Self { - // SAFETY: All of Linux's io_uring structs may be zero-initialized. - unsafe { zeroed::() } + default_union!(addr_or_splice_off_in_union, splice_off_in) } } impl Default for addr3_or_cmd_union { #[inline] fn default() -> Self { - // SAFETY: All of Linux's io_uring structs may be zero-initialized. - unsafe { zeroed::() } + default_union!(addr3_or_cmd_union, addr3) } } impl Default for op_flags_union { #[inline] fn default() -> Self { - // SAFETY: All of Linux's io_uring structs may be zero-initialized. - unsafe { zeroed::() } + default_union!(op_flags_union, sync_range_flags) } } impl Default for buf_union { #[inline] fn default() -> Self { - // SAFETY: All of Linux's io_uring structs may be zero-initialized. - unsafe { zeroed::() } + default_union!(buf_union, buf_index) } } impl Default for splice_fd_in_or_file_index_union { #[inline] fn default() -> Self { - // SAFETY: All of Linux's io_uring structs may be zero-initialized. - unsafe { zeroed::() } + default_union!(splice_fd_in_or_file_index_union, splice_fd_in) } } impl Default for register_or_sqe_op_or_sqe_flags_union { #[inline] fn default() -> Self { - // SAFETY: All of Linux's io_uring structs may be zero-initialized. - unsafe { zeroed::() } + default_union!(register_or_sqe_op_or_sqe_flags_union, sqe_flags) } } diff --git a/vendor/rustix/src/ioctl/bsd.rs b/vendor/rustix/src/ioctl/bsd.rs new file mode 100644 index 000000000..66b75b54b --- /dev/null +++ b/vendor/rustix/src/ioctl/bsd.rs @@ -0,0 +1,24 @@ +//! `ioctl` opcode behavior for Linux platforms. + +use super::{Direction, RawOpcode}; + +pub(super) const fn compose_opcode( + dir: Direction, + group: RawOpcode, + num: RawOpcode, + size: RawOpcode, +) -> RawOpcode { + let dir = match dir { + Direction::None => NONE, + Direction::Read => READ, + Direction::Write => WRITE, + Direction::ReadWrite => READ | WRITE, + }; + + dir | num | (group << 8) | ((size & IOCPARAM_MASK) << 16) +} + +pub const NONE: RawOpcode = 0x2000_0000; +pub const WRITE: RawOpcode = 0x4000_0000; +pub const READ: RawOpcode = 0x8000_0000; +pub const IOCPARAM_MASK: RawOpcode = 0x1FFF; diff --git a/vendor/rustix/src/ioctl/linux.rs b/vendor/rustix/src/ioctl/linux.rs new file mode 100644 index 000000000..9dc278656 --- /dev/null +++ b/vendor/rustix/src/ioctl/linux.rs @@ -0,0 +1,83 @@ +//! `ioctl` opcode behavior for Linux platforms. + +use super::{Direction, RawOpcode}; +use consts::*; + +/// Compose an opcode from its component parts. +pub(super) const fn compose_opcode( + dir: Direction, + group: RawOpcode, + num: RawOpcode, + size: RawOpcode, +) -> RawOpcode { + macro_rules! shift_and_mask { + ($val:expr, $shift:expr, $mask:expr) => {{ + ($val << $shift) & $mask + }}; + } + + let dir = match dir { + Direction::None => NONE, + Direction::Read => READ, + Direction::Write => WRITE, + Direction::ReadWrite => READ | WRITE, + }; + + shift_and_mask!(group, GROUP_SHIFT, GROUP_MASK) + | shift_and_mask!(num, NUM_SHIFT, NUM_MASK) + | shift_and_mask!(size, SIZE_SHIFT, SIZE_MASK) + | shift_and_mask!(dir, DIR_SHIFT, DIR_MASK) +} + +const NUM_BITS: RawOpcode = 8; +const GROUP_BITS: RawOpcode = 8; + +const NUM_SHIFT: RawOpcode = 0; +const GROUP_SHIFT: RawOpcode = NUM_SHIFT + NUM_BITS; +const SIZE_SHIFT: RawOpcode = GROUP_SHIFT + GROUP_BITS; +const DIR_SHIFT: RawOpcode = SIZE_SHIFT + SIZE_BITS; + +const NUM_MASK: RawOpcode = (1 << NUM_BITS) - 1; +const GROUP_MASK: RawOpcode = (1 << GROUP_BITS) - 1; +const SIZE_MASK: RawOpcode = (1 << SIZE_BITS) - 1; +const DIR_MASK: RawOpcode = (1 << DIR_BITS) - 1; + +#[cfg(any( + target_arch = "x86", + target_arch = "arm", + target_arch = "s390x", + target_arch = "x86_64", + target_arch = "aarch64", + target_arch = "riscv32", + target_arch = "riscv64", + target_arch = "loongarch64" +))] +mod consts { + use super::RawOpcode; + + pub(super) const NONE: RawOpcode = 0; + pub(super) const READ: RawOpcode = 2; + pub(super) const WRITE: RawOpcode = 1; + pub(super) const SIZE_BITS: RawOpcode = 14; + pub(super) const DIR_BITS: RawOpcode = 2; +} + +#[cfg(any( + target_arch = "mips", + target_arch = "mips32r6", + target_arch = "mips64", + target_arch = "mips64r6", + target_arch = "powerpc", + target_arch = "powerpc64", + target_arch = "sparc", + target_arch = "sparc64" +))] +mod consts { + use super::RawOpcode; + + pub(super) const NONE: RawOpcode = 1; + pub(super) const READ: RawOpcode = 2; + pub(super) const WRITE: RawOpcode = 4; + pub(super) const SIZE_BITS: RawOpcode = 13; + pub(super) const DIR_BITS: RawOpcode = 3; +} diff --git a/vendor/rustix/src/ioctl/mod.rs b/vendor/rustix/src/ioctl/mod.rs new file mode 100644 index 000000000..bf2215ab6 --- /dev/null +++ b/vendor/rustix/src/ioctl/mod.rs @@ -0,0 +1,338 @@ +//! Unsafe `ioctl` API. +//! +//! Unix systems expose a number of `ioctl`'s. `ioctl`s have been adopted as a +//! general purpose system call for making calls into the kernel. In addition +//! to the wide variety of system calls that are included by default in the +//! kernel, many drivers expose their own `ioctl`'s for controlling their +//! behavior, some of which are proprietary. Therefore it is impossible to make +//! a safe interface for every `ioctl` call, as they all have wildly varying +//! semantics. +//! +//! This module provides an unsafe interface to write your own `ioctl` API. To +//! start, create a type that implements [`Ioctl`]. Then, pass it to [`ioctl`] +//! to make the `ioctl` call. + +#![allow(unsafe_code)] + +use crate::backend::c; +use crate::fd::{AsFd, BorrowedFd}; +use crate::io::Result; + +#[cfg(any(linux_kernel, bsd))] +use core::mem; + +pub use patterns::*; + +mod patterns; + +#[cfg(linux_kernel)] +mod linux; + +#[cfg(bsd)] +mod bsd; + +#[cfg(linux_kernel)] +use linux as platform; + +#[cfg(bsd)] +use bsd as platform; + +/// Perform an `ioctl` call. +/// +/// `ioctl` was originally intended to act as a way of modifying the behavior +/// of files, but has since been adopted as a general purpose system call for +/// making calls into the kernel. In addition to the default calls exposed by +/// generic file descriptors, many drivers expose their own `ioctl` calls for +/// controlling their behavior, some of which are proprietary. +/// +/// This crate exposes many other `ioctl` interfaces with safe and idiomatic +/// wrappers, like [`ioctl_fionbio`](crate::io::ioctl_fionbio) and +/// [`ioctl_fionread`](crate::io::ioctl_fionread). It is recommended to use +/// those instead of this function, as they are safer and more idiomatic. +/// For other cases, implement the [`Ioctl`] API and pass it to this function. +/// +/// See documentation for [`Ioctl`] for more information. +/// +/// # Safety +/// +/// While [`Ioctl`] takes much of the unsafety out of `ioctl` calls, it is +/// still unsafe to call this code with arbitrary device drivers, as it is up +/// to the device driver to implement the `ioctl` call correctly. It is on the +/// onus of the protocol between the user and the driver to ensure that the +/// `ioctl` call is safe to make. +/// +/// # References +/// +/// - [Linux] +/// - [WinSock2] +/// - [FreeBSD] +/// - [NetBSD] +/// - [OpenBSD] +/// - [Apple] +/// - [Solaris] +/// - [illumos] +/// +/// [Linux]: https://man7.org/linux/man-pages/man2/ioctl.2.html +/// [Winsock2]: https://learn.microsoft.com/en-us/windows/win32/api/winsock/nf-winsock-ioctlsocket +/// [FreeBSD]: https://man.freebsd.org/cgi/man.cgi?query=ioctl&sektion=2 +/// [NetBSD]: https://man.netbsd.org/ioctl.2 +/// [OpenBSD]: https://man.openbsd.org/ioctl.2 +/// [Apple]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/ioctl.2.html +/// [Solaris]: https://docs.oracle.com/cd/E23824_01/html/821-1463/ioctl-2.html +/// [illumos]: https://illumos.org/man/2/ioctl +#[inline] +pub unsafe fn ioctl(fd: F, mut ioctl: I) -> Result { + let fd = fd.as_fd(); + let request = I::OPCODE.raw(); + let arg = ioctl.as_ptr(); + + // SAFETY: The variant of `Ioctl` asserts that this is a valid IOCTL call to + // make. + let output = if I::IS_MUTATING { + _ioctl(fd, request, arg)? + } else { + _ioctl_readonly(fd, request, arg)? + }; + + // SAFETY: The variant of `Ioctl` asserts that this is a valid pointer to the + // output data. + I::output_from_ptr(output, arg) +} + +unsafe fn _ioctl( + fd: BorrowedFd<'_>, + request: RawOpcode, + arg: *mut c::c_void, +) -> Result { + crate::backend::io::syscalls::ioctl(fd, request, arg) +} + +unsafe fn _ioctl_readonly( + fd: BorrowedFd<'_>, + request: RawOpcode, + arg: *mut c::c_void, +) -> Result { + crate::backend::io::syscalls::ioctl_readonly(fd, request, arg) +} + +/// A trait defining the properties of an `ioctl` command. +/// +/// Objects implementing this trait can be passed to [`ioctl`] to make an +/// `ioctl` call. The contents of the object represent the inputs to the +/// `ioctl` call. The inputs must be convertible to a pointer through the +/// `as_ptr` method. In most cases, this involves either casting a number to a +/// pointer, or creating a pointer to the actual data. The latter case is +/// necessary for `ioctl` calls that modify userspace data. +/// +/// # Safety +/// +/// This trait is unsafe to implement because it is impossible to guarantee +/// that the `ioctl` call is safe. The `ioctl` call may be proprietary, or it +/// may be unsafe to call in certain circumstances. +/// +/// By implementing this trait, you guarantee that: +/// +/// - The `ioctl` call expects the input provided by `as_ptr` and produces the +/// output as indicated by `output`. +/// - That `output_from_ptr` can safely take the pointer from `as_ptr` and cast +/// it to the correct type, *only* after the `ioctl` call. +/// - That `OPCODE` uniquely identifies the `ioctl` call. +/// - That, for whatever platforms you are targeting, the `ioctl` call is safe +/// to make. +/// - If `IS_MUTATING` is false, that no userspace data will be modified by the +/// `ioctl` call. +pub unsafe trait Ioctl { + /// The type of the output data. + /// + /// Given a pointer, one should be able to construct an instance of this + /// type. + type Output; + + /// The opcode used by this `ioctl` command. + /// + /// There are different types of opcode depending on the operation. See + /// documentation for the [`Opcode`] struct for more information. + const OPCODE: Opcode; + + /// Does the `ioctl` mutate any data in the userspace? + /// + /// If the `ioctl` call does not mutate any data in the userspace, then + /// making this `false` enables optimizations that can make the call + /// faster. When in doubt, set this to `true`. + /// + /// # Safety + /// + /// This should only be set to `false` if the `ioctl` call does not mutate + /// any data in the userspace. Undefined behavior may occur if this is set + /// to `false` when it should be `true`. + const IS_MUTATING: bool; + + /// Get a pointer to the data to be passed to the `ioctl` command. + /// + /// See trait-level documentation for more information. + fn as_ptr(&mut self) -> *mut c::c_void; + + /// Cast the output data to the correct type. + /// + /// # Safety + /// + /// The `extract_output` value must be the resulting value after a + /// successful `ioctl` call, and `out` is the direct return value of an + /// `ioctl` call that did not fail. In this case `extract_output` is the + /// pointer that was passed to the `ioctl` call. + unsafe fn output_from_ptr( + out: IoctlOutput, + extract_output: *mut c::c_void, + ) -> Result; +} + +/// The opcode used by an `Ioctl`. +#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] +pub struct Opcode { + /// The raw opcode. + raw: RawOpcode, +} + +impl Opcode { + /// Create a new old `Opcode` from a raw opcode. + /// + /// Rather than being a composition of several attributes, old opcodes are + /// just numbers. In general most drivers follow stricter conventions, but + /// older drivers may still use this strategy. + #[inline] + pub const fn old(raw: RawOpcode) -> Self { + Self { raw } + } + + /// Create a new opcode from a direction, group, number and size. + #[cfg(any(linux_kernel, bsd))] + #[inline] + pub const fn from_components( + direction: Direction, + group: u8, + number: u8, + data_size: usize, + ) -> Self { + if data_size > RawOpcode::MAX as usize { + panic!("data size is too large"); + } + + Self::old(platform::compose_opcode( + direction, + group as RawOpcode, + number as RawOpcode, + data_size as RawOpcode, + )) + } + + /// Create a new non-mutating opcode from a group, a number and the type of + /// data. + #[cfg(any(linux_kernel, bsd))] + #[inline] + pub const fn none(group: u8, number: u8) -> Self { + Self::from_components(Direction::None, group, number, mem::size_of::()) + } + + /// Create a new reading opcode from a group, a number and the type of + /// data. + #[cfg(any(linux_kernel, bsd))] + #[inline] + pub const fn read(group: u8, number: u8) -> Self { + Self::from_components(Direction::Read, group, number, mem::size_of::()) + } + + /// Create a new writing opcode from a group, a number and the type of + /// data. + #[cfg(any(linux_kernel, bsd))] + #[inline] + pub const fn write(group: u8, number: u8) -> Self { + Self::from_components(Direction::Write, group, number, mem::size_of::()) + } + + /// Create a new reading and writing opcode from a group, a number and the + /// type of data. + #[cfg(any(linux_kernel, bsd))] + #[inline] + pub const fn read_write(group: u8, number: u8) -> Self { + Self::from_components(Direction::ReadWrite, group, number, mem::size_of::()) + } + + /// Get the raw opcode. + #[inline] + pub fn raw(self) -> RawOpcode { + self.raw + } +} + +/// The direction that an `ioctl` is going. +/// +/// Note that this is relative to userspace. `Read` means reading data from the +/// kernel, and write means the kernel writing data to userspace. +#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] +pub enum Direction { + /// None of the above. + None, + + /// Read data from the kernel. + Read, + + /// Write data to the kernel. + Write, + + /// Read and write data to the kernel. + ReadWrite, +} + +/// The type used by the `ioctl` to signify the output. +pub type IoctlOutput = c::c_int; + +/// The type used by the `ioctl` to signify the command. +pub type RawOpcode = _RawOpcode; + +// Under raw Linux, this is an `unsigned int`. +#[cfg(linux_raw)] +type _RawOpcode = c::c_uint; + +// On libc Linux with GNU libc or uclibc, this is an `unsigned long`. +#[cfg(all( + not(linux_raw), + target_os = "linux", + any(target_env = "gnu", target_env = "uclibc") +))] +type _RawOpcode = c::c_ulong; + +// Musl uses `c_int`. +#[cfg(all( + not(linux_raw), + target_os = "linux", + not(target_env = "gnu"), + not(target_env = "uclibc") +))] +type _RawOpcode = c::c_int; + +// Android uses `c_int`. +#[cfg(all(not(linux_raw), target_os = "android"))] +type _RawOpcode = c::c_int; + +// BSD, Haiku, and Redox use `unsigned long`. +#[cfg(any(bsd, target_os = "redox", target_os = "haiku"))] +type _RawOpcode = c::c_ulong; + +// AIX, Emscripten, Fuchsia, Solaris, and WASI use a `int`. +#[cfg(any( + solarish, + target_os = "aix", + target_os = "fuchsia", + target_os = "emscripten", + target_os = "wasi", + target_os = "nto" +))] +type _RawOpcode = c::c_int; + +// ESP-IDF uses a `c_uint`. +#[cfg(target_os = "espidf")] +type _RawOpcode = c::c_uint; + +// Windows has `ioctlsocket`, which uses `i32`. +#[cfg(windows)] +type _RawOpcode = i32; diff --git a/vendor/rustix/src/ioctl/patterns.rs b/vendor/rustix/src/ioctl/patterns.rs new file mode 100644 index 000000000..4b33d7d80 --- /dev/null +++ b/vendor/rustix/src/ioctl/patterns.rs @@ -0,0 +1,202 @@ +//! Implements typical patterns for `ioctl` usage. + +use super::{Ioctl, IoctlOutput, Opcode, RawOpcode}; + +use crate::backend::c; +use crate::io::Result; + +use core::marker::PhantomData; +use core::{fmt, mem}; + +/// Implements an `ioctl` with no real arguments. +pub struct NoArg { + /// The opcode. + _opcode: PhantomData, +} + +impl fmt::Debug for NoArg { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_tuple("NoArg").field(&Opcode::OPCODE).finish() + } +} + +impl NoArg { + /// Create a new no-argument `ioctl` object. + /// + /// # Safety + /// + /// - `Opcode` must provide a valid opcode. + #[inline] + pub unsafe fn new() -> Self { + Self { + _opcode: PhantomData, + } + } +} + +unsafe impl Ioctl for NoArg { + type Output = (); + + const IS_MUTATING: bool = false; + const OPCODE: self::Opcode = Opcode::OPCODE; + + fn as_ptr(&mut self) -> *mut c::c_void { + core::ptr::null_mut() + } + + unsafe fn output_from_ptr(_: IoctlOutput, _: *mut c::c_void) -> Result { + Ok(()) + } +} + +/// Implements the traditional "getter" pattern for `ioctl`s. +/// +/// Some `ioctl`s just read data into the userspace. As this is a popular +/// pattern this structure implements it. +pub struct Getter { + /// The output data. + output: mem::MaybeUninit, + + /// The opcode. + _opcode: PhantomData, +} + +impl fmt::Debug for Getter { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_tuple("Getter").field(&Opcode::OPCODE).finish() + } +} + +impl Getter { + /// Create a new getter-style `ioctl` object. + /// + /// # Safety + /// + /// - `Opcode` must provide a valid opcode. + /// - For this opcode, `Output` must be the type that the kernel expects to + /// write into. + #[inline] + pub unsafe fn new() -> Self { + Self { + output: mem::MaybeUninit::uninit(), + _opcode: PhantomData, + } + } +} + +unsafe impl Ioctl for Getter { + type Output = Output; + + const IS_MUTATING: bool = true; + const OPCODE: self::Opcode = Opcode::OPCODE; + + fn as_ptr(&mut self) -> *mut c::c_void { + self.output.as_mut_ptr().cast() + } + + unsafe fn output_from_ptr(_: IoctlOutput, ptr: *mut c::c_void) -> Result { + Ok(ptr.cast::().read()) + } +} + +/// Implements the pattern for `ioctl`s where a pointer argument is given to +/// the `ioctl`. +/// +/// The opcode must be read-only. +pub struct Setter { + /// The input data. + input: Input, + + /// The opcode. + _opcode: PhantomData, +} + +impl fmt::Debug for Setter { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_tuple("Setter") + .field(&Opcode::OPCODE) + .field(&self.input) + .finish() + } +} + +impl Setter { + /// Create a new pointer setter-style `ioctl` object. + /// + /// # Safety + /// + /// - `Opcode` must provide a valid opcode. + /// - For this opcode, `Input` must be the type that the kernel expects to + /// get. + #[inline] + pub unsafe fn new(input: Input) -> Self { + Self { + input, + _opcode: PhantomData, + } + } +} + +unsafe impl Ioctl for Setter { + type Output = (); + + const IS_MUTATING: bool = false; + const OPCODE: self::Opcode = Opcode::OPCODE; + + fn as_ptr(&mut self) -> *mut c::c_void { + &mut self.input as *mut Input as *mut c::c_void + } + + unsafe fn output_from_ptr(_: IoctlOutput, _: *mut c::c_void) -> Result { + Ok(()) + } +} + +/// Trait for something that provides an `ioctl` opcode at compile time. +pub trait CompileTimeOpcode { + /// The opcode. + const OPCODE: Opcode; +} + +/// Provides a bad opcode at compile time. +pub struct BadOpcode; + +impl CompileTimeOpcode for BadOpcode { + const OPCODE: Opcode = Opcode::old(OPCODE); +} + +/// Provides a read code at compile time. +#[cfg(any(linux_kernel, bsd))] +pub struct ReadOpcode(Data); + +#[cfg(any(linux_kernel, bsd))] +impl CompileTimeOpcode for ReadOpcode { + const OPCODE: Opcode = Opcode::read::(GROUP, NUM); +} + +/// Provides a write code at compile time. +#[cfg(any(linux_kernel, bsd))] +pub struct WriteOpcode(Data); + +#[cfg(any(linux_kernel, bsd))] +impl CompileTimeOpcode for WriteOpcode { + const OPCODE: Opcode = Opcode::write::(GROUP, NUM); +} + +/// Provides a read/write code at compile time. +#[cfg(any(linux_kernel, bsd))] +pub struct ReadWriteOpcode(Data); + +#[cfg(any(linux_kernel, bsd))] +impl CompileTimeOpcode for ReadWriteOpcode { + const OPCODE: Opcode = Opcode::read_write::(GROUP, NUM); +} + +/// Provides a `None` code at compile time. +#[cfg(any(linux_kernel, bsd))] +pub struct NoneOpcode(Data); + +#[cfg(any(linux_kernel, bsd))] +impl CompileTimeOpcode for NoneOpcode { + const OPCODE: Opcode = Opcode::none::(GROUP, NUM); +} diff --git a/vendor/rustix/src/lib.rs b/vendor/rustix/src/lib.rs index 988525e5f..a23006f9c 100644 --- a/vendor/rustix/src/lib.rs +++ b/vendor/rustix/src/lib.rs @@ -55,7 +55,8 @@ //! - Path arguments use [`Arg`], so they accept any string type. //! - File descriptors are passed and returned via [`AsFd`] and [`OwnedFd`] //! instead of bare integers, ensuring I/O safety. -//! - Constants use `enum`s and [`bitflags`] types. +//! - Constants use `enum`s and [`bitflags`] types, and enable [support for +//! externally defined flags]. //! - Multiplexed functions (eg. `fcntl`, `ioctl`, etc.) are de-multiplexed. //! - Variadic functions (eg. `openat`, etc.) are presented as non-variadic. //! - Functions that return strings automatically allocate sufficient memory @@ -93,6 +94,7 @@ //! [I/O-safe]: https://github.com/rust-lang/rfcs/blob/master/text/3128-io-safety.md //! [`Result`]: https://doc.rust-lang.org/stable/std/result/enum.Result.html //! [`Arg`]: https://docs.rs/rustix/*/rustix/path/trait.Arg.html +//! [support for externally defined flags]: https://docs.rs/bitflags/latest/bitflags/#externally-defined-flags #![deny(missing_docs)] #![allow(stable_features)] @@ -102,10 +104,11 @@ #![cfg_attr(all(wasi_ext, target_os = "wasi", feature = "std"), feature(wasi_ext))] #![cfg_attr(core_ffi_c, feature(core_ffi_c))] #![cfg_attr(core_c_str, feature(core_c_str))] -#![cfg_attr(alloc_c_string, feature(alloc_c_string))] -#![cfg_attr(alloc_ffi, feature(alloc_ffi))] +#![cfg_attr(all(feature = "alloc", alloc_c_string), feature(alloc_c_string))] +#![cfg_attr(all(feature = "alloc", alloc_ffi), feature(alloc_ffi))] #![cfg_attr(not(feature = "std"), no_std)] #![cfg_attr(feature = "rustc-dep-of-std", feature(ip))] +#![cfg_attr(feature = "rustc-dep-of-std", allow(internal_features))] #![cfg_attr( any(feature = "rustc-dep-of-std", core_intrinsics), feature(core_intrinsics) @@ -120,7 +123,7 @@ // conditionalizing all the `use`s for them. #![cfg_attr(any(target_os = "redox", target_os = "wasi"), allow(unused_imports))] -#[cfg(not(feature = "rustc-dep-of-std"))] +#[cfg(all(feature = "alloc", not(feature = "rustc-dep-of-std")))] extern crate alloc; // Use `static_assertions` macros if we have them, or a polyfill otherwise. @@ -137,6 +140,7 @@ mod static_assertions; #[cfg(not(windows))] #[macro_use] pub(crate) mod cstr; +#[macro_use] pub(crate) mod utils; // Polyfill for `std` in `no_std` builds. #[cfg_attr(feature = "std", path = "maybe_polyfill/std/mod.rs")] @@ -189,20 +193,7 @@ pub mod event; #[cfg(not(windows))] pub mod ffi; #[cfg(not(windows))] -#[cfg(any( - feature = "fs", - all( - linux_raw, - not(feature = "use-libc-auxv"), - not(target_vendor = "mustang"), - any( - feature = "param", - feature = "runtime", - feature = "time", - target_arch = "x86", - ) - ) -))] +#[cfg(feature = "fs")] #[cfg_attr(doc_cfg, doc(cfg(feature = "fs")))] pub mod fs; pub mod io; @@ -210,6 +201,7 @@ pub mod io; #[cfg(feature = "io_uring")] #[cfg_attr(doc_cfg, doc(cfg(feature = "io_uring")))] pub mod io_uring; +pub mod ioctl; #[cfg(not(any(windows, target_os = "espidf", target_os = "wasi")))] #[cfg(feature = "mm")] #[cfg_attr(doc_cfg, doc(cfg(feature = "mm")))] @@ -227,22 +219,7 @@ pub mod net; #[cfg_attr(doc_cfg, doc(cfg(feature = "param")))] pub mod param; #[cfg(not(windows))] -#[cfg(any( - feature = "fs", - feature = "mount", - feature = "net", - all( - linux_raw, - not(feature = "use-libc-auxv"), - not(target_vendor = "mustang"), - any( - feature = "param", - feature = "runtime", - feature = "time", - target_arch = "x86", - ) - ) -))] +#[cfg(any(feature = "fs", feature = "mount", feature = "net"))] #[cfg_attr( doc_cfg, doc(cfg(any(feature = "fs", feature = "mount", feature = "net"))) @@ -294,7 +271,7 @@ pub mod time; #[cfg(not(windows))] #[cfg(feature = "runtime")] #[cfg(linux_raw)] -#[doc(hidden)] +#[cfg_attr(not(document_experimental_runtime_api), doc(hidden))] #[cfg_attr(doc_cfg, doc(cfg(feature = "runtime")))] pub mod runtime; @@ -304,6 +281,40 @@ pub mod runtime; #[cfg(all(feature = "fs", not(feature = "mount")))] pub(crate) mod mount; +// Declare "fs" as a non-public module if "fs" isn't enabled but we need it for +// reading procfs. +#[cfg(not(windows))] +#[cfg(not(feature = "fs"))] +#[cfg(all( + linux_raw, + not(feature = "use-libc-auxv"), + not(feature = "use-explicitly-provided-auxv"), + any( + feature = "param", + feature = "runtime", + feature = "time", + target_arch = "x86", + ) +))] +#[cfg_attr(doc_cfg, doc(cfg(feature = "fs")))] +pub(crate) mod fs; + +// Similarly, declare `path` as a non-public module if needed. +#[cfg(not(windows))] +#[cfg(not(any(feature = "fs", feature = "mount", feature = "net")))] +#[cfg(all( + linux_raw, + not(feature = "use-libc-auxv"), + not(feature = "use-explicitly-provided-auxv"), + any( + feature = "param", + feature = "runtime", + feature = "time", + target_arch = "x86", + ) +))] +pub(crate) mod path; + // Private modules used by multiple public modules. #[cfg(not(any(windows, target_os = "espidf")))] #[cfg(any(feature = "thread", feature = "time", target_arch = "x86"))] @@ -333,7 +344,7 @@ mod signal; all( linux_raw, not(feature = "use-libc-auxv"), - not(target_vendor = "mustang"), + not(feature = "use-explicitly-provided-auxv"), any( feature = "param", feature = "runtime", @@ -351,7 +362,7 @@ mod timespec; all( linux_raw, not(feature = "use-libc-auxv"), - not(target_vendor = "mustang"), + not(feature = "use-explicitly-provided-auxv"), any( feature = "param", feature = "runtime", diff --git a/vendor/rustix/src/maybe_polyfill/no_std/mod.rs b/vendor/rustix/src/maybe_polyfill/no_std/mod.rs index ab088d862..84bf5b764 100644 --- a/vendor/rustix/src/maybe_polyfill/no_std/mod.rs +++ b/vendor/rustix/src/maybe_polyfill/no_std/mod.rs @@ -1,11 +1,12 @@ //! Polyfill of parts of the standard library for `no_std` builds. //! -//! All code in this subtree is derived from the standard library and licensed MIT or Apache 2.0 -//! at your option. +//! All code in this subtree is derived from the standard library and licensed +//! MIT or Apache 2.0 at your option. //! -//! This implementation is used when `std` is not available and polyfills the necessary items from -//! `std`. When the `std` feature is specified (so the standard library is available), the file -//! `src/polyfill/std` is used instead, which just imports the respective items from `std`. +//! This implementation is used when `std` is not available and polyfills the +//! necessary items from `std`. When the `std` feature is specified (so the +//! standard library is available), the file `src/polyfill/std` is used +//! instead, which just imports the respective items from `std`. #[cfg(not(windows))] pub mod io; diff --git a/vendor/rustix/src/maybe_polyfill/no_std/net/ip_addr.rs b/vendor/rustix/src/maybe_polyfill/no_std/net/ip_addr.rs index ffa5302e3..81415e960 100644 --- a/vendor/rustix/src/maybe_polyfill/no_std/net/ip_addr.rs +++ b/vendor/rustix/src/maybe_polyfill/no_std/net/ip_addr.rs @@ -1653,7 +1653,7 @@ impl Ipv6Addr { && !self.is_benchmarking() } - /// Returns the address's multicast scope if the address is multicast. + /// Returns the address' multicast scope if the address is multicast. /// /// # Examples /// diff --git a/vendor/rustix/src/maybe_polyfill/no_std/os/fd/owned.rs b/vendor/rustix/src/maybe_polyfill/no_std/os/fd/owned.rs index 90b6f4712..fffe34bff 100644 --- a/vendor/rustix/src/maybe_polyfill/no_std/os/fd/owned.rs +++ b/vendor/rustix/src/maybe_polyfill/no_std/os/fd/owned.rs @@ -115,6 +115,42 @@ impl OwnedFd { } } +impl BorrowedFd<'_> { + /// Creates a new `OwnedFd` instance that shares the same underlying file + /// description as the existing `BorrowedFd` instance. + #[cfg(not(any(target_arch = "wasm32", target_os = "hermit")))] + #[cfg_attr(staged_api, stable(feature = "io_safety", since = "1.63.0"))] + pub fn try_clone_to_owned(&self) -> crate::io::Result { + // Avoid using file descriptors below 3 as they are used for stdio + + // We want to atomically duplicate this file descriptor and set the + // CLOEXEC flag, and currently that's done via F_DUPFD_CLOEXEC. This + // is a POSIX flag that was added to Linux in 2.6.24. + #[cfg(not(target_os = "espidf"))] + let fd = crate::io::fcntl_dupfd_cloexec(self, 3)?; + + // For ESP-IDF, F_DUPFD is used instead, because the CLOEXEC semantics + // will never be supported, as this is a bare metal framework with + // no capabilities for multi-process execution. While F_DUPFD is also + // not supported yet, it might be (currently it returns ENOSYS). + #[cfg(target_os = "espidf")] + let fd = crate::io::fcntl_dupfd(self, 3)?; + + Ok(fd) + } + + /// Creates a new `OwnedFd` instance that shares the same underlying file + /// description as the existing `BorrowedFd` instance. + #[cfg(any(target_arch = "wasm32", target_os = "hermit"))] + #[cfg_attr(staged_api, stable(feature = "io_safety", since = "1.63.0"))] + pub fn try_clone_to_owned(&self) -> crate::io::Result { + Err(crate::io::const_io_error!( + crate::io::ErrorKind::Unsupported, + "operation not supported on WASI yet", + )) + } +} + #[cfg_attr(staged_api, unstable(feature = "io_safety", issue = "87074"))] impl AsRawFd for BorrowedFd<'_> { #[inline] diff --git a/vendor/rustix/src/maybe_polyfill/std/mod.rs b/vendor/rustix/src/maybe_polyfill/std/mod.rs index 92b5cab5b..bcaceb9fb 100644 --- a/vendor/rustix/src/maybe_polyfill/std/mod.rs +++ b/vendor/rustix/src/maybe_polyfill/std/mod.rs @@ -1,8 +1,10 @@ -//! Imports from `std` that would be polyfilled for `no_std` builds (see `src/polyfill/no_std`). +//! Imports from `std` that would be polyfilled for `no_std` builds (see +//! `src/polyfill/no_std`). //! -//! This implementation is used when `std` is available and just imports the necessary items from -//! `std`. For `no_std` builds, the file `src/polyfill/no_std` is used instead, which doesn't -//! depend on the standard library. +//! This implementation is used when `std` is available and just imports the +//! necessary items from `std`. For `no_std` builds, the file +//! `src/polyfill/no_std` is used instead, which doesn't depend on the standard +//! library. #[cfg(not(windows))] pub mod io { diff --git a/vendor/rustix/src/net/send_recv/msg.rs b/vendor/rustix/src/net/send_recv/msg.rs index 5fefb2e24..431aefa03 100644 --- a/vendor/rustix/src/net/send_recv/msg.rs +++ b/vendor/rustix/src/net/send_recv/msg.rs @@ -107,8 +107,8 @@ impl<'buf, 'slice, 'fd> SendAncillaryBuffer<'buf, 'slice, 'fd> { /// Returns a pointer to the message data. pub(crate) fn as_control_ptr(&mut self) -> *mut u8 { - // When the length is zero, we may be using a `&[]` address, which - // may be an invalid but non-null pointer, and on some platforms, that + // When the length is zero, we may be using a `&[]` address, which may + // be an invalid but non-null pointer, and on some platforms, that // causes `sendmsg` to fail with `EFAULT` or `EINVAL` #[cfg(not(linux_kernel))] if self.length == 0 { @@ -227,8 +227,8 @@ impl<'buf> RecvAncillaryBuffer<'buf> { /// Returns a pointer to the message data. pub(crate) fn as_control_ptr(&mut self) -> *mut u8 { - // When the length is zero, we may be using a `&[]` address, which - // may be an invalid but non-null pointer, and on some platforms, that + // When the length is zero, we may be using a `&[]` address, which may + // be an invalid but non-null pointer, and on some platforms, that // causes `sendmsg` to fail with `EFAULT` or `EINVAL` #[cfg(not(linux_kernel))] if self.buffer.is_empty() { @@ -686,9 +686,9 @@ impl DoubleEndedIterator for AncillaryIter<'_, T> { mod messages { use crate::backend::c; + use crate::backend::net::msghdr; use core::iter::FusedIterator; use core::marker::PhantomData; - use core::mem::zeroed; use core::ptr::NonNull; /// An iterator over the messages in an ancillary buffer. @@ -709,7 +709,7 @@ mod messages { /// Create a new iterator over messages from a byte buffer. pub(super) fn new(buf: &'buf mut [u8]) -> Self { let msghdr = { - let mut h: c::msghdr = unsafe { zeroed() }; + let mut h = msghdr::zero_msghdr(); h.msg_control = buf.as_mut_ptr().cast(); h.msg_controllen = buf.len().try_into().expect("buffer too large for msghdr"); h diff --git a/vendor/rustix/src/net/socket.rs b/vendor/rustix/src/net/socket.rs index 23cc00aed..8727ca53b 100644 --- a/vendor/rustix/src/net/socket.rs +++ b/vendor/rustix/src/net/socket.rs @@ -13,7 +13,8 @@ pub use backend::net::addr::SocketAddrUnix; /// however it is not safe in general to rely on this, as file descriptors may /// be unexpectedly allocated on other threads or in libraries. /// -/// To pass extra flags such as [`SocketFlags::CLOEXEC`], use [`socket_with`]. +/// To pass extra flags such as [`SocketFlags::CLOEXEC`] or +/// [`SocketFlags::NONBLOCK`], use [`socket_with`]. /// /// # References /// - [Beej's Guide to Network Programming] @@ -82,6 +83,7 @@ pub fn socket( /// [DragonFly BSD]: https://man.dragonflybsd.org/?command=socket§ion=2 /// [illumos]: https://illumos.org/man/3SOCKET/socket /// [glibc]: https://www.gnu.org/software/libc/manual/html_node/Creating-a-Socket.html +#[doc(alias("socket"))] #[inline] pub fn socket_with( domain: AddressFamily, @@ -271,6 +273,10 @@ pub fn bind_unix(sockfd: Fd, addr: &SocketAddrUnix) -> io::Result<()> /// `connect(sockfd, addr)`—Initiates a connection to an IP address. /// +/// On Windows, a non-blocking socket returns [`Errno::WOULDBLOCK`] if the +/// connection cannot be completed immediately, rather than +/// `Errno::INPROGRESS`. +/// /// # References /// - [Beej's Guide to Network Programming] /// - [POSIX] @@ -295,6 +301,7 @@ pub fn bind_unix(sockfd: Fd, addr: &SocketAddrUnix) -> io::Result<()> /// [DragonFly BSD]: https://man.dragonflybsd.org/?command=connect§ion=2 /// [illumos]: https://illumos.org/man/3SOCKET/connect /// [glibc]: https://www.gnu.org/software/libc/manual/html_node/Connecting.html +/// [`Errno::WOULDBLOCK`]: io::Errno::WOULDBLOCK pub fn connect(sockfd: Fd, addr: &SocketAddr) -> io::Result<()> { _connect(sockfd.as_fd(), addr) } diff --git a/vendor/rustix/src/net/sockopt.rs b/vendor/rustix/src/net/sockopt.rs index b21d4a35c..1939155d9 100644 --- a/vendor/rustix/src/net/sockopt.rs +++ b/vendor/rustix/src/net/sockopt.rs @@ -6,6 +6,18 @@ #![doc(alias = "getsockopt")] #![doc(alias = "setsockopt")] +#[cfg(not(any( + apple, + windows, + target_os = "aix", + target_os = "dragonfly", + target_os = "emscripten", + target_os = "espidf", + target_os = "haiku", + target_os = "netbsd", + target_os = "nto", +)))] +use crate::net::AddressFamily; use crate::net::{Ipv4Addr, Ipv6Addr, SocketType}; use crate::{backend, io}; use backend::c; @@ -103,6 +115,44 @@ pub fn set_socket_reuseaddr(fd: Fd, value: bool) -> io::Result<()> { backend::net::syscalls::sockopt::set_socket_reuseaddr(fd.as_fd(), value) } +/// `getsockopt(fd, SOL_SOCKET, SO_REUSEADDR)` +/// +/// # References +/// - [POSIX `getsockopt`] +/// - [POSIX `sys/socket.h`] +/// - [Linux `getsockopt`] +/// - [Linux `socket`] +/// - [Winsock2 `getsockopt`] +/// - [Winsock2 `SOL_SOCKET` options] +/// - [Apple] +/// - [FreeBSD] +/// - [NetBSD] +/// - [OpenBSD] +/// - [DragonFly BSD] +/// - [illumos] +/// - [glibc `getsockopt`] +/// - [glibc `SOL_SOCKET` Options] +/// +/// [POSIX `getsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html +/// [POSIX `sys/socket.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_socket.h.html +/// [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html +/// [Linux `socket`]: https://man7.org/linux/man-pages/man7/socket.7.html +/// [Winsock2 `getsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockopt +/// [Winsock2 `SOL_SOCKET` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/sol-socket-socket-options +/// [Apple]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/getsockopt.2.html +/// [FreeBSD]: https://man.freebsd.org/cgi/man.cgi?query=getsockopt&sektion=2 +/// [NetBSD]: https://man.netbsd.org/getsockopt.2 +/// [OpenBSD]: https://man.openbsd.org/getsockopt.2 +/// [DragonFly BSD]: https://man.dragonflybsd.org/?command=getsockopt§ion=2 +/// [illumos]: https://illumos.org/man/3SOCKET/getsockopt +/// [glibc `getsockopt`]: https://www.gnu.org/software/libc/manual/html_node/Socket-Option-Functions.html +/// [glibc `SOL_SOCKET` options]: https://www.gnu.org/software/libc/manual/html_node/Socket_002dLevel-Options.html +#[inline] +#[doc(alias = "SO_REUSEADDR")] +pub fn get_socket_reuseaddr(fd: Fd) -> io::Result { + backend::net::syscalls::sockopt::get_socket_reuseaddr(fd.as_fd()) +} + /// `setsockopt(fd, SOL_SOCKET, SO_BROADCAST, broadcast)` /// /// # References @@ -712,6 +762,92 @@ pub fn get_socket_send_buffer_size(fd: Fd) -> io::Result { backend::net::syscalls::sockopt::get_socket_send_buffer_size(fd.as_fd()) } +/// `getsockopt(fd, SOL_SOCKET, SO_DOMAIN)` +/// +/// # References +/// - [POSIX `getsockopt`] +/// - [POSIX `sys/socket.h`] +/// - [Linux `getsockopt`] +/// - [Linux `socket`] +/// - [Winsock2 `getsockopt`] +/// - [Winsock2 `SOL_SOCKET` options] +/// - [Apple] +/// - [FreeBSD] +/// - [NetBSD] +/// - [OpenBSD] +/// - [DragonFly BSD] +/// - [illumos] +/// - [glibc `getsockopt`] +/// - [glibc `SOL_SOCKET` Options] +/// +/// [POSIX `getsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html +/// [POSIX `sys/socket.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_socket.h.html +/// [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html +/// [Linux `socket`]: https://man7.org/linux/man-pages/man7/socket.7.html +/// [Winsock2 `getsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockopt +/// [Winsock2 `SOL_SOCKET` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/sol-socket-socket-options +/// [Apple]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/getsockopt.2.html +/// [FreeBSD]: https://man.freebsd.org/cgi/man.cgi?query=getsockopt&sektion=2 +/// [NetBSD]: https://man.netbsd.org/getsockopt.2 +/// [OpenBSD]: https://man.openbsd.org/getsockopt.2 +/// [DragonFly BSD]: https://man.dragonflybsd.org/?command=getsockopt§ion=2 +/// [illumos]: https://illumos.org/man/3SOCKET/getsockopt +/// [glibc `getsockopt`]: https://www.gnu.org/software/libc/manual/html_node/Socket-Option-Functions.html +/// [glibc `SOL_SOCKET` options]: https://www.gnu.org/software/libc/manual/html_node/Socket_002dLevel-Options.html +#[cfg(not(any( + apple, + windows, + target_os = "aix", + target_os = "dragonfly", + target_os = "emscripten", + target_os = "espidf", + target_os = "haiku", + target_os = "netbsd", + target_os = "nto", +)))] +#[inline] +#[doc(alias = "SO_DOMAIN")] +pub fn get_socket_domain(fd: Fd) -> io::Result { + backend::net::syscalls::sockopt::get_socket_domain(fd.as_fd()) +} + +/// `getsockopt(fd, SOL_SOCKET, SO_ACCEPTCONN)` +/// +/// # References +/// - [POSIX `getsockopt`] +/// - [POSIX `sys/socket.h`] +/// - [Linux `getsockopt`] +/// - [Linux `socket`] +/// - [Winsock2 `getsockopt`] +/// - [Winsock2 `SOL_SOCKET` options] +/// - [FreeBSD] +/// - [NetBSD] +/// - [OpenBSD] +/// - [DragonFly BSD] +/// - [illumos] +/// - [glibc `getsockopt`] +/// - [glibc `SOL_SOCKET` Options] +/// +/// [POSIX `getsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html +/// [POSIX `sys/socket.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_socket.h.html +/// [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html +/// [Linux `socket`]: https://man7.org/linux/man-pages/man7/socket.7.html +/// [Winsock2 `getsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockopt +/// [Winsock2 `SOL_SOCKET` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/sol-socket-socket-options +/// [FreeBSD]: https://man.freebsd.org/cgi/man.cgi?query=getsockopt&sektion=2 +/// [NetBSD]: https://man.netbsd.org/getsockopt.2 +/// [OpenBSD]: https://man.openbsd.org/getsockopt.2 +/// [DragonFly BSD]: https://man.dragonflybsd.org/?command=getsockopt§ion=2 +/// [illumos]: https://illumos.org/man/3SOCKET/getsockopt +/// [glibc `getsockopt`]: https://www.gnu.org/software/libc/manual/html_node/Socket-Option-Functions.html +/// [glibc `SOL_SOCKET` options]: https://www.gnu.org/software/libc/manual/html_node/Socket_002dLevel-Options.html +#[cfg(not(apple))] // Apple platforms declare the constant, but do not actually implement it. +#[inline] +#[doc(alias = "SO_ACCEPTCONN")] +pub fn get_socket_acceptconn(fd: Fd) -> io::Result { + backend::net::syscalls::sockopt::get_socket_acceptconn(fd.as_fd()) +} + /// `setsockopt(fd, IPPROTO_IP, IP_TTL, ttl)` /// /// # References @@ -1629,6 +1765,268 @@ pub fn get_tcp_nodelay(fd: Fd) -> io::Result { backend::net::syscalls::sockopt::get_tcp_nodelay(fd.as_fd()) } +/// `setsockopt(fd, IPPROTO_TCP, TCP_KEEPCNT, count)` +/// +/// # References +/// - [POSIX `getsockopt`] +/// - [POSIX `netinet/tcp.h`] +/// - [Linux `getsockopt`] +/// - [Linux `tcp`] +/// - [Winsock2 `getsockopt`] +/// - [Winsock2 `IPPROTO_TCP` options] +/// - [Apple `getsockopt`] +/// - [Apple `tcp`] +/// - [FreeBSD `getsockopt`] +/// - [FreeBSD `tcp`] +/// - [NetBSD `getsockopt`] +/// - [NetBSD `tcp`] +/// - [DragonFly BSD `getsockopt`] +/// - [DragonFly BSD `tcp`] +/// - [illumos `getsockopt`] +/// - [illumos `tcp`] +/// +/// [POSIX `getsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html +/// [POSIX `netinet/tcp.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_tcp.h.html +/// [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html +/// [Linux `tcp`]: https://man7.org/linux/man-pages/man7/tcp.7.html +/// [Winsock2 `getsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockopt +/// [Winsock2 `IPPROTO_TCP` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-tcp-socket-options +/// [Apple `getsockopt`]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/getsockopt.2.html +/// [Apple `tcp`]: https://opensource.apple.com/source/xnu/xnu-7195.81.3/bsd/man/man4/tcp.4.auto.html +/// [FreeBSD `getsockopt`]: https://man.freebsd.org/cgi/man.cgi?query=getsockopt&sektion=2 +/// [FreeBSD `tcp`]: https://man.freebsd.org/cgi/man.cgi?query=tcp&sektion=4 +/// [NetBSD `getsockopt`]: https://man.netbsd.org/getsockopt.2 +/// [NetBSD `tcp`]: https://man.netbsd.org/tcp.4 +/// [DragonFly BSD `getsockopt`]: https://man.dragonflybsd.org/?command=getsockopt§ion=2 +/// [DragonFly BSD `tcp`]: https://man.dragonflybsd.org/?command=tcp§ion=4 +/// [illumos `getsockopt`]: https://illumos.org/man/3SOCKET/getsockopt +/// [illumos `tcp`]: https://illumos.org/man/4P/tcp +#[inline] +#[cfg(not(any(target_os = "openbsd", target_os = "haiku", target_os = "nto")))] +#[doc(alias = "TCP_KEEPCNT")] +pub fn set_tcp_keepcnt(fd: Fd, count: u32) -> io::Result<()> { + backend::net::syscalls::sockopt::set_tcp_keepcnt(fd.as_fd(), count) +} + +/// `getsockopt(fd, IPPROTO_TCP, TCP_KEEPCNT)` +/// +/// # References +/// - [POSIX `getsockopt`] +/// - [POSIX `netinet/tcp.h`] +/// - [Linux `getsockopt`] +/// - [Linux `tcp`] +/// - [Winsock2 `getsockopt`] +/// - [Winsock2 `IPPROTO_TCP` options] +/// - [Apple `getsockopt`] +/// - [Apple `tcp`] +/// - [FreeBSD `getsockopt`] +/// - [FreeBSD `tcp`] +/// - [NetBSD `getsockopt`] +/// - [NetBSD `tcp`] +/// - [DragonFly BSD `getsockopt`] +/// - [DragonFly BSD `tcp`] +/// - [illumos `getsockopt`] +/// - [illumos `tcp`] +/// +/// [POSIX `getsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html +/// [POSIX `netinet/tcp.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_tcp.h.html +/// [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html +/// [Linux `tcp`]: https://man7.org/linux/man-pages/man7/tcp.7.html +/// [Winsock2 `getsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockopt +/// [Winsock2 `IPPROTO_TCP` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-tcp-socket-options +/// [Apple `getsockopt`]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/getsockopt.2.html +/// [Apple `tcp`]: https://opensource.apple.com/source/xnu/xnu-7195.81.3/bsd/man/man4/tcp.4.auto.html +/// [FreeBSD `getsockopt`]: https://man.freebsd.org/cgi/man.cgi?query=getsockopt&sektion=2 +/// [FreeBSD `tcp`]: https://man.freebsd.org/cgi/man.cgi?query=tcp&sektion=4 +/// [NetBSD `getsockopt`]: https://man.netbsd.org/getsockopt.2 +/// [NetBSD `tcp`]: https://man.netbsd.org/tcp.4 +/// [DragonFly BSD `getsockopt`]: https://man.dragonflybsd.org/?command=getsockopt§ion=2 +/// [DragonFly BSD `tcp`]: https://man.dragonflybsd.org/?command=tcp§ion=4 +/// [illumos `getsockopt`]: https://illumos.org/man/3SOCKET/getsockopt +/// [illumos `tcp`]: https://illumos.org/man/4P/tcp +#[inline] +#[cfg(not(any(target_os = "openbsd", target_os = "haiku", target_os = "nto")))] +#[doc(alias = "TCP_KEEPCNT")] +pub fn get_tcp_keepcnt(fd: Fd) -> io::Result { + backend::net::syscalls::sockopt::get_tcp_keepcnt(fd.as_fd()) +} + +/// `setsockopt(fd, IPPROTO_TCP, TCP_KEEPIDLE, duration)` +/// +/// `TCP_KEEPALIVE` on Apple platforms. +/// +/// # References +/// - [POSIX `getsockopt`] +/// - [POSIX `netinet/tcp.h`] +/// - [Linux `getsockopt`] +/// - [Linux `tcp`] +/// - [Winsock2 `getsockopt`] +/// - [Winsock2 `IPPROTO_TCP` options] +/// - [Apple `getsockopt`] +/// - [Apple `tcp`] +/// - [FreeBSD `getsockopt`] +/// - [FreeBSD `tcp`] +/// - [NetBSD `getsockopt`] +/// - [NetBSD `tcp`] +/// - [DragonFly BSD `getsockopt`] +/// - [DragonFly BSD `tcp`] +/// - [illumos `getsockopt`] +/// - [illumos `tcp`] +/// +/// [POSIX `getsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html +/// [POSIX `netinet/tcp.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_tcp.h.html +/// [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html +/// [Linux `tcp`]: https://man7.org/linux/man-pages/man7/tcp.7.html +/// [Winsock2 `getsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockopt +/// [Winsock2 `IPPROTO_TCP` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-tcp-socket-options +/// [Apple `getsockopt`]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/getsockopt.2.html +/// [Apple `tcp`]: https://opensource.apple.com/source/xnu/xnu-7195.81.3/bsd/man/man4/tcp.4.auto.html +/// [FreeBSD `getsockopt`]: https://man.freebsd.org/cgi/man.cgi?query=getsockopt&sektion=2 +/// [FreeBSD `tcp`]: https://man.freebsd.org/cgi/man.cgi?query=tcp&sektion=4 +/// [NetBSD `getsockopt`]: https://man.netbsd.org/getsockopt.2 +/// [NetBSD `tcp`]: https://man.netbsd.org/tcp.4 +/// [DragonFly BSD `getsockopt`]: https://man.dragonflybsd.org/?command=getsockopt§ion=2 +/// [DragonFly BSD `tcp`]: https://man.dragonflybsd.org/?command=tcp§ion=4 +/// [illumos `getsockopt`]: https://illumos.org/man/3SOCKET/getsockopt +/// [illumos `tcp`]: https://illumos.org/man/4P/tcp +#[inline] +#[cfg(not(any(target_os = "openbsd", target_os = "haiku", target_os = "nto")))] +#[doc(alias = "TCP_KEEPIDLE")] +pub fn set_tcp_keepidle(fd: Fd, duration: Duration) -> io::Result<()> { + backend::net::syscalls::sockopt::set_tcp_keepidle(fd.as_fd(), duration) +} + +/// `getsockopt(fd, IPPROTO_TCP, TCP_KEEPIDLE)` +/// +/// `TCP_KEEPALIVE` on Apple platforms. +/// +/// # References +/// - [POSIX `getsockopt`] +/// - [POSIX `netinet/tcp.h`] +/// - [Linux `getsockopt`] +/// - [Linux `tcp`] +/// - [Winsock2 `getsockopt`] +/// - [Winsock2 `IPPROTO_TCP` options] +/// - [Apple `getsockopt`] +/// - [Apple `tcp`] +/// - [FreeBSD `getsockopt`] +/// - [FreeBSD `tcp`] +/// - [NetBSD `getsockopt`] +/// - [NetBSD `tcp`] +/// - [DragonFly BSD `getsockopt`] +/// - [DragonFly BSD `tcp`] +/// - [illumos `getsockopt`] +/// - [illumos `tcp`] +/// +/// [POSIX `getsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html +/// [POSIX `netinet/tcp.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_tcp.h.html +/// [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html +/// [Linux `tcp`]: https://man7.org/linux/man-pages/man7/tcp.7.html +/// [Winsock2 `getsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockopt +/// [Winsock2 `IPPROTO_TCP` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-tcp-socket-options +/// [Apple `getsockopt`]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/getsockopt.2.html +/// [Apple `tcp`]: https://opensource.apple.com/source/xnu/xnu-7195.81.3/bsd/man/man4/tcp.4.auto.html +/// [FreeBSD `getsockopt`]: https://man.freebsd.org/cgi/man.cgi?query=getsockopt&sektion=2 +/// [FreeBSD `tcp`]: https://man.freebsd.org/cgi/man.cgi?query=tcp&sektion=4 +/// [NetBSD `getsockopt`]: https://man.netbsd.org/getsockopt.2 +/// [NetBSD `tcp`]: https://man.netbsd.org/tcp.4 +/// [DragonFly BSD `getsockopt`]: https://man.dragonflybsd.org/?command=getsockopt§ion=2 +/// [DragonFly BSD `tcp`]: https://man.dragonflybsd.org/?command=tcp§ion=4 +/// [illumos `getsockopt`]: https://illumos.org/man/3SOCKET/getsockopt +/// [illumos `tcp`]: https://illumos.org/man/4P/tcp +#[inline] +#[cfg(not(any(target_os = "openbsd", target_os = "haiku", target_os = "nto")))] +#[doc(alias = "TCP_KEEPIDLE")] +pub fn get_tcp_keepidle(fd: Fd) -> io::Result { + backend::net::syscalls::sockopt::get_tcp_keepidle(fd.as_fd()) +} + +/// `setsockopt(fd, IPPROTO_TCP, TCP_KEEPINTVL, duration)` +/// +/// # References +/// - [POSIX `getsockopt`] +/// - [POSIX `netinet/tcp.h`] +/// - [Linux `getsockopt`] +/// - [Linux `tcp`] +/// - [Winsock2 `getsockopt`] +/// - [Winsock2 `IPPROTO_TCP` options] +/// - [Apple `getsockopt`] +/// - [Apple `tcp`] +/// - [FreeBSD `getsockopt`] +/// - [FreeBSD `tcp`] +/// - [NetBSD `getsockopt`] +/// - [NetBSD `tcp`] +/// - [DragonFly BSD `getsockopt`] +/// - [DragonFly BSD `tcp`] +/// - [illumos `getsockopt`] +/// - [illumos `tcp`] +/// +/// [POSIX `getsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html +/// [POSIX `netinet/tcp.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_tcp.h.html +/// [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html +/// [Linux `tcp`]: https://man7.org/linux/man-pages/man7/tcp.7.html +/// [Winsock2 `getsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockopt +/// [Winsock2 `IPPROTO_TCP` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-tcp-socket-options +/// [Apple `getsockopt`]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/getsockopt.2.html +/// [Apple `tcp`]: https://opensource.apple.com/source/xnu/xnu-7195.81.3/bsd/man/man4/tcp.4.auto.html +/// [FreeBSD `getsockopt`]: https://man.freebsd.org/cgi/man.cgi?query=getsockopt&sektion=2 +/// [FreeBSD `tcp`]: https://man.freebsd.org/cgi/man.cgi?query=tcp&sektion=4 +/// [NetBSD `getsockopt`]: https://man.netbsd.org/getsockopt.2 +/// [NetBSD `tcp`]: https://man.netbsd.org/tcp.4 +/// [DragonFly BSD `getsockopt`]: https://man.dragonflybsd.org/?command=getsockopt§ion=2 +/// [DragonFly BSD `tcp`]: https://man.dragonflybsd.org/?command=tcp§ion=4 +/// [illumos `getsockopt`]: https://illumos.org/man/3SOCKET/getsockopt +/// [illumos `tcp`]: https://illumos.org/man/4P/tcp +#[inline] +#[cfg(not(any(target_os = "openbsd", target_os = "haiku", target_os = "nto")))] +#[doc(alias = "TCP_KEEPINTVL")] +pub fn set_tcp_keepintvl(fd: Fd, duration: Duration) -> io::Result<()> { + backend::net::syscalls::sockopt::set_tcp_keepintvl(fd.as_fd(), duration) +} + +/// `getsockopt(fd, IPPROTO_TCP, TCP_KEEPINTVL)` +/// +/// # References +/// - [POSIX `getsockopt`] +/// - [POSIX `netinet/tcp.h`] +/// - [Linux `getsockopt`] +/// - [Linux `tcp`] +/// - [Winsock2 `getsockopt`] +/// - [Winsock2 `IPPROTO_TCP` options] +/// - [Apple `getsockopt`] +/// - [Apple `tcp`] +/// - [FreeBSD `getsockopt`] +/// - [FreeBSD `tcp`] +/// - [NetBSD `getsockopt`] +/// - [NetBSD `tcp`] +/// - [DragonFly BSD `getsockopt`] +/// - [DragonFly BSD `tcp`] +/// - [illumos `getsockopt`] +/// - [illumos `tcp`] +/// +/// [POSIX `getsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html +/// [POSIX `netinet/tcp.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_tcp.h.html +/// [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html +/// [Linux `tcp`]: https://man7.org/linux/man-pages/man7/tcp.7.html +/// [Winsock2 `getsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockopt +/// [Winsock2 `IPPROTO_TCP` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-tcp-socket-options +/// [Apple `getsockopt`]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/getsockopt.2.html +/// [Apple `tcp`]: https://opensource.apple.com/source/xnu/xnu-7195.81.3/bsd/man/man4/tcp.4.auto.html +/// [FreeBSD `getsockopt`]: https://man.freebsd.org/cgi/man.cgi?query=getsockopt&sektion=2 +/// [FreeBSD `tcp`]: https://man.freebsd.org/cgi/man.cgi?query=tcp&sektion=4 +/// [NetBSD `getsockopt`]: https://man.netbsd.org/getsockopt.2 +/// [NetBSD `tcp`]: https://man.netbsd.org/tcp.4 +/// [DragonFly BSD `getsockopt`]: https://man.dragonflybsd.org/?command=getsockopt§ion=2 +/// [DragonFly BSD `tcp`]: https://man.dragonflybsd.org/?command=tcp§ion=4 +/// [illumos `getsockopt`]: https://illumos.org/man/3SOCKET/getsockopt +/// [illumos `tcp`]: https://illumos.org/man/4P/tcp +#[inline] +#[cfg(not(any(target_os = "openbsd", target_os = "haiku", target_os = "nto")))] +#[doc(alias = "TCP_KEEPINTVL")] +pub fn get_tcp_keepintvl(fd: Fd) -> io::Result { + backend::net::syscalls::sockopt::get_tcp_keepintvl(fd.as_fd()) +} + #[test] fn test_sizes() { use c::c_int; diff --git a/vendor/rustix/src/net/types.rs b/vendor/rustix/src/net/types.rs index a2c019b42..53116f9c8 100644 --- a/vendor/rustix/src/net/types.rs +++ b/vendor/rustix/src/net/types.rs @@ -1,10 +1,9 @@ -#![allow(unsafe_code)] +//! Types and constants for `rustix::net`. use crate::backend::c; use bitflags::bitflags; /// A type for holding raw integer socket types. -#[doc(hidden)] pub type RawSocketType = u32; /// `SOCK_*` constants for use with [`socket`]. @@ -48,10 +47,14 @@ impl SocketType { } /// A type for holding raw integer address families. -#[doc(hidden)] pub type RawAddressFamily = c::sa_family_t; -/// `AF_*` constants. +/// `AF_*` constants for use with [`socket`], [`socket_with`], and +/// [`socketpair`]. +/// +/// [`socket`]: crate::net::socket() +/// [`socket_with`]: crate::net::socket_with +/// [`socketpair`]: crate::net::socketpair() #[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)] #[repr(transparent)] pub struct AddressFamily(pub(crate) RawAddressFamily); @@ -85,6 +88,7 @@ impl AddressFamily { bsd, solarish, windows, + target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", @@ -98,13 +102,17 @@ impl AddressFamily { bsd, solarish, windows, + target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", )))] pub const AX25: Self = Self(c::AF_AX25 as _); /// `AF_IPX` - #[cfg(not(target_os = "espidf"))] + #[cfg(not(any( + target_os = "espidf", + target_os = "aix", + )))] pub const IPX: Self = Self(c::AF_IPX as _); /// `AF_APPLETALK` #[cfg(not(target_os = "espidf"))] @@ -114,6 +122,7 @@ impl AddressFamily { bsd, solarish, windows, + target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", @@ -124,6 +133,7 @@ impl AddressFamily { bsd, solarish, windows, + target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", @@ -134,6 +144,7 @@ impl AddressFamily { bsd, solarish, windows, + target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", @@ -143,6 +154,7 @@ impl AddressFamily { #[cfg(not(any( bsd, windows, + target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", @@ -153,6 +165,7 @@ impl AddressFamily { bsd, solarish, windows, + target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", @@ -166,6 +179,7 @@ impl AddressFamily { bsd, solarish, windows, + target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", @@ -176,6 +190,7 @@ impl AddressFamily { bsd, solarish, windows, + target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", @@ -185,6 +200,7 @@ impl AddressFamily { #[cfg(not(any( bsd, windows, + target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", @@ -199,6 +215,7 @@ impl AddressFamily { #[cfg(not(any( bsd, windows, + target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", @@ -209,6 +226,7 @@ impl AddressFamily { bsd, solarish, windows, + target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", @@ -219,6 +237,7 @@ impl AddressFamily { bsd, solarish, windows, + target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", @@ -229,6 +248,7 @@ impl AddressFamily { bsd, solarish, windows, + target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", @@ -239,6 +259,7 @@ impl AddressFamily { bsd, solarish, windows, + target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", @@ -251,6 +272,7 @@ impl AddressFamily { #[cfg(not(any( bsd, solarish, + target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", @@ -261,6 +283,7 @@ impl AddressFamily { bsd, solarish, windows, + target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", @@ -271,6 +294,7 @@ impl AddressFamily { bsd, solarish, windows, + target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", @@ -281,6 +305,7 @@ impl AddressFamily { bsd, solarish, windows, + target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", @@ -291,6 +316,7 @@ impl AddressFamily { bsd, solarish, windows, + target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", @@ -301,19 +327,27 @@ impl AddressFamily { bsd, solarish, windows, + target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", )))] pub const TIPC: Self = Self(c::AF_TIPC as _); /// `AF_BLUETOOTH` - #[cfg(not(any(apple, solarish, windows, target_os = "espidf")))] + #[cfg(not(any( + apple, + solarish, + windows, + target_os = "aix", + target_os = "espidf", + )))] pub const BLUETOOTH: Self = Self(c::AF_BLUETOOTH as _); /// `AF_IUCV` #[cfg(not(any( bsd, solarish, windows, + target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", @@ -324,19 +358,27 @@ impl AddressFamily { bsd, solarish, windows, + target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", )))] pub const RXRPC: Self = Self(c::AF_RXRPC as _); /// `AF_ISDN` - #[cfg(not(any(solarish, windows, target_os = "espidf", target_os = "haiku")))] + #[cfg(not(any( + solarish, + windows, + target_os = "aix", + target_os = "espidf", + target_os = "haiku", + )))] pub const ISDN: Self = Self(c::AF_ISDN as _); /// `AF_PHONET` #[cfg(not(any( bsd, solarish, windows, + target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", @@ -347,6 +389,7 @@ impl AddressFamily { bsd, solarish, windows, + target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", @@ -410,7 +453,7 @@ impl AddressFamily { #[cfg(any(bsd, solarish, target_os = "aix", target_os = "nto"))] pub const IMPLINK: Self = Self(c::AF_IMPLINK as _); /// `AF_IEEE80211` - #[cfg(any(apple, freebsdlike, linuxlike, target_os = "netbsd"))] + #[cfg(any(apple, freebsdlike, target_os = "netbsd"))] pub const IEEE80211: Self = Self(c::AF_IEEE80211 as _); /// `AF_INET6_SDP` #[cfg(target_os = "freebsd")] @@ -437,7 +480,7 @@ impl AddressFamily { #[cfg(any(netbsdlike, target_os = "dragonfly", target_os = "emscripten", target_os = "fuchsia"))] pub const MPLS: Self = Self(c::AF_MPLS as _); /// `AF_NATM` - #[cfg(any(bsd, target_os = "aix", target_os = "nto"))] + #[cfg(any(bsd, target_os = "nto"))] pub const NATM: Self = Self(c::AF_NATM as _); /// `AF_NBS` #[cfg(solarish)] @@ -497,7 +540,7 @@ impl AddressFamily { #[cfg(target_os = "freebsd")] pub const SCLUSTER: Self = Self(c::AF_SCLUSTER as _); /// `AF_SIP` - #[cfg(any(apple, target_os = "freebsd", target_os = "opensbd"))] + #[cfg(any(apple, target_os = "freebsd", target_os = "openbsd"))] pub const SIP: Self = Self(c::AF_SIP as _); /// `AF_SLOW` #[cfg(target_os = "freebsd")] @@ -532,9 +575,15 @@ impl AddressFamily { } /// A type for holding raw integer protocols. -#[doc(hidden)] pub type RawProtocol = core::num::NonZeroU32; +const fn new_raw_protocol(u: u32) -> RawProtocol { + match RawProtocol::new(u) { + Some(p) => p, + None => panic!("new_raw_protocol: protocol must be non-zero"), + } +} + /// `IPPROTO_*` and other constants for use with [`socket`], [`socket_with`], /// and [`socketpair`] when a nondefault value is desired. See the [`ipproto`], /// [`sysproto`], and [`netlink`] modules for possible values. @@ -555,104 +604,105 @@ pub struct Protocol(pub(crate) RawProtocol); /// /// For `IPPROTO_IP`, pass `None` as the `protocol` argument. pub mod ipproto { - use super::{Protocol, RawProtocol}; + use super::{new_raw_protocol, Protocol}; use crate::backend::c; /// `IPPROTO_ICMP` - pub const ICMP: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked(c::IPPROTO_ICMP as _) }); + pub const ICMP: Protocol = Protocol(new_raw_protocol(c::IPPROTO_ICMP as _)); /// `IPPROTO_IGMP` #[cfg(not(any(solarish, target_os = "espidf", target_os = "haiku")))] - pub const IGMP: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked(c::IPPROTO_IGMP as _) }); + pub const IGMP: Protocol = Protocol(new_raw_protocol(c::IPPROTO_IGMP as _)); /// `IPPROTO_IPIP` #[cfg(not(any(solarish, windows, target_os = "espidf", target_os = "haiku")))] - pub const IPIP: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked(c::IPPROTO_IPIP as _) }); + pub const IPIP: Protocol = Protocol(new_raw_protocol(c::IPPROTO_IPIP as _)); /// `IPPROTO_TCP` - pub const TCP: Protocol = Protocol(unsafe { RawProtocol::new_unchecked(c::IPPROTO_TCP as _) }); + pub const TCP: Protocol = Protocol(new_raw_protocol(c::IPPROTO_TCP as _)); /// `IPPROTO_EGP` #[cfg(not(any(solarish, target_os = "espidf", target_os = "haiku")))] - pub const EGP: Protocol = Protocol(unsafe { RawProtocol::new_unchecked(c::IPPROTO_EGP as _) }); + pub const EGP: Protocol = Protocol(new_raw_protocol(c::IPPROTO_EGP as _)); /// `IPPROTO_PUP` #[cfg(not(any(solarish, target_os = "espidf", target_os = "haiku")))] - pub const PUP: Protocol = Protocol(unsafe { RawProtocol::new_unchecked(c::IPPROTO_PUP as _) }); + pub const PUP: Protocol = Protocol(new_raw_protocol(c::IPPROTO_PUP as _)); /// `IPPROTO_UDP` - pub const UDP: Protocol = Protocol(unsafe { RawProtocol::new_unchecked(c::IPPROTO_UDP as _) }); + pub const UDP: Protocol = Protocol(new_raw_protocol(c::IPPROTO_UDP as _)); /// `IPPROTO_IDP` #[cfg(not(any(solarish, target_os = "espidf", target_os = "haiku")))] - pub const IDP: Protocol = Protocol(unsafe { RawProtocol::new_unchecked(c::IPPROTO_IDP as _) }); + pub const IDP: Protocol = Protocol(new_raw_protocol(c::IPPROTO_IDP as _)); /// `IPPROTO_TP` #[cfg(not(any(solarish, windows, target_os = "espidf", target_os = "haiku")))] - pub const TP: Protocol = Protocol(unsafe { RawProtocol::new_unchecked(c::IPPROTO_TP as _) }); + pub const TP: Protocol = Protocol(new_raw_protocol(c::IPPROTO_TP as _)); /// `IPPROTO_DCCP` #[cfg(not(any( apple, solarish, windows, + target_os = "aix", target_os = "dragonfly", target_os = "espidf", target_os = "haiku", target_os = "nto", target_os = "openbsd", )))] - pub const DCCP: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked(c::IPPROTO_DCCP as _) }); + pub const DCCP: Protocol = Protocol(new_raw_protocol(c::IPPROTO_DCCP as _)); /// `IPPROTO_IPV6` - pub const IPV6: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked(c::IPPROTO_IPV6 as _) }); + pub const IPV6: Protocol = Protocol(new_raw_protocol(c::IPPROTO_IPV6 as _)); /// `IPPROTO_RSVP` #[cfg(not(any(solarish, windows, target_os = "espidf", target_os = "haiku")))] - pub const RSVP: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked(c::IPPROTO_RSVP as _) }); + pub const RSVP: Protocol = Protocol(new_raw_protocol(c::IPPROTO_RSVP as _)); /// `IPPROTO_GRE` #[cfg(not(any(solarish, windows, target_os = "espidf", target_os = "haiku")))] - pub const GRE: Protocol = Protocol(unsafe { RawProtocol::new_unchecked(c::IPPROTO_GRE as _) }); + pub const GRE: Protocol = Protocol(new_raw_protocol(c::IPPROTO_GRE as _)); /// `IPPROTO_ESP` #[cfg(not(any(solarish, target_os = "espidf", target_os = "haiku")))] - pub const ESP: Protocol = Protocol(unsafe { RawProtocol::new_unchecked(c::IPPROTO_ESP as _) }); + pub const ESP: Protocol = Protocol(new_raw_protocol(c::IPPROTO_ESP as _)); /// `IPPROTO_AH` #[cfg(not(any(solarish, target_os = "espidf", target_os = "haiku")))] - pub const AH: Protocol = Protocol(unsafe { RawProtocol::new_unchecked(c::IPPROTO_AH as _) }); + pub const AH: Protocol = Protocol(new_raw_protocol(c::IPPROTO_AH as _)); /// `IPPROTO_MTP` #[cfg(not(any( solarish, netbsdlike, windows, + target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", )))] - pub const MTP: Protocol = Protocol(unsafe { RawProtocol::new_unchecked(c::IPPROTO_MTP as _) }); + pub const MTP: Protocol = Protocol(new_raw_protocol(c::IPPROTO_MTP as _)); /// `IPPROTO_BEETPH` #[cfg(not(any( bsd, solarish, windows, + target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto" )))] - pub const BEETPH: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked(c::IPPROTO_BEETPH as _) }); + pub const BEETPH: Protocol = Protocol(new_raw_protocol(c::IPPROTO_BEETPH as _)); /// `IPPROTO_ENCAP` - #[cfg(not(any(solarish, windows, target_os = "espidf", target_os = "haiku")))] - pub const ENCAP: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked(c::IPPROTO_ENCAP as _) }); + #[cfg(not(any( + solarish, + windows, + target_os = "aix", + target_os = "espidf", + target_os = "haiku", + )))] + pub const ENCAP: Protocol = Protocol(new_raw_protocol(c::IPPROTO_ENCAP as _)); /// `IPPROTO_PIM` - #[cfg(not(any(solarish, target_os = "espidf", target_os = "haiku")))] - pub const PIM: Protocol = Protocol(unsafe { RawProtocol::new_unchecked(c::IPPROTO_PIM as _) }); + #[cfg(not(any(solarish, target_os = "aix", target_os = "espidf", target_os = "haiku")))] + pub const PIM: Protocol = Protocol(new_raw_protocol(c::IPPROTO_PIM as _)); /// `IPPROTO_COMP` #[cfg(not(any( bsd, solarish, windows, + target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto" )))] - pub const COMP: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked(c::IPPROTO_COMP as _) }); + pub const COMP: Protocol = Protocol(new_raw_protocol(c::IPPROTO_COMP as _)); /// `IPPROTO_SCTP` #[cfg(not(any( solarish, @@ -661,61 +711,57 @@ pub mod ipproto { target_os = "haiku", target_os = "openbsd" )))] - pub const SCTP: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked(c::IPPROTO_SCTP as _) }); + pub const SCTP: Protocol = Protocol(new_raw_protocol(c::IPPROTO_SCTP as _)); /// `IPPROTO_UDPLITE` #[cfg(not(any( apple, netbsdlike, solarish, windows, + target_os = "aix", target_os = "dragonfly", target_os = "espidf", target_os = "haiku", target_os = "nto", )))] - pub const UDPLITE: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked(c::IPPROTO_UDPLITE as _) }); + pub const UDPLITE: Protocol = Protocol(new_raw_protocol(c::IPPROTO_UDPLITE as _)); /// `IPPROTO_MPLS` #[cfg(not(any( apple, solarish, windows, + target_os = "aix", target_os = "dragonfly", target_os = "espidf", target_os = "haiku", target_os = "netbsd", target_os = "nto", )))] - pub const MPLS: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked(c::IPPROTO_MPLS as _) }); + pub const MPLS: Protocol = Protocol(new_raw_protocol(c::IPPROTO_MPLS as _)); /// `IPPROTO_ETHERNET` #[cfg(linux_kernel)] - pub const ETHERNET: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked(c::IPPROTO_ETHERNET as _) }); + pub const ETHERNET: Protocol = Protocol(new_raw_protocol(c::IPPROTO_ETHERNET as _)); /// `IPPROTO_RAW` #[cfg(not(target_os = "espidf"))] - pub const RAW: Protocol = Protocol(unsafe { RawProtocol::new_unchecked(c::IPPROTO_RAW as _) }); + pub const RAW: Protocol = Protocol(new_raw_protocol(c::IPPROTO_RAW as _)); /// `IPPROTO_MPTCP` #[cfg(not(any( bsd, solarish, windows, + target_os = "aix", target_os = "emscripten", target_os = "espidf", target_os = "fuchsia", target_os = "haiku", target_os = "nto", )))] - pub const MPTCP: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked(c::IPPROTO_MPTCP as _) }); + pub const MPTCP: Protocol = Protocol(new_raw_protocol(c::IPPROTO_MPTCP as _)); /// `IPPROTO_FRAGMENT` #[cfg(not(any(solarish, target_os = "espidf", target_os = "haiku")))] - pub const FRAGMENT: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked(c::IPPROTO_FRAGMENT as _) }); + pub const FRAGMENT: Protocol = Protocol(new_raw_protocol(c::IPPROTO_FRAGMENT as _)); /// `IPPROTO_ICMPV6` - pub const ICMPV6: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked(c::IPPROTO_ICMPV6 as _) }); + pub const ICMPV6: Protocol = Protocol(new_raw_protocol(c::IPPROTO_ICMPV6 as _)); /// `IPPROTO_MH` #[cfg(not(any( apple, @@ -727,30 +773,27 @@ pub mod ipproto { target_os = "haiku", target_os = "nto", )))] - pub const MH: Protocol = Protocol(unsafe { RawProtocol::new_unchecked(c::IPPROTO_MH as _) }); + pub const MH: Protocol = Protocol(new_raw_protocol(c::IPPROTO_MH as _)); /// `IPPROTO_ROUTING` #[cfg(not(any(solarish, target_os = "espidf", target_os = "haiku")))] - pub const ROUTING: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked(c::IPPROTO_ROUTING as _) }); + pub const ROUTING: Protocol = Protocol(new_raw_protocol(c::IPPROTO_ROUTING as _)); } /// `SYSPROTO_*` constants. pub mod sysproto { #[cfg(apple)] use { - super::{Protocol, RawProtocol}, + super::{new_raw_protocol, Protocol}, crate::backend::c, }; /// `SYSPROTO_EVENT` #[cfg(apple)] - pub const EVENT: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked(c::SYSPROTO_EVENT as _) }); + pub const EVENT: Protocol = Protocol(new_raw_protocol(c::SYSPROTO_EVENT as _)); /// `SYSPROTO_CONTROL` #[cfg(apple)] - pub const CONTROL: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked(c::SYSPROTO_CONTROL as _) }); + pub const CONTROL: Protocol = Protocol(new_raw_protocol(c::SYSPROTO_CONTROL as _)); } /// `NETLINK_*` constants. @@ -759,566 +802,478 @@ pub mod sysproto { pub mod netlink { #[cfg(linux_kernel)] use { - super::{Protocol, RawProtocol}, + super::{new_raw_protocol, Protocol}, crate::backend::c, }; /// `NETLINK_UNUSED` #[cfg(linux_kernel)] - pub const UNUSED: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked(c::NETLINK_UNUSED as _) }); + pub const UNUSED: Protocol = Protocol(new_raw_protocol(c::NETLINK_UNUSED as _)); /// `NETLINK_USERSOCK` #[cfg(linux_kernel)] - pub const USERSOCK: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked(c::NETLINK_USERSOCK as _) }); + pub const USERSOCK: Protocol = Protocol(new_raw_protocol(c::NETLINK_USERSOCK as _)); /// `NETLINK_FIREWALL` #[cfg(linux_kernel)] - pub const FIREWALL: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked(c::NETLINK_FIREWALL as _) }); + pub const FIREWALL: Protocol = Protocol(new_raw_protocol(c::NETLINK_FIREWALL as _)); /// `NETLINK_SOCK_DIAG` #[cfg(linux_kernel)] - pub const SOCK_DIAG: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked(c::NETLINK_SOCK_DIAG as _) }); + pub const SOCK_DIAG: Protocol = Protocol(new_raw_protocol(c::NETLINK_SOCK_DIAG as _)); /// `NETLINK_NFLOG` #[cfg(linux_kernel)] - pub const NFLOG: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked(c::NETLINK_NFLOG as _) }); + pub const NFLOG: Protocol = Protocol(new_raw_protocol(c::NETLINK_NFLOG as _)); /// `NETLINK_XFRM` #[cfg(linux_kernel)] - pub const XFRM: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked(c::NETLINK_XFRM as _) }); + pub const XFRM: Protocol = Protocol(new_raw_protocol(c::NETLINK_XFRM as _)); /// `NETLINK_SELINUX` #[cfg(linux_kernel)] - pub const SELINUX: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked(c::NETLINK_SELINUX as _) }); + pub const SELINUX: Protocol = Protocol(new_raw_protocol(c::NETLINK_SELINUX as _)); /// `NETLINK_ISCSI` #[cfg(linux_kernel)] - pub const ISCSI: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked(c::NETLINK_ISCSI as _) }); + pub const ISCSI: Protocol = Protocol(new_raw_protocol(c::NETLINK_ISCSI as _)); /// `NETLINK_AUDIT` #[cfg(linux_kernel)] - pub const AUDIT: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked(c::NETLINK_AUDIT as _) }); + pub const AUDIT: Protocol = Protocol(new_raw_protocol(c::NETLINK_AUDIT as _)); /// `NETLINK_FIB_LOOKUP` #[cfg(linux_kernel)] - pub const FIB_LOOKUP: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked(c::NETLINK_FIB_LOOKUP as _) }); + pub const FIB_LOOKUP: Protocol = Protocol(new_raw_protocol(c::NETLINK_FIB_LOOKUP as _)); /// `NETLINK_CONNECTOR` #[cfg(linux_kernel)] - pub const CONNECTOR: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked(c::NETLINK_CONNECTOR as _) }); + pub const CONNECTOR: Protocol = Protocol(new_raw_protocol(c::NETLINK_CONNECTOR as _)); /// `NETLINK_NETFILTER` #[cfg(linux_kernel)] - pub const NETFILTER: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked(c::NETLINK_NETFILTER as _) }); + pub const NETFILTER: Protocol = Protocol(new_raw_protocol(c::NETLINK_NETFILTER as _)); /// `NETLINK_IP6_FW` #[cfg(linux_kernel)] - pub const IP6_FW: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked(c::NETLINK_IP6_FW as _) }); + pub const IP6_FW: Protocol = Protocol(new_raw_protocol(c::NETLINK_IP6_FW as _)); /// `NETLINK_DNRTMSG` #[cfg(linux_kernel)] - pub const DNRTMSG: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked(c::NETLINK_DNRTMSG as _) }); + pub const DNRTMSG: Protocol = Protocol(new_raw_protocol(c::NETLINK_DNRTMSG as _)); /// `NETLINK_KOBJECT_UEVENT` #[cfg(linux_kernel)] - pub const KOBJECT_UEVENT: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked(c::NETLINK_KOBJECT_UEVENT as _) }); + pub const KOBJECT_UEVENT: Protocol = Protocol(new_raw_protocol(c::NETLINK_KOBJECT_UEVENT as _)); /// `NETLINK_GENERIC` // This is defined on FreeBSD too, but it has the value 0, so it doesn't // fit in or `NonZeroU32`. It's unclear whether FreeBSD intends // `NETLINK_GENERIC` to be the default when Linux has `NETLINK_ROUTE` // as the default. #[cfg(linux_kernel)] - pub const GENERIC: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked(c::NETLINK_GENERIC as _) }); + pub const GENERIC: Protocol = Protocol(new_raw_protocol(c::NETLINK_GENERIC as _)); /// `NETLINK_SCSITRANSPORT` #[cfg(linux_kernel)] - pub const SCSITRANSPORT: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked(c::NETLINK_SCSITRANSPORT as _) }); + pub const SCSITRANSPORT: Protocol = Protocol(new_raw_protocol(c::NETLINK_SCSITRANSPORT as _)); /// `NETLINK_ECRYPTFS` #[cfg(linux_kernel)] - pub const ECRYPTFS: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked(c::NETLINK_ECRYPTFS as _) }); + pub const ECRYPTFS: Protocol = Protocol(new_raw_protocol(c::NETLINK_ECRYPTFS as _)); /// `NETLINK_RDMA` #[cfg(linux_kernel)] - pub const RDMA: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked(c::NETLINK_RDMA as _) }); + pub const RDMA: Protocol = Protocol(new_raw_protocol(c::NETLINK_RDMA as _)); /// `NETLINK_CRYPTO` #[cfg(linux_kernel)] - pub const CRYPTO: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked(c::NETLINK_CRYPTO as _) }); + pub const CRYPTO: Protocol = Protocol(new_raw_protocol(c::NETLINK_CRYPTO as _)); /// `NETLINK_INET_DIAG` #[cfg(linux_kernel)] - pub const INET_DIAG: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked(c::NETLINK_INET_DIAG as _) }); + pub const INET_DIAG: Protocol = Protocol(new_raw_protocol(c::NETLINK_INET_DIAG as _)); /// `NETLINK_ADD_MEMBERSHIP` #[cfg(linux_kernel)] - pub const ADD_MEMBERSHIP: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked(c::NETLINK_ADD_MEMBERSHIP as _) }); + pub const ADD_MEMBERSHIP: Protocol = Protocol(new_raw_protocol(c::NETLINK_ADD_MEMBERSHIP as _)); /// `NETLINK_DROP_MEMBERSHIP` #[cfg(linux_kernel)] pub const DROP_MEMBERSHIP: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked(c::NETLINK_DROP_MEMBERSHIP as _) }); + Protocol(new_raw_protocol(c::NETLINK_DROP_MEMBERSHIP as _)); /// `NETLINK_PKTINFO` #[cfg(linux_kernel)] - pub const PKTINFO: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked(c::NETLINK_PKTINFO as _) }); + pub const PKTINFO: Protocol = Protocol(new_raw_protocol(c::NETLINK_PKTINFO as _)); /// `NETLINK_BROADCAST_ERROR` #[cfg(linux_kernel)] pub const BROADCAST_ERROR: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked(c::NETLINK_BROADCAST_ERROR as _) }); + Protocol(new_raw_protocol(c::NETLINK_BROADCAST_ERROR as _)); /// `NETLINK_NO_ENOBUFS` #[cfg(linux_kernel)] - pub const NO_ENOBUFS: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked(c::NETLINK_NO_ENOBUFS as _) }); + pub const NO_ENOBUFS: Protocol = Protocol(new_raw_protocol(c::NETLINK_NO_ENOBUFS as _)); /// `NETLINK_RX_RING` #[cfg(linux_kernel)] - pub const RX_RING: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked(c::NETLINK_RX_RING as _) }); + pub const RX_RING: Protocol = Protocol(new_raw_protocol(c::NETLINK_RX_RING as _)); /// `NETLINK_TX_RING` #[cfg(linux_kernel)] - pub const TX_RING: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked(c::NETLINK_TX_RING as _) }); + pub const TX_RING: Protocol = Protocol(new_raw_protocol(c::NETLINK_TX_RING as _)); /// `NETLINK_LISTEN_ALL_NSID` #[cfg(linux_kernel)] pub const LISTEN_ALL_NSID: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked(c::NETLINK_LISTEN_ALL_NSID as _) }); + Protocol(new_raw_protocol(c::NETLINK_LISTEN_ALL_NSID as _)); /// `NETLINK_LIST_MEMBERSHIPS` #[cfg(linux_kernel)] pub const LIST_MEMBERSHIPS: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked(c::NETLINK_LIST_MEMBERSHIPS as _) }); + Protocol(new_raw_protocol(c::NETLINK_LIST_MEMBERSHIPS as _)); /// `NETLINK_CAP_ACK` #[cfg(linux_kernel)] - pub const CAP_ACK: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked(c::NETLINK_CAP_ACK as _) }); + pub const CAP_ACK: Protocol = Protocol(new_raw_protocol(c::NETLINK_CAP_ACK as _)); /// `NETLINK_EXT_ACK` #[cfg(linux_kernel)] - pub const EXT_ACK: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked(c::NETLINK_EXT_ACK as _) }); + pub const EXT_ACK: Protocol = Protocol(new_raw_protocol(c::NETLINK_EXT_ACK as _)); /// `NETLINK_GET_STRICT_CHK` #[cfg(linux_kernel)] - pub const GET_STRICT_CHK: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked(c::NETLINK_GET_STRICT_CHK as _) }); + pub const GET_STRICT_CHK: Protocol = Protocol(new_raw_protocol(c::NETLINK_GET_STRICT_CHK as _)); } /// `ETH_P_*` constants. -/// // These are translated into 16-bit big-endian form because that's what the -// `AddressFamily::PACKET` address family [expects]. +// [`AddressFamily::PACKET`] address family [expects]. // // [expects]: https://man7.org/linux/man-pages/man7/packet.7.html pub mod eth { #[cfg(linux_kernel)] use { - super::{Protocol, RawProtocol}, + super::{new_raw_protocol, Protocol}, crate::backend::c, }; /// `ETH_P_LOOP` #[cfg(linux_kernel)] - pub const LOOP: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_LOOP as u16).to_be() as u32) }); + pub const LOOP: Protocol = Protocol(new_raw_protocol((c::ETH_P_LOOP as u16).to_be() as u32)); /// `ETH_P_PUP` #[cfg(linux_kernel)] - pub const PUP: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_PUP as u16).to_be() as u32) }); + pub const PUP: Protocol = Protocol(new_raw_protocol((c::ETH_P_PUP as u16).to_be() as u32)); /// `ETH_P_PUPAT` #[cfg(linux_kernel)] - pub const PUPAT: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_PUPAT as u16).to_be() as u32) }); + pub const PUPAT: Protocol = Protocol(new_raw_protocol((c::ETH_P_PUPAT as u16).to_be() as u32)); /// `ETH_P_TSN` #[cfg(linux_kernel)] - pub const TSN: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_TSN as u16).to_be() as u32) }); + pub const TSN: Protocol = Protocol(new_raw_protocol((c::ETH_P_TSN as u16).to_be() as u32)); /// `ETH_P_ERSPAN2` #[cfg(linux_kernel)] pub const ERSPAN2: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_ERSPAN2 as u16).to_be() as u32) }); + Protocol(new_raw_protocol((c::ETH_P_ERSPAN2 as u16).to_be() as u32)); /// `ETH_P_IP` #[cfg(linux_kernel)] - pub const IP: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_IP as u16).to_be() as u32) }); + pub const IP: Protocol = Protocol(new_raw_protocol((c::ETH_P_IP as u16).to_be() as u32)); /// `ETH_P_X25` #[cfg(linux_kernel)] - pub const X25: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_X25 as u16).to_be() as u32) }); + pub const X25: Protocol = Protocol(new_raw_protocol((c::ETH_P_X25 as u16).to_be() as u32)); /// `ETH_P_ARP` #[cfg(linux_kernel)] - pub const ARP: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_ARP as u16).to_be() as u32) }); + pub const ARP: Protocol = Protocol(new_raw_protocol((c::ETH_P_ARP as u16).to_be() as u32)); /// `ETH_P_BPQ` #[cfg(linux_kernel)] - pub const BPQ: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_BPQ as u16).to_be() as u32) }); + pub const BPQ: Protocol = Protocol(new_raw_protocol((c::ETH_P_BPQ as u16).to_be() as u32)); /// `ETH_P_IEEEPUP` #[cfg(linux_kernel)] pub const IEEEPUP: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_IEEEPUP as u16).to_be() as u32) }); + Protocol(new_raw_protocol((c::ETH_P_IEEEPUP as u16).to_be() as u32)); /// `ETH_P_IEEEPUPAT` #[cfg(linux_kernel)] pub const IEEEPUPAT: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_IEEEPUPAT as u16).to_be() as u32) }); + Protocol(new_raw_protocol((c::ETH_P_IEEEPUPAT as u16).to_be() as u32)); /// `ETH_P_BATMAN` #[cfg(linux_kernel)] pub const BATMAN: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_BATMAN as u16).to_be() as u32) }); + Protocol(new_raw_protocol((c::ETH_P_BATMAN as u16).to_be() as u32)); /// `ETH_P_DEC` #[cfg(linux_kernel)] - pub const DEC: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_DEC as u16).to_be() as u32) }); + pub const DEC: Protocol = Protocol(new_raw_protocol((c::ETH_P_DEC as u16).to_be() as u32)); /// `ETH_P_DNA_DL` #[cfg(linux_kernel)] pub const DNA_DL: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_DNA_DL as u16).to_be() as u32) }); + Protocol(new_raw_protocol((c::ETH_P_DNA_DL as u16).to_be() as u32)); /// `ETH_P_DNA_RC` #[cfg(linux_kernel)] pub const DNA_RC: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_DNA_RC as u16).to_be() as u32) }); + Protocol(new_raw_protocol((c::ETH_P_DNA_RC as u16).to_be() as u32)); /// `ETH_P_DNA_RT` #[cfg(linux_kernel)] pub const DNA_RT: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_DNA_RT as u16).to_be() as u32) }); + Protocol(new_raw_protocol((c::ETH_P_DNA_RT as u16).to_be() as u32)); /// `ETH_P_LAT` #[cfg(linux_kernel)] - pub const LAT: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_LAT as u16).to_be() as u32) }); + pub const LAT: Protocol = Protocol(new_raw_protocol((c::ETH_P_LAT as u16).to_be() as u32)); /// `ETH_P_DIAG` #[cfg(linux_kernel)] - pub const DIAG: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_DIAG as u16).to_be() as u32) }); + pub const DIAG: Protocol = Protocol(new_raw_protocol((c::ETH_P_DIAG as u16).to_be() as u32)); /// `ETH_P_CUST` #[cfg(linux_kernel)] - pub const CUST: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_CUST as u16).to_be() as u32) }); + pub const CUST: Protocol = Protocol(new_raw_protocol((c::ETH_P_CUST as u16).to_be() as u32)); /// `ETH_P_SCA` #[cfg(linux_kernel)] - pub const SCA: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_SCA as u16).to_be() as u32) }); + pub const SCA: Protocol = Protocol(new_raw_protocol((c::ETH_P_SCA as u16).to_be() as u32)); /// `ETH_P_TEB` #[cfg(linux_kernel)] - pub const TEB: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_TEB as u16).to_be() as u32) }); + pub const TEB: Protocol = Protocol(new_raw_protocol((c::ETH_P_TEB as u16).to_be() as u32)); /// `ETH_P_RARP` #[cfg(linux_kernel)] - pub const RARP: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_RARP as u16).to_be() as u32) }); + pub const RARP: Protocol = Protocol(new_raw_protocol((c::ETH_P_RARP as u16).to_be() as u32)); /// `ETH_P_ATALK` #[cfg(linux_kernel)] - pub const ATALK: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_ATALK as u16).to_be() as u32) }); + pub const ATALK: Protocol = Protocol(new_raw_protocol((c::ETH_P_ATALK as u16).to_be() as u32)); /// `ETH_P_AARP` #[cfg(linux_kernel)] - pub const AARP: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_AARP as u16).to_be() as u32) }); + pub const AARP: Protocol = Protocol(new_raw_protocol((c::ETH_P_AARP as u16).to_be() as u32)); /// `ETH_P_8021Q` #[cfg(linux_kernel)] pub const P_8021Q: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_8021Q as u16).to_be() as u32) }); + Protocol(new_raw_protocol((c::ETH_P_8021Q as u16).to_be() as u32)); /// `ETH_P_ERSPAN` #[cfg(linux_kernel)] pub const ERSPAN: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_ERSPAN as u16).to_be() as u32) }); + Protocol(new_raw_protocol((c::ETH_P_ERSPAN as u16).to_be() as u32)); /// `ETH_P_IPX` #[cfg(linux_kernel)] - pub const IPX: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_IPX as u16).to_be() as u32) }); + pub const IPX: Protocol = Protocol(new_raw_protocol((c::ETH_P_IPX as u16).to_be() as u32)); /// `ETH_P_IPV6` #[cfg(linux_kernel)] - pub const IPV6: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_IPV6 as u16).to_be() as u32) }); + pub const IPV6: Protocol = Protocol(new_raw_protocol((c::ETH_P_IPV6 as u16).to_be() as u32)); /// `ETH_P_PAUSE` #[cfg(linux_kernel)] - pub const PAUSE: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_PAUSE as u16).to_be() as u32) }); + pub const PAUSE: Protocol = Protocol(new_raw_protocol((c::ETH_P_PAUSE as u16).to_be() as u32)); /// `ETH_P_SLOW` #[cfg(linux_kernel)] - pub const SLOW: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_SLOW as u16).to_be() as u32) }); + pub const SLOW: Protocol = Protocol(new_raw_protocol((c::ETH_P_SLOW as u16).to_be() as u32)); /// `ETH_P_WCCP` #[cfg(linux_kernel)] - pub const WCCP: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_WCCP as u16).to_be() as u32) }); + pub const WCCP: Protocol = Protocol(new_raw_protocol((c::ETH_P_WCCP as u16).to_be() as u32)); /// `ETH_P_MPLS_UC` #[cfg(linux_kernel)] pub const MPLS_UC: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_MPLS_UC as u16).to_be() as u32) }); + Protocol(new_raw_protocol((c::ETH_P_MPLS_UC as u16).to_be() as u32)); /// `ETH_P_MPLS_MC` #[cfg(linux_kernel)] pub const MPLS_MC: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_MPLS_MC as u16).to_be() as u32) }); + Protocol(new_raw_protocol((c::ETH_P_MPLS_MC as u16).to_be() as u32)); /// `ETH_P_ATMMPOA` #[cfg(linux_kernel)] pub const ATMMPOA: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_ATMMPOA as u16).to_be() as u32) }); + Protocol(new_raw_protocol((c::ETH_P_ATMMPOA as u16).to_be() as u32)); /// `ETH_P_PPP_DISC` #[cfg(linux_kernel)] pub const PPP_DISC: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_PPP_DISC as u16).to_be() as u32) }); + Protocol(new_raw_protocol((c::ETH_P_PPP_DISC as u16).to_be() as u32)); /// `ETH_P_PPP_SES` #[cfg(linux_kernel)] pub const PPP_SES: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_PPP_SES as u16).to_be() as u32) }); + Protocol(new_raw_protocol((c::ETH_P_PPP_SES as u16).to_be() as u32)); /// `ETH_P_LINK_CTL` #[cfg(linux_kernel)] pub const LINK_CTL: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_LINK_CTL as u16).to_be() as u32) }); + Protocol(new_raw_protocol((c::ETH_P_LINK_CTL as u16).to_be() as u32)); /// `ETH_P_ATMFATE` #[cfg(linux_kernel)] pub const ATMFATE: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_ATMFATE as u16).to_be() as u32) }); + Protocol(new_raw_protocol((c::ETH_P_ATMFATE as u16).to_be() as u32)); /// `ETH_P_PAE` #[cfg(linux_kernel)] - pub const PAE: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_PAE as u16).to_be() as u32) }); + pub const PAE: Protocol = Protocol(new_raw_protocol((c::ETH_P_PAE as u16).to_be() as u32)); /// `ETH_P_PROFINET` #[cfg(linux_kernel)] pub const PROFINET: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_PROFINET as u16).to_be() as u32) }); + Protocol(new_raw_protocol((c::ETH_P_PROFINET as u16).to_be() as u32)); /// `ETH_P_REALTEK` #[cfg(linux_kernel)] pub const REALTEK: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_REALTEK as u16).to_be() as u32) }); + Protocol(new_raw_protocol((c::ETH_P_REALTEK as u16).to_be() as u32)); /// `ETH_P_AOE` #[cfg(linux_kernel)] - pub const AOE: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_AOE as u16).to_be() as u32) }); + pub const AOE: Protocol = Protocol(new_raw_protocol((c::ETH_P_AOE as u16).to_be() as u32)); /// `ETH_P_ETHERCAT` #[cfg(linux_kernel)] pub const ETHERCAT: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_ETHERCAT as u16).to_be() as u32) }); + Protocol(new_raw_protocol((c::ETH_P_ETHERCAT as u16).to_be() as u32)); /// `ETH_P_8021AD` #[cfg(linux_kernel)] pub const P_8021AD: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_8021AD as u16).to_be() as u32) }); + Protocol(new_raw_protocol((c::ETH_P_8021AD as u16).to_be() as u32)); /// `ETH_P_802_EX1` #[cfg(linux_kernel)] pub const P_802_EX1: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_802_EX1 as u16).to_be() as u32) }); + Protocol(new_raw_protocol((c::ETH_P_802_EX1 as u16).to_be() as u32)); /// `ETH_P_PREAUTH` #[cfg(linux_kernel)] pub const PREAUTH: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_PREAUTH as u16).to_be() as u32) }); + Protocol(new_raw_protocol((c::ETH_P_PREAUTH as u16).to_be() as u32)); /// `ETH_P_TIPC` #[cfg(linux_kernel)] - pub const TIPC: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_TIPC as u16).to_be() as u32) }); + pub const TIPC: Protocol = Protocol(new_raw_protocol((c::ETH_P_TIPC as u16).to_be() as u32)); /// `ETH_P_LLDP` #[cfg(linux_kernel)] - pub const LLDP: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_LLDP as u16).to_be() as u32) }); + pub const LLDP: Protocol = Protocol(new_raw_protocol((c::ETH_P_LLDP as u16).to_be() as u32)); /// `ETH_P_MRP` #[cfg(linux_kernel)] - pub const MRP: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_MRP as u16).to_be() as u32) }); + pub const MRP: Protocol = Protocol(new_raw_protocol((c::ETH_P_MRP as u16).to_be() as u32)); /// `ETH_P_MACSEC` #[cfg(linux_kernel)] pub const MACSEC: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_MACSEC as u16).to_be() as u32) }); + Protocol(new_raw_protocol((c::ETH_P_MACSEC as u16).to_be() as u32)); /// `ETH_P_8021AH` #[cfg(linux_kernel)] pub const P_8021AH: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_8021AH as u16).to_be() as u32) }); + Protocol(new_raw_protocol((c::ETH_P_8021AH as u16).to_be() as u32)); /// `ETH_P_MVRP` #[cfg(linux_kernel)] - pub const MVRP: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_MVRP as u16).to_be() as u32) }); + pub const MVRP: Protocol = Protocol(new_raw_protocol((c::ETH_P_MVRP as u16).to_be() as u32)); /// `ETH_P_1588` #[cfg(linux_kernel)] - pub const P_1588: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_1588 as u16).to_be() as u32) }); + pub const P_1588: Protocol = Protocol(new_raw_protocol((c::ETH_P_1588 as u16).to_be() as u32)); /// `ETH_P_NCSI` #[cfg(linux_kernel)] - pub const NCSI: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_NCSI as u16).to_be() as u32) }); + pub const NCSI: Protocol = Protocol(new_raw_protocol((c::ETH_P_NCSI as u16).to_be() as u32)); /// `ETH_P_PRP` #[cfg(linux_kernel)] - pub const PRP: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_PRP as u16).to_be() as u32) }); + pub const PRP: Protocol = Protocol(new_raw_protocol((c::ETH_P_PRP as u16).to_be() as u32)); /// `ETH_P_CFM` #[cfg(linux_kernel)] - pub const CFM: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_CFM as u16).to_be() as u32) }); + pub const CFM: Protocol = Protocol(new_raw_protocol((c::ETH_P_CFM as u16).to_be() as u32)); /// `ETH_P_FCOE` #[cfg(linux_kernel)] - pub const FCOE: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_FCOE as u16).to_be() as u32) }); + pub const FCOE: Protocol = Protocol(new_raw_protocol((c::ETH_P_FCOE as u16).to_be() as u32)); /// `ETH_P_IBOE` #[cfg(linux_kernel)] - pub const IBOE: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_IBOE as u16).to_be() as u32) }); + pub const IBOE: Protocol = Protocol(new_raw_protocol((c::ETH_P_IBOE as u16).to_be() as u32)); /// `ETH_P_TDLS` #[cfg(linux_kernel)] - pub const TDLS: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_TDLS as u16).to_be() as u32) }); + pub const TDLS: Protocol = Protocol(new_raw_protocol((c::ETH_P_TDLS as u16).to_be() as u32)); /// `ETH_P_FIP` #[cfg(linux_kernel)] - pub const FIP: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_FIP as u16).to_be() as u32) }); + pub const FIP: Protocol = Protocol(new_raw_protocol((c::ETH_P_FIP as u16).to_be() as u32)); /// `ETH_P_80221` #[cfg(linux_kernel)] pub const P_80221: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_80221 as u16).to_be() as u32) }); + Protocol(new_raw_protocol((c::ETH_P_80221 as u16).to_be() as u32)); /// `ETH_P_HSR` #[cfg(linux_kernel)] - pub const HSR: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_HSR as u16).to_be() as u32) }); + pub const HSR: Protocol = Protocol(new_raw_protocol((c::ETH_P_HSR as u16).to_be() as u32)); /// `ETH_P_NSH` #[cfg(linux_kernel)] - pub const NSH: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_NSH as u16).to_be() as u32) }); + pub const NSH: Protocol = Protocol(new_raw_protocol((c::ETH_P_NSH as u16).to_be() as u32)); /// `ETH_P_LOOPBACK` #[cfg(linux_kernel)] pub const LOOPBACK: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_LOOPBACK as u16).to_be() as u32) }); + Protocol(new_raw_protocol((c::ETH_P_LOOPBACK as u16).to_be() as u32)); /// `ETH_P_QINQ1` #[cfg(linux_kernel)] - pub const QINQ1: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_QINQ1 as u16).to_be() as u32) }); + pub const QINQ1: Protocol = Protocol(new_raw_protocol((c::ETH_P_QINQ1 as u16).to_be() as u32)); /// `ETH_P_QINQ2` #[cfg(linux_kernel)] - pub const QINQ2: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_QINQ2 as u16).to_be() as u32) }); + pub const QINQ2: Protocol = Protocol(new_raw_protocol((c::ETH_P_QINQ2 as u16).to_be() as u32)); /// `ETH_P_QINQ3` #[cfg(linux_kernel)] - pub const QINQ3: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_QINQ3 as u16).to_be() as u32) }); + pub const QINQ3: Protocol = Protocol(new_raw_protocol((c::ETH_P_QINQ3 as u16).to_be() as u32)); /// `ETH_P_EDSA` #[cfg(linux_kernel)] - pub const EDSA: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_EDSA as u16).to_be() as u32) }); + pub const EDSA: Protocol = Protocol(new_raw_protocol((c::ETH_P_EDSA as u16).to_be() as u32)); /// `ETH_P_DSA_8021Q` #[cfg(linux_kernel)] pub const DSA_8021Q: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_DSA_8021Q as u16).to_be() as u32) }); + Protocol(new_raw_protocol((c::ETH_P_DSA_8021Q as u16).to_be() as u32)); /// `ETH_P_DSA_A5PSW` #[cfg(linux_kernel)] pub const DSA_A5PSW: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_DSA_A5PSW as u16).to_be() as u32) }); + Protocol(new_raw_protocol((c::ETH_P_DSA_A5PSW as u16).to_be() as u32)); /// `ETH_P_IFE` #[cfg(linux_kernel)] - pub const IFE: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_IFE as u16).to_be() as u32) }); + pub const IFE: Protocol = Protocol(new_raw_protocol((c::ETH_P_IFE as u16).to_be() as u32)); /// `ETH_P_AF_IUCV` #[cfg(linux_kernel)] pub const AF_IUCV: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_AF_IUCV as u16).to_be() as u32) }); + Protocol(new_raw_protocol((c::ETH_P_AF_IUCV as u16).to_be() as u32)); /// `ETH_P_802_3_MIN` #[cfg(linux_kernel)] pub const P_802_3_MIN: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_802_3_MIN as u16).to_be() as u32) }); + Protocol(new_raw_protocol((c::ETH_P_802_3_MIN as u16).to_be() as u32)); /// `ETH_P_802_3` #[cfg(linux_kernel)] pub const P_802_3: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_802_3 as u16).to_be() as u32) }); + Protocol(new_raw_protocol((c::ETH_P_802_3 as u16).to_be() as u32)); /// `ETH_P_AX25` #[cfg(linux_kernel)] - pub const AX25: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_AX25 as u16).to_be() as u32) }); + pub const AX25: Protocol = Protocol(new_raw_protocol((c::ETH_P_AX25 as u16).to_be() as u32)); /// `ETH_P_ALL` #[cfg(linux_kernel)] - pub const ALL: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_ALL as u16).to_be() as u32) }); + pub const ALL: Protocol = Protocol(new_raw_protocol((c::ETH_P_ALL as u16).to_be() as u32)); /// `ETH_P_802_2` #[cfg(linux_kernel)] pub const P_802_2: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_802_2 as u16).to_be() as u32) }); + Protocol(new_raw_protocol((c::ETH_P_802_2 as u16).to_be() as u32)); /// `ETH_P_SNAP` #[cfg(linux_kernel)] - pub const SNAP: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_SNAP as u16).to_be() as u32) }); + pub const SNAP: Protocol = Protocol(new_raw_protocol((c::ETH_P_SNAP as u16).to_be() as u32)); /// `ETH_P_DDCMP` #[cfg(linux_kernel)] - pub const DDCMP: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_DDCMP as u16).to_be() as u32) }); + pub const DDCMP: Protocol = Protocol(new_raw_protocol((c::ETH_P_DDCMP as u16).to_be() as u32)); /// `ETH_P_WAN_PPP` #[cfg(linux_kernel)] pub const WAN_PPP: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_WAN_PPP as u16).to_be() as u32) }); + Protocol(new_raw_protocol((c::ETH_P_WAN_PPP as u16).to_be() as u32)); /// `ETH_P_PPP_MP` #[cfg(linux_kernel)] pub const PPP_MP: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_PPP_MP as u16).to_be() as u32) }); + Protocol(new_raw_protocol((c::ETH_P_PPP_MP as u16).to_be() as u32)); /// `ETH_P_LOCALTALK` #[cfg(linux_kernel)] pub const LOCALTALK: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_LOCALTALK as u16).to_be() as u32) }); + Protocol(new_raw_protocol((c::ETH_P_LOCALTALK as u16).to_be() as u32)); /// `ETH_P_CAN` #[cfg(linux_kernel)] - pub const CAN: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_CAN as u16).to_be() as u32) }); + pub const CAN: Protocol = Protocol(new_raw_protocol((c::ETH_P_CAN as u16).to_be() as u32)); /// `ETH_P_CANFD` #[cfg(linux_kernel)] - pub const CANFD: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_CANFD as u16).to_be() as u32) }); + pub const CANFD: Protocol = Protocol(new_raw_protocol((c::ETH_P_CANFD as u16).to_be() as u32)); /// `ETH_P_CANXL` #[cfg(linux_kernel)] - pub const CANXL: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_CANXL as u16).to_be() as u32) }); + pub const CANXL: Protocol = Protocol(new_raw_protocol((c::ETH_P_CANXL as u16).to_be() as u32)); /// `ETH_P_PPPTALK` #[cfg(linux_kernel)] pub const PPPTALK: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_PPPTALK as u16).to_be() as u32) }); + Protocol(new_raw_protocol((c::ETH_P_PPPTALK as u16).to_be() as u32)); /// `ETH_P_TR_802_2` #[cfg(linux_kernel)] pub const TR_802_2: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_TR_802_2 as u16).to_be() as u32) }); + Protocol(new_raw_protocol((c::ETH_P_TR_802_2 as u16).to_be() as u32)); /// `ETH_P_MOBITEX` #[cfg(linux_kernel)] pub const MOBITEX: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_MOBITEX as u16).to_be() as u32) }); + Protocol(new_raw_protocol((c::ETH_P_MOBITEX as u16).to_be() as u32)); /// `ETH_P_CONTROL` #[cfg(linux_kernel)] pub const CONTROL: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_CONTROL as u16).to_be() as u32) }); + Protocol(new_raw_protocol((c::ETH_P_CONTROL as u16).to_be() as u32)); /// `ETH_P_IRDA` #[cfg(linux_kernel)] - pub const IRDA: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_IRDA as u16).to_be() as u32) }); + pub const IRDA: Protocol = Protocol(new_raw_protocol((c::ETH_P_IRDA as u16).to_be() as u32)); /// `ETH_P_ECONET` #[cfg(linux_kernel)] pub const ECONET: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_ECONET as u16).to_be() as u32) }); + Protocol(new_raw_protocol((c::ETH_P_ECONET as u16).to_be() as u32)); /// `ETH_P_HDLC` #[cfg(linux_kernel)] - pub const HDLC: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_HDLC as u16).to_be() as u32) }); + pub const HDLC: Protocol = Protocol(new_raw_protocol((c::ETH_P_HDLC as u16).to_be() as u32)); /// `ETH_P_ARCNET` #[cfg(linux_kernel)] pub const ARCNET: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_ARCNET as u16).to_be() as u32) }); + Protocol(new_raw_protocol((c::ETH_P_ARCNET as u16).to_be() as u32)); /// `ETH_P_DSA` #[cfg(linux_kernel)] - pub const DSA: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_DSA as u16).to_be() as u32) }); + pub const DSA: Protocol = Protocol(new_raw_protocol((c::ETH_P_DSA as u16).to_be() as u32)); /// `ETH_P_TRAILER` #[cfg(linux_kernel)] pub const TRAILER: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_TRAILER as u16).to_be() as u32) }); + Protocol(new_raw_protocol((c::ETH_P_TRAILER as u16).to_be() as u32)); /// `ETH_P_PHONET` #[cfg(linux_kernel)] pub const PHONET: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_PHONET as u16).to_be() as u32) }); + Protocol(new_raw_protocol((c::ETH_P_PHONET as u16).to_be() as u32)); /// `ETH_P_IEEE802154` #[cfg(linux_kernel)] - pub const IEEE802154: Protocol = Protocol(unsafe { - RawProtocol::new_unchecked((c::ETH_P_IEEE802154 as u16).to_be() as u32) - }); + pub const IEEE802154: Protocol = + Protocol(new_raw_protocol((c::ETH_P_IEEE802154 as u16).to_be() as u32)); /// `ETH_P_CAIF` #[cfg(linux_kernel)] - pub const CAIF: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_CAIF as u16).to_be() as u32) }); + pub const CAIF: Protocol = Protocol(new_raw_protocol((c::ETH_P_CAIF as u16).to_be() as u32)); /// `ETH_P_XDSA` #[cfg(linux_kernel)] - pub const XDSA: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_XDSA as u16).to_be() as u32) }); + pub const XDSA: Protocol = Protocol(new_raw_protocol((c::ETH_P_XDSA as u16).to_be() as u32)); /// `ETH_P_MAP` #[cfg(linux_kernel)] - pub const MAP: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_MAP as u16).to_be() as u32) }); + pub const MAP: Protocol = Protocol(new_raw_protocol((c::ETH_P_MAP as u16).to_be() as u32)); /// `ETH_P_MCTP` #[cfg(linux_kernel)] - pub const MCTP: Protocol = - Protocol(unsafe { RawProtocol::new_unchecked((c::ETH_P_MCTP as u16).to_be() as u32) }); + pub const MCTP: Protocol = Protocol(new_raw_protocol((c::ETH_P_MCTP as u16).to_be() as u32)); } #[rustfmt::skip] @@ -1361,12 +1316,23 @@ bitflags! { #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] pub struct SocketFlags: c::c_uint { /// `SOCK_NONBLOCK` - #[cfg(not(any(apple, windows, target_os = "espidf", target_os = "haiku", target_os = "nto")))] + #[cfg(not(any( + apple, + windows, + target_os = "aix", + target_os = "espidf", + target_os = "haiku", + target_os = "nto", + )))] const NONBLOCK = bitcast!(c::SOCK_NONBLOCK); /// `SOCK_CLOEXEC` - #[cfg(not(any(apple, windows, target_os = "haiku")))] + #[cfg(not(any(apple, windows, target_os = "aix", target_os = "haiku")))] const CLOEXEC = bitcast!(c::SOCK_CLOEXEC); + + // This deliberately lacks a `const _ = !0`, so that users can use + // `from_bits_truncate` to extract the `SocketFlags` from a flags + // value that also includes a `SocketType`. } } @@ -1375,8 +1341,8 @@ fn test_sizes() { use c::c_int; use core::mem::transmute; - // Backend code needs to cast these to `c_int` so make sure that cast - // isn't lossy. + // Backend code needs to cast these to `c_int` so make sure that cast isn't + // lossy. assert_eq_size!(RawProtocol, c_int); assert_eq_size!(Protocol, c_int); assert_eq_size!(Option, c_int); @@ -1385,13 +1351,14 @@ fn test_sizes() { assert_eq_size!(SocketType, c_int); assert_eq_size!(SocketFlags, c_int); - // Rustix doesn't depend on `Option` matching the ABI of - // a raw integer for correctness, but it should work nonetheless. + // Rustix doesn't depend on `Option` matching the ABI of a raw + // integer for correctness, but it should work nonetheless. + #[allow(unsafe_code)] unsafe { let t: Option = None; - assert_eq!(0_u32, transmute(t)); + assert_eq!(0_u32, transmute::, u32>(t)); let t: Option = Some(Protocol::from_raw(RawProtocol::new(4567).unwrap())); - assert_eq!(4567_u32, transmute(t)); + assert_eq!(4567_u32, transmute::, u32>(t)); } } diff --git a/vendor/rustix/src/param/init.rs b/vendor/rustix/src/param/init.rs index d261fabd2..09d7c96bd 100644 --- a/vendor/rustix/src/param/init.rs +++ b/vendor/rustix/src/param/init.rs @@ -2,8 +2,8 @@ //! //! # Safety //! -//! On mustang, or on any non-glibc non-musl platform, the `init` function must -//! be called before any other function in this module. It is unsafe because it +//! When "use-explicitly-provided-auxv" is enabled, the `init` function must be +//! called before any other function in this module. It is unsafe because it //! operates on raw pointers. #![allow(unsafe_code)] diff --git a/vendor/rustix/src/param/mod.rs b/vendor/rustix/src/param/mod.rs index dde09772a..905eae7e3 100644 --- a/vendor/rustix/src/param/mod.rs +++ b/vendor/rustix/src/param/mod.rs @@ -6,9 +6,9 @@ //! between different processes on the same system. mod auxv; -#[cfg(target_vendor = "mustang")] +#[cfg(feature = "use-explicitly-provided-auxv")] mod init; pub use auxv::*; -#[cfg(target_vendor = "mustang")] +#[cfg(feature = "use-explicitly-provided-auxv")] pub use init::init; diff --git a/vendor/rustix/src/path/arg.rs b/vendor/rustix/src/path/arg.rs index 64091611c..3b0ad91ae 100644 --- a/vendor/rustix/src/path/arg.rs +++ b/vendor/rustix/src/path/arg.rs @@ -5,16 +5,13 @@ //! to rustix APIs with string arguments, and it allows rustix to implement //! NUL-termination without the need for copying where possible. -use crate::ffi::{CStr, CString}; +use crate::ffi::CStr; use crate::io; #[cfg(feature = "itoa")] use crate::path::DecInt; use crate::path::SMALL_PATH_BUFFER_SIZE; -use alloc::borrow::Cow; -#[cfg(feature = "itoa")] +#[cfg(all(feature = "alloc", feature = "itoa"))] use alloc::borrow::ToOwned; -use alloc::string::String; -use alloc::vec::Vec; use core::mem::MaybeUninit; use core::{ptr, slice, str}; #[cfg(feature = "std")] @@ -29,6 +26,10 @@ use std::os::vxworks::ext::ffi::{OsStrExt, OsStringExt}; use std::os::wasi::ffi::{OsStrExt, OsStringExt}; #[cfg(feature = "std")] use std::path::{Component, Components, Iter, Path, PathBuf}; +#[cfg(feature = "alloc")] +use {crate::ffi::CString, alloc::borrow::Cow}; +#[cfg(feature = "alloc")] +use {alloc::string::String, alloc::vec::Vec}; /// A trait for passing path arguments. /// @@ -65,15 +66,18 @@ pub trait Arg { /// Returns a view of this string as a string slice. fn as_str(&self) -> io::Result<&str>; - /// Returns a potentially-lossy rendering of this string as a `Cow<'_, - /// str>`. + /// Returns a potentially-lossy rendering of this string as a + /// `Cow<'_, str>`. + #[cfg(feature = "alloc")] fn to_string_lossy(&self) -> Cow<'_, str>; /// Returns a view of this string as a maybe-owned [`CStr`]. + #[cfg(feature = "alloc")] fn as_cow_c_str(&self) -> io::Result>; /// Consumes `self` and returns a view of this string as a maybe-owned /// [`CStr`]. + #[cfg(feature = "alloc")] fn into_c_str<'b>(self) -> io::Result> where Self: 'b; @@ -91,11 +95,13 @@ impl Arg for &str { Ok(self) } + #[cfg(feature = "alloc")] #[inline] fn to_string_lossy(&self) -> Cow<'_, str> { Cow::Borrowed(self) } + #[cfg(feature = "alloc")] #[inline] fn as_cow_c_str(&self) -> io::Result> { Ok(Cow::Owned( @@ -103,6 +109,7 @@ impl Arg for &str { )) } + #[cfg(feature = "alloc")] #[inline] fn into_c_str<'b>(self) -> io::Result> where @@ -123,17 +130,20 @@ impl Arg for &str { } } +#[cfg(feature = "alloc")] impl Arg for &String { #[inline] fn as_str(&self) -> io::Result<&str> { Ok(self) } + #[cfg(feature = "alloc")] #[inline] fn to_string_lossy(&self) -> Cow<'_, str> { Cow::Borrowed(self) } + #[cfg(feature = "alloc")] #[inline] fn as_cow_c_str(&self) -> io::Result> { Ok(Cow::Owned( @@ -141,6 +151,7 @@ impl Arg for &String { )) } + #[cfg(feature = "alloc")] #[inline] fn into_c_str<'b>(self) -> io::Result> where @@ -159,17 +170,20 @@ impl Arg for &String { } } +#[cfg(feature = "alloc")] impl Arg for String { #[inline] fn as_str(&self) -> io::Result<&str> { Ok(self) } + #[cfg(feature = "alloc")] #[inline] fn to_string_lossy(&self) -> Cow<'_, str> { Cow::Borrowed(self) } + #[cfg(feature = "alloc")] #[inline] fn as_cow_c_str(&self) -> io::Result> { Ok(Cow::Owned( @@ -177,6 +191,7 @@ impl Arg for String { )) } + #[cfg(feature = "alloc")] #[inline] fn into_c_str<'b>(self) -> io::Result> where @@ -204,11 +219,13 @@ impl Arg for &OsStr { self.to_str().ok_or(io::Errno::INVAL) } + #[cfg(feature = "alloc")] #[inline] fn to_string_lossy(&self) -> Cow<'_, str> { OsStr::to_string_lossy(self) } + #[cfg(feature = "alloc")] #[inline] fn as_cow_c_str(&self) -> io::Result> { Ok(Cow::Owned( @@ -216,6 +233,7 @@ impl Arg for &OsStr { )) } + #[cfg(feature = "alloc")] #[inline] fn into_c_str<'b>(self) -> io::Result> where @@ -243,11 +261,13 @@ impl Arg for &OsString { OsString::as_os_str(self).to_str().ok_or(io::Errno::INVAL) } + #[cfg(feature = "alloc")] #[inline] fn to_string_lossy(&self) -> Cow<'_, str> { self.as_os_str().to_string_lossy() } + #[cfg(feature = "alloc")] #[inline] fn as_cow_c_str(&self) -> io::Result> { Ok(Cow::Owned( @@ -256,6 +276,7 @@ impl Arg for &OsString { )) } + #[cfg(feature = "alloc")] #[inline] fn into_c_str<'b>(self) -> io::Result> where @@ -281,11 +302,13 @@ impl Arg for OsString { self.as_os_str().to_str().ok_or(io::Errno::INVAL) } + #[cfg(feature = "alloc")] #[inline] fn to_string_lossy(&self) -> Cow<'_, str> { self.as_os_str().to_string_lossy() } + #[cfg(feature = "alloc")] #[inline] fn as_cow_c_str(&self) -> io::Result> { Ok(Cow::Owned( @@ -293,6 +316,7 @@ impl Arg for OsString { )) } + #[cfg(feature = "alloc")] #[inline] fn into_c_str<'b>(self) -> io::Result> where @@ -320,11 +344,13 @@ impl Arg for &Path { self.as_os_str().to_str().ok_or(io::Errno::INVAL) } + #[cfg(feature = "alloc")] #[inline] fn to_string_lossy(&self) -> Cow<'_, str> { Path::to_string_lossy(self) } + #[cfg(feature = "alloc")] #[inline] fn as_cow_c_str(&self) -> io::Result> { Ok(Cow::Owned( @@ -332,6 +358,7 @@ impl Arg for &Path { )) } + #[cfg(feature = "alloc")] #[inline] fn into_c_str<'b>(self) -> io::Result> where @@ -362,11 +389,13 @@ impl Arg for &PathBuf { .ok_or(io::Errno::INVAL) } + #[cfg(feature = "alloc")] #[inline] fn to_string_lossy(&self) -> Cow<'_, str> { self.as_path().to_string_lossy() } + #[cfg(feature = "alloc")] #[inline] fn as_cow_c_str(&self) -> io::Result> { Ok(Cow::Owned( @@ -375,6 +404,7 @@ impl Arg for &PathBuf { )) } + #[cfg(feature = "alloc")] #[inline] fn into_c_str<'b>(self) -> io::Result> where @@ -400,11 +430,13 @@ impl Arg for PathBuf { self.as_os_str().to_str().ok_or(io::Errno::INVAL) } + #[cfg(feature = "alloc")] #[inline] fn to_string_lossy(&self) -> Cow<'_, str> { self.as_os_str().to_string_lossy() } + #[cfg(feature = "alloc")] #[inline] fn as_cow_c_str(&self) -> io::Result> { Ok(Cow::Owned( @@ -412,6 +444,7 @@ impl Arg for PathBuf { )) } + #[cfg(feature = "alloc")] #[inline] fn into_c_str<'b>(self) -> io::Result> where @@ -441,16 +474,19 @@ impl Arg for &CStr { self.to_str().map_err(|_utf8_err| io::Errno::INVAL) } + #[cfg(feature = "alloc")] #[inline] fn to_string_lossy(&self) -> Cow<'_, str> { CStr::to_string_lossy(self) } + #[cfg(feature = "alloc")] #[inline] fn as_cow_c_str(&self) -> io::Result> { Ok(Cow::Borrowed(self)) } + #[cfg(feature = "alloc")] #[inline] fn into_c_str<'b>(self) -> io::Result> where @@ -469,22 +505,26 @@ impl Arg for &CStr { } } +#[cfg(feature = "alloc")] impl Arg for &CString { #[inline] fn as_str(&self) -> io::Result<&str> { unimplemented!() } + #[cfg(feature = "alloc")] #[inline] fn to_string_lossy(&self) -> Cow<'_, str> { unimplemented!() } + #[cfg(feature = "alloc")] #[inline] fn as_cow_c_str(&self) -> io::Result> { Ok(Cow::Borrowed(self)) } + #[cfg(feature = "alloc")] #[inline] fn into_c_str<'b>(self) -> io::Result> where @@ -503,22 +543,26 @@ impl Arg for &CString { } } +#[cfg(feature = "alloc")] impl Arg for CString { #[inline] fn as_str(&self) -> io::Result<&str> { self.to_str().map_err(|_utf8_err| io::Errno::INVAL) } + #[cfg(feature = "alloc")] #[inline] fn to_string_lossy(&self) -> Cow<'_, str> { CStr::to_string_lossy(self) } + #[cfg(feature = "alloc")] #[inline] fn as_cow_c_str(&self) -> io::Result> { Ok(Cow::Borrowed(self)) } + #[cfg(feature = "alloc")] #[inline] fn into_c_str<'b>(self) -> io::Result> where @@ -537,17 +581,20 @@ impl Arg for CString { } } +#[cfg(feature = "alloc")] impl<'a> Arg for Cow<'a, str> { #[inline] fn as_str(&self) -> io::Result<&str> { Ok(self) } + #[cfg(feature = "alloc")] #[inline] fn to_string_lossy(&self) -> Cow<'_, str> { Cow::Borrowed(self) } + #[cfg(feature = "alloc")] #[inline] fn as_cow_c_str(&self) -> io::Result> { Ok(Cow::Owned( @@ -555,6 +602,7 @@ impl<'a> Arg for Cow<'a, str> { )) } + #[cfg(feature = "alloc")] #[inline] fn into_c_str<'b>(self) -> io::Result> where @@ -580,17 +628,20 @@ impl<'a> Arg for Cow<'a, str> { } #[cfg(feature = "std")] +#[cfg(feature = "alloc")] impl<'a> Arg for Cow<'a, OsStr> { #[inline] fn as_str(&self) -> io::Result<&str> { (**self).to_str().ok_or(io::Errno::INVAL) } + #[cfg(feature = "alloc")] #[inline] fn to_string_lossy(&self) -> Cow<'_, str> { (**self).to_string_lossy() } + #[cfg(feature = "alloc")] #[inline] fn as_cow_c_str(&self) -> io::Result> { Ok(Cow::Owned( @@ -598,6 +649,7 @@ impl<'a> Arg for Cow<'a, OsStr> { )) } + #[cfg(feature = "alloc")] #[inline] fn into_c_str<'b>(self) -> io::Result> where @@ -622,23 +674,27 @@ impl<'a> Arg for Cow<'a, OsStr> { } } +#[cfg(feature = "alloc")] impl<'a> Arg for Cow<'a, CStr> { #[inline] fn as_str(&self) -> io::Result<&str> { self.to_str().map_err(|_utf8_err| io::Errno::INVAL) } + #[cfg(feature = "alloc")] #[inline] fn to_string_lossy(&self) -> Cow<'_, str> { let borrow: &CStr = core::borrow::Borrow::borrow(self); borrow.to_string_lossy() } + #[cfg(feature = "alloc")] #[inline] fn as_cow_c_str(&self) -> io::Result> { Ok(Cow::Borrowed(self)) } + #[cfg(feature = "alloc")] #[inline] fn into_c_str<'b>(self) -> io::Result> where @@ -664,11 +720,13 @@ impl<'a> Arg for Component<'a> { self.as_os_str().to_str().ok_or(io::Errno::INVAL) } + #[cfg(feature = "alloc")] #[inline] fn to_string_lossy(&self) -> Cow<'_, str> { self.as_os_str().to_string_lossy() } + #[cfg(feature = "alloc")] #[inline] fn as_cow_c_str(&self) -> io::Result> { Ok(Cow::Owned( @@ -676,6 +734,7 @@ impl<'a> Arg for Component<'a> { )) } + #[cfg(feature = "alloc")] #[inline] fn into_c_str<'b>(self) -> io::Result> where @@ -703,11 +762,13 @@ impl<'a> Arg for Components<'a> { self.as_path().to_str().ok_or(io::Errno::INVAL) } + #[cfg(feature = "alloc")] #[inline] fn to_string_lossy(&self) -> Cow<'_, str> { self.as_path().to_string_lossy() } + #[cfg(feature = "alloc")] #[inline] fn as_cow_c_str(&self) -> io::Result> { Ok(Cow::Owned( @@ -716,6 +777,7 @@ impl<'a> Arg for Components<'a> { )) } + #[cfg(feature = "alloc")] #[inline] fn into_c_str<'b>(self) -> io::Result> where @@ -744,11 +806,13 @@ impl<'a> Arg for Iter<'a> { self.as_path().to_str().ok_or(io::Errno::INVAL) } + #[cfg(feature = "alloc")] #[inline] fn to_string_lossy(&self) -> Cow<'_, str> { self.as_path().to_string_lossy() } + #[cfg(feature = "alloc")] #[inline] fn as_cow_c_str(&self) -> io::Result> { Ok(Cow::Owned( @@ -757,6 +821,7 @@ impl<'a> Arg for Iter<'a> { )) } + #[cfg(feature = "alloc")] #[inline] fn into_c_str<'b>(self) -> io::Result> where @@ -784,11 +849,13 @@ impl Arg for &[u8] { str::from_utf8(self).map_err(|_utf8_err| io::Errno::INVAL) } + #[cfg(feature = "alloc")] #[inline] fn to_string_lossy(&self) -> Cow<'_, str> { String::from_utf8_lossy(self) } + #[cfg(feature = "alloc")] #[inline] fn as_cow_c_str(&self) -> io::Result> { Ok(Cow::Owned( @@ -796,6 +863,7 @@ impl Arg for &[u8] { )) } + #[cfg(feature = "alloc")] #[inline] fn into_c_str<'b>(self) -> io::Result> where @@ -816,17 +884,20 @@ impl Arg for &[u8] { } } +#[cfg(feature = "alloc")] impl Arg for &Vec { #[inline] fn as_str(&self) -> io::Result<&str> { str::from_utf8(self).map_err(|_utf8_err| io::Errno::INVAL) } + #[cfg(feature = "alloc")] #[inline] fn to_string_lossy(&self) -> Cow<'_, str> { String::from_utf8_lossy(self) } + #[cfg(feature = "alloc")] #[inline] fn as_cow_c_str(&self) -> io::Result> { Ok(Cow::Owned( @@ -834,6 +905,7 @@ impl Arg for &Vec { )) } + #[cfg(feature = "alloc")] #[inline] fn into_c_str<'b>(self) -> io::Result> where @@ -854,17 +926,20 @@ impl Arg for &Vec { } } +#[cfg(feature = "alloc")] impl Arg for Vec { #[inline] fn as_str(&self) -> io::Result<&str> { str::from_utf8(self).map_err(|_utf8_err| io::Errno::INVAL) } + #[cfg(feature = "alloc")] #[inline] fn to_string_lossy(&self) -> Cow<'_, str> { String::from_utf8_lossy(self) } + #[cfg(feature = "alloc")] #[inline] fn as_cow_c_str(&self) -> io::Result> { Ok(Cow::Owned( @@ -872,6 +947,7 @@ impl Arg for Vec { )) } + #[cfg(feature = "alloc")] #[inline] fn into_c_str<'b>(self) -> io::Result> where @@ -899,16 +975,19 @@ impl Arg for DecInt { Ok(self.as_str()) } + #[cfg(feature = "alloc")] #[inline] fn to_string_lossy(&self) -> Cow<'_, str> { Cow::Borrowed(self.as_str()) } + #[cfg(feature = "alloc")] #[inline] fn as_cow_c_str(&self) -> io::Result> { Ok(Cow::Borrowed(self.as_c_str())) } + #[cfg(feature = "alloc")] #[inline] fn into_c_str<'b>(self) -> io::Result> where @@ -961,19 +1040,58 @@ where } // SAFETY: we just wrote the bytes above and they will remain valid for the - // duration of f b/c buf doesn't get dropped until the end of the function. + // duration of `f` b/c buf doesn't get dropped until the end of the + // function. match CStr::from_bytes_with_nul(unsafe { slice::from_raw_parts(buf_ptr, bytes.len() + 1) }) { Ok(s) => f(s), Err(_) => Err(io::Errno::INVAL), } } -/// The slow path which handles any length. In theory OS's only support up -/// to `PATH_MAX`, but we let the OS enforce that. +/// The slow path which handles any length. In theory OS's only support up to +/// `PATH_MAX`, but we let the OS enforce that. +#[allow(unsafe_code, clippy::int_plus_one)] #[cold] fn with_c_str_slow_path(bytes: &[u8], f: F) -> io::Result where F: FnOnce(&CStr) -> io::Result, { - f(&CString::new(bytes).map_err(|_cstr_err| io::Errno::INVAL)?) + #[cfg(feature = "alloc")] + { + f(&CString::new(bytes).map_err(|_cstr_err| io::Errno::INVAL)?) + } + + #[cfg(not(feature = "alloc"))] + { + #[cfg(libc)] + const LARGE_PATH_BUFFER_SIZE: usize = libc::PATH_MAX as usize; + #[cfg(linux_raw)] + const LARGE_PATH_BUFFER_SIZE: usize = linux_raw_sys::general::PATH_MAX as usize; + + // Taken from + // + let mut buf = MaybeUninit::<[u8; LARGE_PATH_BUFFER_SIZE]>::uninit(); + let buf_ptr = buf.as_mut_ptr().cast::(); + + // This helps test our safety condition below. + if bytes.len() + 1 > LARGE_PATH_BUFFER_SIZE { + return Err(io::Errno::NAMETOOLONG); + } + + // SAFETY: `bytes.len() < LARGE_PATH_BUFFER_SIZE` which means we have space + // for `bytes.len() + 1` u8s: + unsafe { + ptr::copy_nonoverlapping(bytes.as_ptr(), buf_ptr, bytes.len()); + buf_ptr.add(bytes.len()).write(0); + } + + // SAFETY: we just wrote the bytes above and they will remain valid for the + // duration of `f` b/c buf doesn't get dropped until the end of the + // function. + match CStr::from_bytes_with_nul(unsafe { slice::from_raw_parts(buf_ptr, bytes.len() + 1) }) + { + Ok(s) => f(s), + Err(_) => Err(io::Errno::INVAL), + } + } } diff --git a/vendor/rustix/src/pid.rs b/vendor/rustix/src/pid.rs index 1b1da6521..3911e4c7a 100644 --- a/vendor/rustix/src/pid.rs +++ b/vendor/rustix/src/pid.rs @@ -1,3 +1,5 @@ +//! The `Pid` type. + #![allow(unsafe_code)] use crate::backend::c; @@ -17,21 +19,21 @@ pub struct Pid(NonZeroI32); impl Pid { /// A `Pid` corresponding to the init process (pid 1). - pub const INIT: Self = Self( - // SAFETY: One is non-zero. - unsafe { NonZeroI32::new_unchecked(1) }, - ); + pub const INIT: Self = Self(match NonZeroI32::new(1) { + Some(n) => n, + None => panic!("unreachable"), + }); /// Converts a `RawPid` into a `Pid`. /// /// Returns `Some` for strictly positive `RawPid`s. Otherwise, returns /// `None`. /// - /// This is always safe because a `Pid` is a number without any guarantees - /// for the kernel. Non-child `Pid`s are always racy for any syscalls, - /// but can only cause logic errors. If you want race-free access or - /// control to non-child processes, please consider other mechanisms - /// like [pidfd] on Linux. + /// This is safe because a `Pid` is a number without any guarantees for the + /// kernel. Non-child `Pid`s are always racy for any syscalls, but can only + /// cause logic errors. If you want race-free access to or control of + /// non-child processes, please consider other mechanisms like [pidfd] on + /// Linux. /// /// [pidfd]: https://man7.org/linux/man-pages/man2/pidfd_open.2.html #[inline] diff --git a/vendor/rustix/src/pipe.rs b/vendor/rustix/src/pipe.rs index 1817401c2..2a45b7a9d 100644 --- a/vendor/rustix/src/pipe.rs +++ b/vendor/rustix/src/pipe.rs @@ -106,20 +106,20 @@ pub fn pipe_with(flags: PipeFlags) -> io::Result<(OwnedFd, OwnedFd)> { backend::pipe::syscalls::pipe_with(flags) } -/// `splice(fd_in, off_in, fd_out, off_out, len, flags)`—Transfer data between -/// a file and a pipe. +/// `splice(fd_in, off_in, fd_out, off_out, len, flags)`—Transfer data +/// between a file and a pipe. /// /// This function transfers up to `len` bytes of data from the file descriptor /// `fd_in` to the file descriptor `fd_out`, where one of the file descriptors /// must refer to a pipe. /// /// `off_*` must be `None` if the corresponding fd refers to a pipe. -/// Otherwise its value points to the starting offset to the file, -/// from which the data is read/written. -/// on success the number of bytes read/written is added to the offset. +/// Otherwise its value points to the starting offset to the file, from which +/// the data is read/written. On success, the number of bytes read/written is +/// added to the offset. /// -/// passing `None` causes the read/write to start from the file offset, -/// and the file offset is adjusted appropriately. +/// Passing `None` causes the read/write to start from the file offset, and the +/// file offset is adjusted appropriately. /// /// # References /// - [Linux] @@ -165,7 +165,7 @@ pub fn splice( #[inline] pub unsafe fn vmsplice( fd: PipeFd, - bufs: &[IoSliceRaw], + bufs: &[IoSliceRaw<'_>], flags: SpliceFlags, ) -> io::Result { backend::pipe::syscalls::vmsplice(fd.as_fd(), bufs, flags) @@ -192,7 +192,7 @@ pub fn tee( backend::pipe::syscalls::tee(fd_in.as_fd(), fd_out.as_fd(), len, flags) } -/// `ioctl(fd, F_GETPIPE_SZ)`—Return the buffer capacity of a pipe. +/// `fnctl(fd, F_GETPIPE_SZ)`—Return the buffer capacity of a pipe. /// /// # References /// - [Linux] @@ -204,7 +204,7 @@ pub fn fcntl_getpipe_size(fd: Fd) -> io::Result { backend::pipe::syscalls::fcntl_getpipe_sz(fd.as_fd()) } -/// `ioctl(fd, F_SETPIPE_SZ)`—Set the buffer capacity of a pipe. +/// `fnctl(fd, F_SETPIPE_SZ)`—Set the buffer capacity of a pipe. /// /// # References /// - [Linux] diff --git a/vendor/rustix/src/prctl.rs b/vendor/rustix/src/prctl.rs index 49cb062d6..6aedf3018 100644 --- a/vendor/rustix/src/prctl.rs +++ b/vendor/rustix/src/prctl.rs @@ -25,6 +25,9 @@ bitflags! { const DATA_AUTHENTICATION_KEY_B = linux_raw_sys::prctl::PR_PAC_APDBKEY; /// `PR_PAC_APGAKEY`—Generic authentication `A` key. const GENERIC_AUTHENTICATION_KEY_A = linux_raw_sys::prctl::PR_PAC_APGAKEY; + + /// + const _ = !0; } } diff --git a/vendor/rustix/src/process/chdir.rs b/vendor/rustix/src/process/chdir.rs index 0da0b5c2e..b110afef8 100644 --- a/vendor/rustix/src/process/chdir.rs +++ b/vendor/rustix/src/process/chdir.rs @@ -1,11 +1,13 @@ #[cfg(not(target_os = "fuchsia"))] use crate::backend::fd::AsFd; +#[cfg(feature = "fs")] +use crate::path; #[cfg(any(feature = "fs", not(target_os = "fuchsia")))] use crate::{backend, io}; -#[cfg(feature = "fs")] +#[cfg(all(feature = "alloc", feature = "fs"))] use { crate::ffi::{CStr, CString}, - crate::path::{self, SMALL_PATH_BUFFER_SIZE}, + crate::path::SMALL_PATH_BUFFER_SIZE, alloc::vec::Vec, }; @@ -48,7 +50,7 @@ pub fn fchdir(fd: Fd) -> io::Result<()> { /// /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getcwd.html /// [Linux]: https://man7.org/linux/man-pages/man3/getcwd.3.html -#[cfg(feature = "fs")] +#[cfg(all(feature = "alloc", feature = "fs"))] #[cfg(not(target_os = "wasi"))] #[cfg_attr(doc_cfg, doc(cfg(feature = "fs")))] #[inline] @@ -56,7 +58,7 @@ pub fn getcwd>>(reuse: B) -> io::Result { _getcwd(reuse.into()) } -#[cfg(feature = "fs")] +#[cfg(all(feature = "alloc", feature = "fs"))] #[allow(unsafe_code)] fn _getcwd(mut buffer: Vec) -> io::Result { buffer.clear(); diff --git a/vendor/rustix/src/process/exit.rs b/vendor/rustix/src/process/exit.rs index 5533dbabb..95b78c4a1 100644 --- a/vendor/rustix/src/process/exit.rs +++ b/vendor/rustix/src/process/exit.rs @@ -10,7 +10,7 @@ use crate::backend; /// /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/stdlib.h.html /// [Linux]: https://man7.org/linux/man-pages/man3/exit.3.html -pub const EXIT_SUCCESS: i32 = backend::process::types::EXIT_SUCCESS; +pub const EXIT_SUCCESS: i32 = backend::c::EXIT_SUCCESS; /// `EXIT_FAILURE` for use with [`exit`]. /// @@ -22,7 +22,7 @@ pub const EXIT_SUCCESS: i32 = backend::process::types::EXIT_SUCCESS; /// /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/stdlib.h.html /// [Linux]: https://man7.org/linux/man-pages/man3/exit.3.html -pub const EXIT_FAILURE: i32 = backend::process::types::EXIT_FAILURE; +pub const EXIT_FAILURE: i32 = backend::c::EXIT_FAILURE; /// The exit status used by a process terminated with a [`Signal::Abort`] /// signal. @@ -33,4 +33,4 @@ pub const EXIT_FAILURE: i32 = backend::process::types::EXIT_FAILURE; /// [Linux]: https://tldp.org/LDP/abs/html/exitcodes.html /// [`Signal::Abort`]: crate::process::Signal::Abort #[cfg(not(any(target_os = "espidf", target_os = "wasi")))] -pub const EXIT_SIGNALED_SIGABRT: i32 = backend::process::types::EXIT_SIGNALED_SIGABRT; +pub const EXIT_SIGNALED_SIGABRT: i32 = backend::c::EXIT_SIGNALED_SIGABRT; diff --git a/vendor/rustix/src/process/id.rs b/vendor/rustix/src/process/id.rs index 4cacf1ab0..4ed33a6c8 100644 --- a/vendor/rustix/src/process/id.rs +++ b/vendor/rustix/src/process/id.rs @@ -8,6 +8,7 @@ #![allow(unsafe_code)] use crate::{backend, io}; +#[cfg(feature = "alloc")] use alloc::vec::Vec; #[cfg(linux_kernel)] use backend::process::types::RawCpuid; @@ -208,12 +209,11 @@ pub fn setsid() -> io::Result { /// /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getgroups.html /// [Linux]: https://man7.org/linux/man-pages/man2/getgroups.2.html +#[cfg(feature = "alloc")] pub fn getgroups() -> io::Result> { - let mut buffer = Vec::new(); - // This code would benefit from having a better way to read into // uninitialized memory, but that requires `unsafe`. - buffer.reserve(8); + let mut buffer = Vec::with_capacity(8); buffer.resize(buffer.capacity(), Gid::ROOT); loop { diff --git a/vendor/rustix/src/process/ioctl.rs b/vendor/rustix/src/process/ioctl.rs index cde6b5b3c..3c9d90255 100644 --- a/vendor/rustix/src/process/ioctl.rs +++ b/vendor/rustix/src/process/ioctl.rs @@ -1,4 +1,13 @@ -use crate::{backend, io}; +//! Process-oriented `ioctl`s. +//! +//! # Safety +//! +//! This module invokes `ioctl`s. + +#![allow(unsafe_code)] + +use crate::{backend, io, ioctl}; +use backend::c; use backend::fd::AsFd; /// `ioctl(fd, TIOCSCTTY, 0)`—Sets the controlling terminal for the processs. @@ -17,5 +26,27 @@ use backend::fd::AsFd; #[inline] #[doc(alias = "TIOCSCTTY")] pub fn ioctl_tiocsctty(fd: Fd) -> io::Result<()> { - backend::process::syscalls::ioctl_tiocsctty(fd.as_fd()) + unsafe { ioctl::ioctl(fd, Tiocsctty) } +} + +#[cfg(not(any(windows, target_os = "aix", target_os = "redox", target_os = "wasi")))] +struct Tiocsctty; + +#[cfg(not(any(windows, target_os = "aix", target_os = "redox", target_os = "wasi")))] +unsafe impl ioctl::Ioctl for Tiocsctty { + type Output = (); + + const IS_MUTATING: bool = false; + const OPCODE: ioctl::Opcode = ioctl::Opcode::old(c::TIOCSCTTY as ioctl::RawOpcode); + + fn as_ptr(&mut self) -> *mut c::c_void { + (&0u32) as *const u32 as *mut c::c_void + } + + unsafe fn output_from_ptr( + _: ioctl::IoctlOutput, + _: *mut c::c_void, + ) -> io::Result { + Ok(()) + } } diff --git a/vendor/rustix/src/process/membarrier.rs b/vendor/rustix/src/process/membarrier.rs index df9f1a44c..9c42bbd85 100644 --- a/vendor/rustix/src/process/membarrier.rs +++ b/vendor/rustix/src/process/membarrier.rs @@ -14,26 +14,29 @@ bitflags::bitflags! { #[repr(transparent)] #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] pub struct MembarrierQuery: u32 { - /// `MEMBARRIER_CMD_GLOBAL` (also known as `MEMBARRIER_CMD_SHARED`) - #[doc(alias = "SHARED")] - #[doc(alias = "MEMBARRIER_CMD_SHARED")] - const GLOBAL = MembarrierCommand::Global as _; - /// `MEMBARRIER_CMD_GLOBAL_EXPEDITED` - const GLOBAL_EXPEDITED = MembarrierCommand::GlobalExpedited as _; - /// `MEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED` - const REGISTER_GLOBAL_EXPEDITED = MembarrierCommand::RegisterGlobalExpedited as _; - /// `MEMBARRIER_CMD_PRIVATE_EXPEDITED` - const PRIVATE_EXPEDITED = MembarrierCommand::PrivateExpedited as _; - /// `MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED` - const REGISTER_PRIVATE_EXPEDITED = MembarrierCommand::RegisterPrivateExpedited as _; - /// `MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE` - const PRIVATE_EXPEDITED_SYNC_CORE = MembarrierCommand::PrivateExpeditedSyncCore as _; - /// `MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_SYNC_CORE` - const REGISTER_PRIVATE_EXPEDITED_SYNC_CORE = MembarrierCommand::RegisterPrivateExpeditedSyncCore as _; - /// `MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ` (since Linux 5.10) - const PRIVATE_EXPEDITED_RSEQ = MembarrierCommand::PrivateExpeditedRseq as _; - /// `MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_RSEQ` (since Linux 5.10) - const REGISTER_PRIVATE_EXPEDITED_RSEQ = MembarrierCommand::RegisterPrivateExpeditedRseq as _; + /// `MEMBARRIER_CMD_GLOBAL` (also known as `MEMBARRIER_CMD_SHARED`) + #[doc(alias = "SHARED")] + #[doc(alias = "MEMBARRIER_CMD_SHARED")] + const GLOBAL = MembarrierCommand::Global as _; + /// `MEMBARRIER_CMD_GLOBAL_EXPEDITED` + const GLOBAL_EXPEDITED = MembarrierCommand::GlobalExpedited as _; + /// `MEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED` + const REGISTER_GLOBAL_EXPEDITED = MembarrierCommand::RegisterGlobalExpedited as _; + /// `MEMBARRIER_CMD_PRIVATE_EXPEDITED` + const PRIVATE_EXPEDITED = MembarrierCommand::PrivateExpedited as _; + /// `MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED` + const REGISTER_PRIVATE_EXPEDITED = MembarrierCommand::RegisterPrivateExpedited as _; + /// `MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE` + const PRIVATE_EXPEDITED_SYNC_CORE = MembarrierCommand::PrivateExpeditedSyncCore as _; + /// `MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_SYNC_CORE` + const REGISTER_PRIVATE_EXPEDITED_SYNC_CORE = MembarrierCommand::RegisterPrivateExpeditedSyncCore as _; + /// `MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ` (since Linux 5.10) + const PRIVATE_EXPEDITED_RSEQ = MembarrierCommand::PrivateExpeditedRseq as _; + /// `MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_RSEQ` (since Linux 5.10) + const REGISTER_PRIVATE_EXPEDITED_RSEQ = MembarrierCommand::RegisterPrivateExpeditedRseq as _; + + /// + const _ = !0; } } @@ -51,9 +54,9 @@ impl MembarrierQuery { /// `membarrier(MEMBARRIER_CMD_QUERY, 0, 0)`—Query the supported `membarrier` /// commands. /// -/// This function doesn't return a `Result` because it always succeeds; if -/// the underlying OS doesn't support the `membarrier` syscall, it returns -/// an empty `MembarrierQuery` value. +/// This function doesn't return a `Result` because it always succeeds; if the +/// underlying OS doesn't support the `membarrier` syscall, it returns an empty +/// `MembarrierQuery` value. /// /// # References /// - [Linux] diff --git a/vendor/rustix/src/process/mod.rs b/vendor/rustix/src/process/mod.rs index 9c62f127e..55eed1ac8 100644 --- a/vendor/rustix/src/process/mod.rs +++ b/vendor/rustix/src/process/mod.rs @@ -7,7 +7,7 @@ mod chroot; mod exit; #[cfg(not(target_os = "wasi"))] // WASI doesn't have get[gpu]id. mod id; -#[cfg(not(target_os = "espidf"))] +#[cfg(not(any(target_os = "aix", target_os = "espidf")))] mod ioctl; #[cfg(not(any(target_os = "espidf", target_os = "wasi")))] mod kill; @@ -45,7 +45,7 @@ pub use chroot::*; pub use exit::*; #[cfg(not(target_os = "wasi"))] pub use id::*; -#[cfg(not(target_os = "espidf"))] +#[cfg(not(any(target_os = "aix", target_os = "espidf")))] pub use ioctl::*; #[cfg(not(any(target_os = "espidf", target_os = "wasi")))] pub use kill::*; diff --git a/vendor/rustix/src/process/pidfd.rs b/vendor/rustix/src/process/pidfd.rs index fb8298117..0548055fc 100644 --- a/vendor/rustix/src/process/pidfd.rs +++ b/vendor/rustix/src/process/pidfd.rs @@ -11,11 +11,14 @@ bitflags::bitflags! { pub struct PidfdFlags: backend::c::c_uint { /// `PIDFD_NONBLOCK`. const NONBLOCK = backend::c::PIDFD_NONBLOCK; + + /// + const _ = !0; } } -/// `syscall(SYS_pidfd_open, pid, flags)`—Creates a file descriptor for -/// a process. +/// `syscall(SYS_pidfd_open, pid, flags)`—Creates a file descriptor for a +/// process. /// /// # References /// - [Linux] diff --git a/vendor/rustix/src/process/pidfd_getfd.rs b/vendor/rustix/src/process/pidfd_getfd.rs index 7234810c2..27d4f1986 100644 --- a/vendor/rustix/src/process/pidfd_getfd.rs +++ b/vendor/rustix/src/process/pidfd_getfd.rs @@ -1,3 +1,5 @@ +//! The [`pidfd_getfd`] function and supporting types. + #![allow(unsafe_code)] use crate::fd::OwnedFd; use crate::{backend, io}; @@ -15,11 +17,14 @@ bitflags::bitflags! { /// All flags are reserved for future use. #[repr(transparent)] #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct PidfdGetfdFlags: backend::c::c_uint {} + pub struct PidfdGetfdFlags: backend::c::c_uint { + /// + const _ = !0; + } } /// `syscall(SYS_pidfd_getfd, pidfd, flags)`—Obtain a duplicate of another -/// process's file descriptor. +/// process' file descriptor. /// /// # References /// - [Linux] diff --git a/vendor/rustix/src/process/prctl.rs b/vendor/rustix/src/process/prctl.rs index d79657e98..59be7020f 100644 --- a/vendor/rustix/src/process/prctl.rs +++ b/vendor/rustix/src/process/prctl.rs @@ -96,7 +96,7 @@ impl TryFrom for DumpableBehavior { } } -/// Get the current state of the calling process's `dumpable` attribute. +/// Get the current state of the calling process' `dumpable` attribute. /// /// # References /// - [`prctl(PR_GET_DUMPABLE,...)`] @@ -148,6 +148,9 @@ bitflags! { /// Generate a [`Signal::Bus`] signal on unaligned user access. #[doc(alias = "PR_UNALIGN_SIGBUS")] const SIGBUS = 2; + + /// + const _ = !0; } } @@ -670,7 +673,7 @@ pub unsafe fn set_virtual_memory_map_address( #[inline] #[doc(alias = "PR_SET_MM")] #[doc(alias = "PR_SET_MM_EXE_FILE")] -pub fn set_executable_file(fd: BorrowedFd) -> io::Result<()> { +pub fn set_executable_file(fd: BorrowedFd<'_>) -> io::Result<()> { let fd = usize::try_from(fd.as_raw_fd()).map_err(|_r| io::Errno::RANGE)?; unsafe { prctl_3args(PR_SET_MM, PR_SET_MM_EXE_FILE as *mut _, fd as *mut _) }.map(|_r| ()) } diff --git a/vendor/rustix/src/process/procctl.rs b/vendor/rustix/src/process/procctl.rs index 8da53d383..5225f16f7 100644 --- a/vendor/rustix/src/process/procctl.rs +++ b/vendor/rustix/src/process/procctl.rs @@ -229,6 +229,9 @@ bitflags! { const OWNED = 1; /// The process is the root of the reaper tree (pid 1). const REALINIT = 2; + + /// + const _ = !0; } } diff --git a/vendor/rustix/src/process/wait.rs b/vendor/rustix/src/process/wait.rs index 72b37d6d4..b43bd03d6 100644 --- a/vendor/rustix/src/process/wait.rs +++ b/vendor/rustix/src/process/wait.rs @@ -22,6 +22,9 @@ bitflags! { /// Return if a stopped child has been resumed by delivery of /// [`Signal::Cont`]. const CONTINUED = bitcast!(backend::process::wait::WCONTINUED); + + /// + const _ = !0; } } @@ -42,6 +45,9 @@ bitflags! { const NOWAIT = bitcast!(backend::process::wait::WNOWAIT); /// Wait for processes that have been stopped. const STOPPED = bitcast!(backend::process::wait::WSTOPPED); + + /// + const _ = !0; } } @@ -170,7 +176,7 @@ impl WaitidStatus { /// Returns the number of the signal that stopped the process, /// if the process was stopped by a signal. #[inline] - #[cfg(not(any(target_os = "netbsd", target_os = "fuchsia", target_os = "emscripten")))] + #[cfg(not(any(target_os = "emscripten", target_os = "fuchsia", target_os = "netbsd")))] pub fn stopping_signal(&self) -> Option { if self.stopped() { Some(self.si_status() as _) @@ -182,7 +188,7 @@ impl WaitidStatus { /// Returns the number of the signal that trapped the process, /// if the process was trapped by a signal. #[inline] - #[cfg(not(any(target_os = "netbsd", target_os = "fuchsia", target_os = "emscripten")))] + #[cfg(not(any(target_os = "emscripten", target_os = "fuchsia", target_os = "netbsd")))] pub fn trapping_signal(&self) -> Option { if self.trapped() { Some(self.si_status() as _) @@ -194,7 +200,7 @@ impl WaitidStatus { /// Returns the exit status number returned by the process, /// if it exited normally. #[inline] - #[cfg(not(any(target_os = "netbsd", target_os = "fuchsia", target_os = "emscripten")))] + #[cfg(not(any(target_os = "emscripten", target_os = "fuchsia", target_os = "netbsd")))] pub fn exit_status(&self) -> Option { if self.exited() { Some(self.si_status() as _) @@ -206,7 +212,7 @@ impl WaitidStatus { /// Returns the number of the signal that terminated the process, /// if the process was terminated by a signal. #[inline] - #[cfg(not(any(target_os = "netbsd", target_os = "fuchsia", target_os = "emscripten")))] + #[cfg(not(any(target_os = "emscripten", target_os = "fuchsia", target_os = "netbsd")))] pub fn terminating_signal(&self) -> Option { if self.killed() || self.dumped() { Some(self.si_status() as _) @@ -231,7 +237,7 @@ impl WaitidStatus { self.0.si_code } - #[cfg(not(any(target_os = "netbsd", target_os = "fuchsia", target_os = "emscripten")))] + #[cfg(not(any(target_os = "emscripten", target_os = "fuchsia", target_os = "netbsd")))] #[allow(unsafe_code)] fn si_status(&self) -> backend::c::c_int { // SAFETY: POSIX [specifies] that the `siginfo_t` returned by a diff --git a/vendor/rustix/src/procfs.rs b/vendor/rustix/src/procfs.rs index 010b93126..14ad631a7 100644 --- a/vendor/rustix/src/procfs.rs +++ b/vendor/rustix/src/procfs.rs @@ -20,9 +20,8 @@ use crate::backend::pid::syscalls::getpid; use crate::fd::{AsFd, BorrowedFd, OwnedFd}; -use crate::ffi::CStr; use crate::fs::{ - fstat, fstatfs, major, openat, renameat, Dir, FileType, Mode, OFlags, Stat, CWD, + fstat, fstatfs, major, openat, renameat, FileType, FsWord, Mode, OFlags, Stat, CWD, PROC_SUPER_MAGIC, }; use crate::io; @@ -31,6 +30,8 @@ use crate::path::DecInt; use core::lazy::OnceCell; #[cfg(not(feature = "rustc-dep-of-std"))] use once_cell::sync::OnceCell; +#[cfg(feature = "alloc")] +use {crate::ffi::CStr, crate::fs::Dir}; /// Linux's procfs always uses inode 1 for its root directory. const PROC_ROOT_INO: u64 = 1; @@ -41,6 +42,7 @@ enum Kind { Proc, Pid, Fd, + #[cfg(feature = "alloc")] File, } @@ -67,6 +69,7 @@ fn check_proc_entry_with_stat( match kind { Kind::Proc => check_proc_root(entry, &entry_stat)?, Kind::Pid | Kind::Fd => check_proc_subdir(entry, &entry_stat, proc_stat)?, + #[cfg(feature = "alloc")] Kind::File => check_proc_file(&entry_stat, proc_stat)?, } @@ -94,6 +97,7 @@ fn check_proc_entry_with_stat( return Err(io::Errno::NOTSUP); } } + #[cfg(feature = "alloc")] Kind::File => { // Check that files in procfs don't have extraneous hard links to // them (which might indicate hard links to other things). @@ -149,6 +153,7 @@ fn check_proc_subdir( Ok(()) } +#[cfg(feature = "alloc")] fn check_proc_file(stat: &Stat, proc_stat: Option<&Stat>) -> io::Result<()> { // Check that we have a regular file. if FileType::from_raw_mode(stat.st_mode) != FileType::RegularFile { @@ -178,7 +183,7 @@ fn check_proc_nonroot(stat: &Stat, proc_stat: Option<&Stat>) -> io::Result<()> { fn check_procfs(file: BorrowedFd<'_>) -> io::Result<()> { let statfs = fstatfs(file)?; let f_type = statfs.f_type; - if f_type != PROC_SUPER_MAGIC.into() { + if f_type != FsWord::from(PROC_SUPER_MAGIC) { return Err(io::Errno::NOTSUP); } @@ -309,6 +314,7 @@ fn new_static_fd(fd: OwnedFd, stat: Stat) -> (OwnedFd, Stat) { /// - [Linux] /// /// [Linux]: https://man7.org/linux/man-pages/man5/proc.5.html +#[cfg(feature = "alloc")] fn proc_self_fdinfo() -> io::Result<(BorrowedFd<'static>, &'static Stat)> { static PROC_SELF_FDINFO: StaticFd = StaticFd::new(); @@ -338,12 +344,14 @@ fn proc_self_fdinfo() -> io::Result<(BorrowedFd<'static>, &'static Stat)> { /// - [Linux] /// /// [Linux]: https://man7.org/linux/man-pages/man5/proc.5.html +#[cfg(feature = "alloc")] #[inline] #[cfg_attr(doc_cfg, doc(cfg(feature = "procfs")))] pub fn proc_self_fdinfo_fd(fd: Fd) -> io::Result { _proc_self_fdinfo(fd.as_fd()) } +#[cfg(feature = "alloc")] fn _proc_self_fdinfo(fd: BorrowedFd<'_>) -> io::Result { let (proc_self_fdinfo, proc_self_fdinfo_stat) = proc_self_fdinfo()?; let fd_str = DecInt::from_fd(fd); @@ -361,6 +369,7 @@ fn _proc_self_fdinfo(fd: BorrowedFd<'_>) -> io::Result { /// /// [Linux]: https://man7.org/linux/man-pages/man5/proc.5.html /// [Linux pagemap]: https://www.kernel.org/doc/Documentation/vm/pagemap.txt +#[cfg(feature = "alloc")] #[inline] #[cfg_attr(doc_cfg, doc(cfg(feature = "procfs")))] pub fn proc_self_pagemap() -> io::Result { @@ -376,6 +385,7 @@ pub fn proc_self_pagemap() -> io::Result { /// - [Linux] /// /// [Linux]: https://man7.org/linux/man-pages/man5/proc.5.html +#[cfg(feature = "alloc")] #[inline] #[cfg_attr(doc_cfg, doc(cfg(feature = "procfs")))] pub fn proc_self_maps() -> io::Result { @@ -391,6 +401,7 @@ pub fn proc_self_maps() -> io::Result { /// - [Linux] /// /// [Linux]: https://man7.org/linux/man-pages/man5/proc.5.html +#[cfg(feature = "alloc")] #[inline] #[cfg_attr(doc_cfg, doc(cfg(feature = "procfs")))] pub fn proc_self_status() -> io::Result { @@ -398,13 +409,15 @@ pub fn proc_self_status() -> io::Result { } /// Open a file under `/proc/self`. +#[cfg(feature = "alloc")] fn proc_self_file(name: &CStr) -> io::Result { let (proc_self, proc_self_stat) = proc_self()?; open_and_check_file(proc_self, proc_self_stat, name) } /// Open a procfs file within in `dir` and check it for bind mounts. -fn open_and_check_file(dir: BorrowedFd, dir_stat: &Stat, name: &CStr) -> io::Result { +#[cfg(feature = "alloc")] +fn open_and_check_file(dir: BorrowedFd<'_>, dir_stat: &Stat, name: &CStr) -> io::Result { let (_, proc_stat) = proc()?; // Don't use `NOATIME`, because it [requires us to own the file], and when @@ -418,10 +431,10 @@ fn open_and_check_file(dir: BorrowedFd, dir_stat: &Stat, name: &CStr) -> io::Res let file_stat = fstat(&file)?; // `is_mountpoint` only works on directory mount points, not file mount - // points. To detect file mount points, scan the parent directory to see - // if we can find a regular file with an inode and name that matches the - // file we just opened. If we can't find it, there could be a file bind - // mount on top of the file we want. + // points. To detect file mount points, scan the parent directory to see if + // we can find a regular file with an inode and name that matches the file + // we just opened. If we can't find it, there could be a file bind mount on + // top of the file we want. // // As we scan, we also check for ".", to make sure it's the same directory // as our original directory, to detect mount points, since diff --git a/vendor/rustix/src/pty.rs b/vendor/rustix/src/pty.rs index 5040ca2c1..a63fbfeef 100644 --- a/vendor/rustix/src/pty.rs +++ b/vendor/rustix/src/pty.rs @@ -5,13 +5,21 @@ //! //! [rustix-openpty crate]: https://crates.io/crates/rustix-openpty +#![allow(unsafe_code)] + use crate::backend::c; use crate::fd::{AsFd, OwnedFd}; use crate::fs::OFlags; use crate::{backend, io}; -#[cfg(any(apple, linux_like, target_os = "freebsd", target_os = "fuchsia"))] +#[cfg(all( + feature = "alloc", + any(apple, linux_like, target_os = "freebsd", target_os = "fuchsia") +))] use {crate::ffi::CString, alloc::vec::Vec}; +#[cfg(target_os = "linux")] +use crate::{fd::FromRawFd, ioctl}; + bitflags::bitflags! { /// `O_*` flags for use with [`openpt`] and [`ioctl_tiocgptpeer`]. /// @@ -32,6 +40,9 @@ bitflags::bitflags! { /// rustix supports it on Linux, and FreeBSD and NetBSD support it. #[cfg(any(linux_kernel, target_os = "freebsd", target_os = "netbsd"))] const CLOEXEC = c::O_CLOEXEC as c::c_uint; + + /// + const _ = !0; } } @@ -102,9 +113,12 @@ pub fn openpt(flags: OpenptFlags) -> io::Result { /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/ptsname.html /// [Linux]: https://man7.org/linux/man-pages/man3/ptsname.3.html /// [glibc]: https://www.gnu.org/software/libc/manual/html_node/Allocation.html#index-ptsname +#[cfg(all( + feature = "alloc", + any(apple, linux_like, target_os = "freebsd", target_os = "fuchsia") +))] #[inline] #[doc(alias = "ptsname_r")] -#[cfg(any(apple, linux_like, target_os = "freebsd", target_os = "fuchsia"))] pub fn ptsname>>(fd: Fd, reuse: B) -> io::Result { backend::pty::syscalls::ptsname(fd.as_fd(), reuse.into()) } @@ -166,5 +180,27 @@ pub fn grantpt(fd: Fd) -> io::Result<()> { #[cfg(target_os = "linux")] #[inline] pub fn ioctl_tiocgptpeer(fd: Fd, flags: OpenptFlags) -> io::Result { - backend::pty::syscalls::ioctl_tiocgptpeer(fd.as_fd(), flags) + unsafe { ioctl::ioctl(fd, Tiocgptpeer(flags)) } +} + +#[cfg(target_os = "linux")] +struct Tiocgptpeer(OpenptFlags); + +#[cfg(target_os = "linux")] +unsafe impl ioctl::Ioctl for Tiocgptpeer { + type Output = OwnedFd; + + const IS_MUTATING: bool = false; + const OPCODE: ioctl::Opcode = ioctl::Opcode::old(c::TIOCGPTPEER as ioctl::RawOpcode); + + fn as_ptr(&mut self) -> *mut c::c_void { + self.0.bits() as *mut c::c_void + } + + unsafe fn output_from_ptr( + ret: ioctl::IoctlOutput, + _arg: *mut c::c_void, + ) -> io::Result { + Ok(OwnedFd::from_raw_fd(ret)) + } } diff --git a/vendor/rustix/src/rand/getrandom.rs b/vendor/rustix/src/rand/getrandom.rs index c66e50d56..3fed0dd08 100644 --- a/vendor/rustix/src/rand/getrandom.rs +++ b/vendor/rustix/src/rand/getrandom.rs @@ -1,6 +1,5 @@ use crate::{backend, io}; -/// `GRND_*` constants for use with [`getrandom`]. pub use backend::rand::types::GetRandomFlags; /// `getrandom(buf, flags)`—Reads a sequence of random bytes. diff --git a/vendor/rustix/src/runtime.rs b/vendor/rustix/src/runtime.rs index 9c850d5e3..2cb0eba54 100644 --- a/vendor/rustix/src/runtime.rs +++ b/vendor/rustix/src/runtime.rs @@ -1,9 +1,12 @@ -//! Low-level implementation details for libc-like runtime libraries such as -//! [origin]. +//! Experimental low-level implementation details for libc-like runtime +//! libraries such as [Origin]. //! //! Do not use the functions in this module unless you've read all of their -//! code, *and* you know all the relevant internal implementation details of -//! any libc in the process they'll be used. +//! code. They don't always behave the same way as functions with similar names +//! in `libc`. Sometimes information about the differences is included in the +//! Linux documentation under "C library/kernel differences" sections. And, if +//! there is a libc in the process, these functions may have surprising +//! interactions with it. //! //! These functions are for implementing thread-local storage (TLS), managing //! threads, loaded libraries, and other process-wide resources. Most of @@ -14,7 +17,7 @@ //! The API for these functions is not stable, and this module is //! `doc(hidden)`. //! -//! [origin]: https://github.com/sunfishcode/mustang/tree/main/origin +//! [Origin]: https://github.com/sunfishcode/origin#readme //! //! # Safety //! @@ -34,13 +37,14 @@ use crate::io; #[cfg(linux_raw)] use crate::pid::Pid; #[cfg(linux_raw)] -use crate::signal::Signal; -#[cfg(linux_raw)] #[cfg(feature = "fs")] use backend::fd::AsFd; #[cfg(linux_raw)] use core::ffi::c_void; +#[cfg(linux_raw)] +pub use crate::signal::Signal; + /// `sigaction` #[cfg(linux_raw)] pub type Sigaction = linux_raw_sys::general::kernel_sigaction; @@ -142,7 +146,7 @@ pub unsafe fn exit_thread(status: i32) -> ! { /// /// This is equivalent to `_exit` and `_Exit` in libc. /// -/// This does not all any `__cxa_atexit`, `atexit`, or any other destructors. +/// This does not call any `__cxa_atexit`, `atexit`, or any other destructors. /// Most programs should use [`std::process::exit`] instead of calling this /// directly. /// @@ -161,25 +165,70 @@ pub fn exit_group(status: i32) -> ! { backend::runtime::syscalls::exit_group(status) } +/// `EXIT_SUCCESS` for use with [`exit_group`]. +/// +/// # References +/// - [POSIX] +/// - [Linux] +/// +/// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/stdlib.h.html +/// [Linux]: https://man7.org/linux/man-pages/man3/exit.3.html +pub const EXIT_SUCCESS: i32 = backend::c::EXIT_SUCCESS; + +/// `EXIT_FAILURE` for use with [`exit_group`]. +/// +/// # References +/// - [POSIX] +/// - [Linux] +/// +/// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/stdlib.h.html +/// [Linux]: https://man7.org/linux/man-pages/man3/exit.3.html +pub const EXIT_FAILURE: i32 = backend::c::EXIT_FAILURE; + /// Return fields from the main executable segment headers ("phdrs") relevant /// to initializing TLS provided to the program at startup. +/// +/// `addr` will always be non-null, even when the TLS data is absent, ao that +/// the `addr` and `file_size` parameters are suitable for creating a slice +/// with `slice::from_raw_parts`. #[inline] pub fn startup_tls_info() -> StartupTlsInfo { backend::runtime::tls::startup_tls_info() } -/// `(getauxval(AT_PHDR), getauxval(AT_PHNUM))`—Returns the address and -/// number of ELF segment headers for the main executable. +/// `(getauxval(AT_PHDR), getauxval(AT_PHENT), getauxval(AT_PHNUM))`—Returns +/// the address, ELF segment header size, and number of ELF segment headers for +/// the main executable. /// /// # References /// - [Linux] /// /// [Linux]: https://man7.org/linux/man-pages/man3/getauxval.3.html #[inline] -pub fn exe_phdrs() -> (*const c_void, usize) { +pub fn exe_phdrs() -> (*const c_void, usize, usize) { backend::param::auxv::exe_phdrs() } +/// `getauxval(AT_ENTRY)`—Returns the address of the program entrypoint. +/// +/// Most code interested in the program entrypoint address should instead use a +/// symbol reference to `_start`. That will be properly PC-relative or +/// relocated if needed, and will come with appropriate pointer type and +/// pointer provenance. +/// +/// This function is intended only for use in code that implements those +/// relocations, to compute the ASLR offset. It has type `usize`, so it doesn't +/// carry any provenance, and it shouldn't be used to dereference memory. +/// +/// # References +/// - [Linux] +/// +/// [Linux]: https://man7.org/linux/man-pages/man3/getauxval.3.html +#[inline] +pub fn entry() -> usize { + backend::param::auxv::entry() +} + #[cfg(linux_raw)] pub use backend::runtime::tls::StartupTlsInfo; @@ -224,13 +273,19 @@ pub use backend::runtime::tls::StartupTlsInfo; /// that could cause undefined behavior. The extent to which this also /// applies to Rust functions is unclear at this time. /// +/// - And more. +/// /// # Safety /// /// The child must avoid accessing any memory shared with the parent in a /// way that invokes undefined behavior. It must avoid accessing any threading /// runtime functions in a way that invokes undefined behavior. And it must /// avoid invoking any undefined behavior through any function that is not -/// guaranteed to be async-signal-safe. +/// guaranteed to be async-signal-safe. But, what does async-signal-safe even +/// mean in a Rust program? This documentation does not have all the answers. +/// +/// So you're on your own. And on top of all the troubles with `fork` in +/// general, this wrapper implementation is highly experimental. /// /// # References /// - [POSIX] diff --git a/vendor/rustix/src/system.rs b/vendor/rustix/src/system.rs index 9346f5560..1f7f39ce4 100644 --- a/vendor/rustix/src/system.rs +++ b/vendor/rustix/src/system.rs @@ -102,25 +102,25 @@ impl fmt::Debug for Uname { { write!( fmt, - "{} {} {} {} {}", - self.sysname().to_string_lossy(), - self.nodename().to_string_lossy(), - self.release().to_string_lossy(), - self.version().to_string_lossy(), - self.machine().to_string_lossy(), + "{:?} {:?} {:?} {:?} {:?}", + self.sysname(), + self.nodename(), + self.release(), + self.version(), + self.machine(), ) } #[cfg(linux_kernel)] { write!( fmt, - "{} {} {} {} {} {}", - self.sysname().to_string_lossy(), - self.nodename().to_string_lossy(), - self.release().to_string_lossy(), - self.version().to_string_lossy(), - self.machine().to_string_lossy(), - self.domainname().to_string_lossy(), + "{:?} {:?} {:?} {:?} {:?} {:?}", + self.sysname(), + self.nodename(), + self.release(), + self.version(), + self.machine(), + self.domainname(), ) } } diff --git a/vendor/rustix/src/termios/ioctl.rs b/vendor/rustix/src/termios/ioctl.rs index 1c60cb9a4..620ae4c71 100644 --- a/vendor/rustix/src/termios/ioctl.rs +++ b/vendor/rustix/src/termios/ioctl.rs @@ -1,7 +1,10 @@ //! Terminal-related `ioctl` functions. +#![allow(unsafe_code)] + use crate::fd::AsFd; -use crate::{backend, io}; +use crate::{backend, io, ioctl}; +use backend::c; /// `ioctl(fd, TIOCEXCL)`—Enables exclusive mode on a terminal. /// @@ -19,7 +22,11 @@ use crate::{backend, io}; #[inline] #[doc(alias = "TIOCEXCL")] pub fn ioctl_tiocexcl(fd: Fd) -> io::Result<()> { - backend::termios::syscalls::ioctl_tiocexcl(fd.as_fd()) + // SAFETY: TIOCEXCL is a no-argument setter opcode. + unsafe { + let ctl = ioctl::NoArg::>::new(); + ioctl::ioctl(fd, ctl) + } } /// `ioctl(fd, TIOCNXCL)`—Disables exclusive mode on a terminal. @@ -38,5 +45,9 @@ pub fn ioctl_tiocexcl(fd: Fd) -> io::Result<()> { #[inline] #[doc(alias = "TIOCNXCL")] pub fn ioctl_tiocnxcl(fd: Fd) -> io::Result<()> { - backend::termios::syscalls::ioctl_tiocnxcl(fd.as_fd()) + // SAFETY: TIOCNXCL is a no-argument setter opcode. + unsafe { + let ctl = ioctl::NoArg::>::new(); + ioctl::ioctl(fd, ctl) + } } diff --git a/vendor/rustix/src/termios/tty.rs b/vendor/rustix/src/termios/tty.rs index 00787a568..56aab9fcf 100644 --- a/vendor/rustix/src/termios/tty.rs +++ b/vendor/rustix/src/termios/tty.rs @@ -2,7 +2,7 @@ use crate::backend; use backend::fd::AsFd; -#[cfg(feature = "procfs")] +#[cfg(all(feature = "alloc", feature = "procfs"))] #[cfg(not(any(target_os = "fuchsia", target_os = "wasi")))] use { crate::ffi::CString, crate::io, crate::path::SMALL_PATH_BUFFER_SIZE, alloc::vec::Vec, @@ -33,7 +33,7 @@ pub fn isatty(fd: Fd) -> bool { /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/ttyname.html /// [Linux]: https://man7.org/linux/man-pages/man3/ttyname.3.html #[cfg(not(any(target_os = "fuchsia", target_os = "wasi")))] -#[cfg(feature = "procfs")] +#[cfg(all(feature = "alloc", feature = "procfs"))] #[cfg_attr(doc_cfg, doc(cfg(feature = "procfs")))] #[doc(alias = "ttyname_r")] #[inline] @@ -42,7 +42,7 @@ pub fn ttyname>>(dirfd: Fd, reuse: B) -> io::Result, mut buffer: Vec) -> io::Result { buffer.clear(); @@ -54,9 +54,10 @@ fn _ttyname(dirfd: BorrowedFd<'_>, mut buffer: Vec) -> io::Result { buffer.reserve(buffer.capacity() + 1); // use `Vec` reallocation strategy to grow capacity exponentially } Ok(len) => { - // SAFETY: assume the backend returns the length of the string + // SAFETY: assume the backend returns the length of the string excluding the + // NUL. unsafe { - buffer.set_len(len); + buffer.set_len(len + 1); } // SAFETY: diff --git a/vendor/rustix/src/termios/types.rs b/vendor/rustix/src/termios/types.rs index 8b7d473cf..0c44ed2e8 100644 --- a/vendor/rustix/src/termios/types.rs +++ b/vendor/rustix/src/termios/types.rs @@ -292,6 +292,9 @@ bitflags! { target_os = "redox", )))] const IUTF8 = c::IUTF8; + + /// + const _ = !0; } } @@ -504,6 +507,9 @@ bitflags! { target_os = "redox", )))] const VT1 = c::VT1; + + /// + const _ = !0; } } @@ -564,6 +570,9 @@ bitflags! { target_os = "redox", )))] const CMSPAR = c::CMSPAR; + + /// + const _ = !0; } } @@ -627,6 +636,9 @@ bitflags! { /// `IEXTEN` const IEXTEN = c::IEXTEN; + + /// + const _ = !0; } } diff --git a/vendor/rustix/src/thread/futex.rs b/vendor/rustix/src/thread/futex.rs index 7c4399f7a..47947c8b5 100644 --- a/vendor/rustix/src/thread/futex.rs +++ b/vendor/rustix/src/thread/futex.rs @@ -9,7 +9,7 @@ use crate::thread::Timespec; use crate::{backend, io}; -pub use backend::thread::{FutexFlags, FutexOperation}; +pub use backend::thread::futex::{FutexFlags, FutexOperation}; /// `futex(uaddr, op, val, utime, uaddr2, val3)` /// diff --git a/vendor/rustix/src/thread/id.rs b/vendor/rustix/src/thread/id.rs index fa3bcfb8d..11193c9d1 100644 --- a/vendor/rustix/src/thread/id.rs +++ b/vendor/rustix/src/thread/id.rs @@ -1,7 +1,8 @@ -use crate::pid::Pid; -use crate::ugid::{Gid, Uid}; use crate::{backend, io}; +pub use crate::pid::{Pid, RawPid}; +pub use crate::ugid::{Gid, RawGid, RawUid, Uid}; + /// `gettid()`—Returns the thread ID. /// /// This returns the OS thread ID, which is not necessarily the same as the @@ -69,7 +70,7 @@ pub fn set_thread_res_uid(ruid: Uid, euid: Uid, suid: Uid) -> io::Result<()> { /// /// # Warning /// -/// This is not the setxid you are looking for... POSIX requires xids to be +/// This is not the setxid you are looking for… POSIX requires xids to be /// process granular, but on Linux they are per-thread. Thus, this call only /// changes the xid for the current *thread*, not the entire process even /// though that is in violation of the POSIX standard. @@ -94,7 +95,7 @@ pub fn set_thread_gid(gid: Gid) -> io::Result<()> { /// /// # Warning /// -/// This is not the setresxid you are looking for... POSIX requires xids to be +/// This is not the setresxid you are looking for… POSIX requires xids to be /// process granular, but on Linux they are per-thread. Thus, this call only /// changes the xid for the current *thread*, not the entire process even /// though that is in violation of the POSIX standard. diff --git a/vendor/rustix/src/thread/libcap.rs b/vendor/rustix/src/thread/libcap.rs index 8d2368720..19f81a904 100644 --- a/vendor/rustix/src/thread/libcap.rs +++ b/vendor/rustix/src/thread/libcap.rs @@ -102,6 +102,9 @@ bitflags! { const BPF = 1 << linux_raw_sys::general::CAP_BPF; /// `CAP_CHECKPOINT_RESTORE` const CHECKPOINT_RESTORE = 1 << linux_raw_sys::general::CAP_CHECKPOINT_RESTORE; + + /// + const _ = !0; } } diff --git a/vendor/rustix/src/thread/mod.rs b/vendor/rustix/src/thread/mod.rs index fa4897025..6f19635f0 100644 --- a/vendor/rustix/src/thread/mod.rs +++ b/vendor/rustix/src/thread/mod.rs @@ -2,7 +2,7 @@ #[cfg(not(target_os = "redox"))] mod clock; -#[cfg(linux_raw)] +#[cfg(linux_kernel)] mod futex; #[cfg(linux_kernel)] mod id; @@ -15,10 +15,13 @@ mod setns; #[cfg(not(target_os = "redox"))] pub use clock::*; -#[cfg(linux_raw)] +#[cfg(linux_kernel)] pub use futex::{futex, FutexFlags, FutexOperation}; #[cfg(linux_kernel)] -pub use id::{gettid, set_thread_gid, set_thread_res_gid, set_thread_res_uid, set_thread_uid}; +pub use id::{ + gettid, set_thread_gid, set_thread_res_gid, set_thread_res_uid, set_thread_uid, Gid, Pid, + RawGid, RawPid, RawUid, Uid, +}; #[cfg(linux_kernel)] pub use libcap::{capabilities, set_capabilities, CapabilityFlags, CapabilitySets}; #[cfg(linux_kernel)] diff --git a/vendor/rustix/src/thread/prctl.rs b/vendor/rustix/src/thread/prctl.rs index a9f411640..b2d40d65c 100644 --- a/vendor/rustix/src/thread/prctl.rs +++ b/vendor/rustix/src/thread/prctl.rs @@ -19,7 +19,9 @@ use bitflags::bitflags; use crate::backend::c::{c_int, c_uint, c_void}; use crate::backend::prctl::syscalls; -use crate::ffi::{CStr, CString}; +use crate::ffi::CStr; +#[cfg(feature = "alloc")] +use crate::ffi::CString; use crate::io; use crate::pid::Pid; use crate::prctl::{ @@ -61,6 +63,7 @@ pub fn set_keep_capabilities(enable: bool) -> io::Result<()> { // PR_GET_NAME/PR_SET_NAME // +#[cfg(feature = "alloc")] const PR_GET_NAME: c_int = 16; /// Get the name of the calling thread. @@ -70,6 +73,7 @@ const PR_GET_NAME: c_int = 16; /// /// [`prctl(PR_GET_NAME,...)`]: https://man7.org/linux/man-pages/man2/prctl.2.html #[inline] +#[cfg(feature = "alloc")] pub fn name() -> io::Result { let mut buffer = [0_u8; 16]; unsafe { prctl_2args(PR_GET_NAME, buffer.as_mut_ptr().cast())? }; @@ -134,8 +138,8 @@ impl TryFrom for SecureComputingMode { /// computing mode, then this call will cause a [`Signal::Kill`] signal to be /// sent to the process. If the caller is in filter mode, and this system call /// is allowed by the seccomp filters, it returns -/// [`SecureComputingMode::Filter`]; otherwise, the process is killed with -/// a [`Signal::Kill`] signal. +/// [`SecureComputingMode::Filter`]; otherwise, the process is killed with a +/// [`Signal::Kill`] signal. /// /// Since Linux 3.8, the Seccomp field of the `/proc/[pid]/status` file /// provides a method of obtaining the same information, without the risk that @@ -414,28 +418,33 @@ bitflags! { #[repr(transparent)] #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] pub struct CapabilitiesSecureBits: u32 { - /// If this bit is set, then the kernel does not grant capabilities when - /// a `set-user-ID-root` program is executed, or when a process with an effective or real - /// UID of 0 calls `execve`. + /// If this bit is set, then the kernel does not grant capabilities + /// when a `set-user-ID-root` program is executed, or when a process + /// with an effective or real UID of 0 calls `execve`. const NO_ROOT = 1_u32 << 0; /// Set [`NO_ROOT`] irreversibly. const NO_ROOT_LOCKED = 1_u32 << 1; - /// Setting this flag stops the kernel from adjusting the process's permitted, effective, - /// and ambient capability sets when the thread's effective and filesystem UIDs are switched - /// between zero and nonzero values. + /// Setting this flag stops the kernel from adjusting the process' + /// permitted, effective, and ambient capability sets when the thread's + /// effective and filesystem UIDs are switched between zero and nonzero + /// values. const NO_SETUID_FIXUP = 1_u32 << 2; /// Set [`NO_SETUID_FIXUP`] irreversibly. const NO_SETUID_FIXUP_LOCKED = 1_u32 << 3; - /// Setting this flag allows a thread that has one or more 0 UIDs to retain capabilities in - /// its permitted set when it switches all of its UIDs to nonzero values. + /// Setting this flag allows a thread that has one or more 0 UIDs to + /// retain capabilities in its permitted set when it switches all of + /// its UIDs to nonzero values. const KEEP_CAPS = 1_u32 << 4; /// Set [`KEEP_CAPS`] irreversibly. const KEEP_CAPS_LOCKED = 1_u32 << 5; - /// Setting this flag disallows raising ambient capabilities via the `prctl`'s - /// `PR_CAP_AMBIENT_RAISE` operation. + /// Setting this flag disallows raising ambient capabilities via the + /// `prctl`'s `PR_CAP_AMBIENT_RAISE` operation. const NO_CAP_AMBIENT_RAISE = 1_u32 << 6; /// Set [`NO_CAP_AMBIENT_RAISE`] irreversibly. const NO_CAP_AMBIENT_RAISE_LOCKED = 1_u32 << 7; + + /// + const _ = !0; } } @@ -743,6 +752,9 @@ bitflags! { const TCF_SYNC = 1_u32 << 1; /// Asynchronous tag check fault mode. const TCF_ASYNC = 1_u32 << 2; + + /// + const _ = !0; } } diff --git a/vendor/rustix/src/thread/setns.rs b/vendor/rustix/src/thread/setns.rs index 2dd522a14..4568912b2 100644 --- a/vendor/rustix/src/thread/setns.rs +++ b/vendor/rustix/src/thread/setns.rs @@ -30,6 +30,9 @@ bitflags! { const PROCESS_ID = CLONE_NEWPID; /// Network name space. const NETWORK = CLONE_NEWNET; + + /// + const _ = !0; } } @@ -82,6 +85,9 @@ bitflags! { const NEWUTS = CLONE_NEWUTS; /// `CLONE_SYSVSEM`. const SYSVSEM = CLONE_SYSVSEM; + + /// + const _ = !0; } } @@ -96,7 +102,7 @@ bitflags! { /// /// [Linux]: https://man7.org/linux/man-pages/man2/setns.2.html pub fn move_into_link_name_space( - fd: BorrowedFd, + fd: BorrowedFd<'_>, allowed_type: Option, ) -> io::Result<()> { let allowed_type = allowed_type.map_or(0, |t| t as c_int); @@ -113,7 +119,7 @@ pub fn move_into_link_name_space( /// /// [Linux]: https://man7.org/linux/man-pages/man2/setns.2.html pub fn move_into_thread_name_spaces( - fd: BorrowedFd, + fd: BorrowedFd<'_>, allowed_types: ThreadNameSpaceType, ) -> io::Result<()> { syscalls::setns(fd, allowed_types.bits() as c_int).map(|_r| ()) diff --git a/vendor/rustix/src/utils.rs b/vendor/rustix/src/utils.rs index c5258394d..d21ed88b6 100644 --- a/vendor/rustix/src/utils.rs +++ b/vendor/rustix/src/utils.rs @@ -1,4 +1,7 @@ +//! Miscellaneous minor utilities. + #![allow(dead_code)] +#![allow(unused_macros)] use core::ffi::c_void; use core::mem::{align_of, size_of}; @@ -46,3 +49,34 @@ pub(crate) fn check_raw_pointer(value: *mut c_void) -> Option> { NonNull::new(value.cast()) } + +/// Create an array value containing all default values, inferring the type. +#[inline] +pub(crate) fn default_array() -> [T; N] { + [T::default(); N] +} + +/// Create a union value containing a default value in one of its arms. +/// +/// The field names a union field which must have the same size as the union +/// itself. +macro_rules! default_union { + ($union:ident, $field:ident) => {{ + let u = $union { + $field: Default::default(), + }; + + // Assert that the given field initializes the whole union. + #[cfg(test)] + unsafe { + let field_value = u.$field; + assert_eq!( + core::mem::size_of_val(&u), + core::mem::size_of_val(&field_value) + ); + const_assert_eq!(memoffset::offset_of_union!($union, $field), 0); + } + + u + }}; +} diff --git a/vendor/rustix/src/weak.rs b/vendor/rustix/src/weak.rs index b75b1f12a..3cda8e6c9 100644 --- a/vendor/rustix/src/weak.rs +++ b/vendor/rustix/src/weak.rs @@ -184,7 +184,7 @@ macro_rules! syscall { // Pass `BorrowedFd` values as the integer value. impl AsSyscallArg for $crate::fd::BorrowedFd<'_> { - type SyscallArgType = ::libc::c_long; + type SyscallArgType = ::libc::c_int; fn into_syscall_arg(self) -> Self::SyscallArgType { $crate::fd::AsRawFd::as_raw_fd(&self) as _ } @@ -192,31 +192,31 @@ macro_rules! syscall { // Coerce integer values into `c_long`. impl AsSyscallArg for i8 { - type SyscallArgType = ::libc::c_long; - fn into_syscall_arg(self) -> Self::SyscallArgType { self as _ } + type SyscallArgType = ::libc::c_int; + fn into_syscall_arg(self) -> Self::SyscallArgType { self.into() } } impl AsSyscallArg for u8 { - type SyscallArgType = ::libc::c_long; - fn into_syscall_arg(self) -> Self::SyscallArgType { self as _ } + type SyscallArgType = ::libc::c_int; + fn into_syscall_arg(self) -> Self::SyscallArgType { self.into() } } impl AsSyscallArg for i16 { - type SyscallArgType = ::libc::c_long; - fn into_syscall_arg(self) -> Self::SyscallArgType { self as _ } + type SyscallArgType = ::libc::c_int; + fn into_syscall_arg(self) -> Self::SyscallArgType { self.into() } } impl AsSyscallArg for u16 { - type SyscallArgType = ::libc::c_long; - fn into_syscall_arg(self) -> Self::SyscallArgType { self as _ } + type SyscallArgType = ::libc::c_int; + fn into_syscall_arg(self) -> Self::SyscallArgType { self.into() } } impl AsSyscallArg for i32 { - type SyscallArgType = ::libc::c_long; - fn into_syscall_arg(self) -> Self::SyscallArgType { self as _ } + type SyscallArgType = ::libc::c_int; + fn into_syscall_arg(self) -> Self::SyscallArgType { self } } impl AsSyscallArg for u32 { - type SyscallArgType = ::libc::c_long; - fn into_syscall_arg(self) -> Self::SyscallArgType { self as _ } + type SyscallArgType = ::libc::c_uint; + fn into_syscall_arg(self) -> Self::SyscallArgType { self } } impl AsSyscallArg for usize { - type SyscallArgType = ::libc::c_long; + type SyscallArgType = ::libc::c_ulong; fn into_syscall_arg(self) -> Self::SyscallArgType { self as _ } } @@ -225,12 +225,12 @@ macro_rules! syscall { #[cfg(target_pointer_width = "64")] impl AsSyscallArg for i64 { type SyscallArgType = ::libc::c_long; - fn into_syscall_arg(self) -> Self::SyscallArgType { self as _ } + fn into_syscall_arg(self) -> Self::SyscallArgType { self } } #[cfg(target_pointer_width = "64")] impl AsSyscallArg for u64 { - type SyscallArgType = ::libc::c_long; - fn into_syscall_arg(self) -> Self::SyscallArgType { self as _ } + type SyscallArgType = ::libc::c_ulong; + fn into_syscall_arg(self) -> Self::SyscallArgType { self } } // `concat_idents` is [unstable], so we take an extra `sys_name` -- cgit v1.2.3