authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-04-15 19:02:13+02:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-04-16 16:00:21+02:00
log67023fc4bd8cef20a097b4cd7b97438625049b70
tree18586447e7775ae5f25ceb307a0caee0b340888a
parentab2f9ca50341ce6115f2839281a6e3c640271583
signaturebadge-check Signed by SSH key SHA256:7B/LJ7bpR1eX8aCXSr4mtd5M45VMPKcx9zY8e95b5QM

std.os.linux: fix syscall argument width for mipsn32 and x32

This required a thorough audit of every syscall wrapper in std.os.linux, so while I was here, I fixed some minor arch-specific bugs, improved some types, simplified some casts, and deleted some dead code. Note that lseek() in particular is still broken for n32 and x32 after this commit; this wrapper will require some special-casing in the arch bits due to its unusual return type width. closes https://github.com/ziglang/zig/issues/22464 closes https://codeberg.org/ziglang/zig/issues/31597

24 files changed, 1366 insertions(+), 801 deletions(-)

lib/c/fcntl.zig+1-1
......@@ -16,7 +16,7 @@ comptime {
1616}
1717
1818fn fallocateLinux(fd: c_int, mode: c_int, offset: off_t, len: off_t) callconv(.c) c_int {
19 return errno(linux.fallocate(fd, mode, offset, len));
19 return errno(linux.fallocate(fd, @bitCast(mode), offset, len));
2020}
2121
2222fn posix_fadviseLinux(fd: c_int, offset: off_t, len: off_t, advice: c_int) callconv(.c) c_int {
lib/std/Io/Threaded.zig+8-8
......@@ -10035,10 +10035,10 @@ fn fileSeekBy(userdata: ?*anyopaque, file: File, offset: i64) File.SeekError!voi
1003510035 if (posix.SEEK == void) return error.Unseekable;
1003610036
1003710037 if (native_os == .linux and !builtin.link_libc and @sizeOf(usize) == 4) {
10038 var result: u64 = undefined;
10038 var result: i64 = undefined;
1003910039 const syscall: Syscall = try .start();
1004010040 while (true) {
10041 switch (posix.errno(posix.system.llseek(file.handle, @bitCast(offset), &result, posix.SEEK.CUR))) {
10041 switch (posix.errno(posix.system.llseek(file.handle, offset, &result, posix.SEEK.CUR))) {
1004210042 .SUCCESS => {
1004310043 syscall.finish();
1004410044 return;
......@@ -10149,8 +10149,8 @@ fn posixSeekTo(fd: posix.fd_t, offset: u64) File.SeekError!void {
1014910149 if (native_os == .linux and !builtin.link_libc and @sizeOf(usize) == 4) {
1015010150 const syscall: Syscall = try .start();
1015110151 while (true) {
10152 var result: u64 = undefined;
10153 switch (posix.errno(posix.system.llseek(fd, offset, &result, posix.SEEK.SET))) {
10152 var result: i64 = undefined;
10153 switch (posix.errno(posix.system.llseek(fd, @bitCast(offset), &result, posix.SEEK.SET))) {
1015410154 .SUCCESS => {
1015510155 syscall.finish();
1015610156 return;
......@@ -15247,7 +15247,7 @@ fn childWaitPosix(child: *process.Child) process.Child.WaitError!process.Child.T
1524715247 const ru_ptr = if (child.request_resource_usage_statistics) &ru else null;
1524815248
1524915249 if (have_wait4) {
15250 var status: if (builtin.link_libc) c_int else u32 = undefined;
15250 var status: if (builtin.link_libc) c_int else i32 = undefined;
1525115251 const syscall: Syscall = try .start();
1525215252 while (true) switch (posix.errno(posix.system.wait4(pid, &status, 0, ru_ptr))) {
1525315253 .SUCCESS => {
......@@ -15290,7 +15290,7 @@ fn childWaitPosix(child: *process.Child) process.Child.WaitError!process.Child.T
1529015290 };
1529115291 }
1529215292
15293 var status: if (builtin.link_libc) c_int else u32 = undefined;
15293 var status: if (builtin.link_libc) c_int else i32 = undefined;
1529415294 const syscall: Syscall = try .start();
1529515295 while (true) switch (posix.errno(posix.system.waitpid(pid, &status, 0))) {
1529615296 .SUCCESS => {
......@@ -15332,7 +15332,7 @@ fn childKillPosix(child: *process.Child) !void {
1533215332 };
1533315333
1533415334 if (have_wait4) {
15335 var status: if (builtin.link_libc) c_int else u32 = undefined;
15335 var status: if (builtin.link_libc) c_int else i32 = undefined;
1533615336 while (true) switch (posix.errno(posix.system.wait4(pid, &status, 0, null))) {
1533715337 .SUCCESS => return,
1533815338 .INTR => continue,
......@@ -15352,7 +15352,7 @@ fn childKillPosix(child: *process.Child) !void {
1535215352 };
1535315353 }
1535415354
15355 var status: if (builtin.link_libc) c_int else u32 = undefined;
15355 var status: if (builtin.link_libc) c_int else i32 = undefined;
1535615356 while (true) switch (posix.errno(posix.system.waitpid(pid, &status, 0))) {
1535715357 .SUCCESS => return,
1535815358 .INTR => continue,
lib/std/os/linux.zig+383-422
......@@ -59,6 +59,7 @@ const arch_bits = switch (native_arch) {
5959
6060const syscall_bits = if (native_arch.isThumb()) @import("linux/thumb.zig") else arch_bits;
6161
62pub const syscall_arg_t = syscall_bits.syscall_arg_t;
6263pub const syscall0 = syscall_bits.syscall0;
6364pub const syscall1 = syscall_bits.syscall1;
6465pub const syscall2 = syscall_bits.syscall2;
......@@ -78,9 +79,9 @@ pub fn clone(
7879 stack: usize,
7980 flags: u32,
8081 arg: usize,
81 ptid: ?*i32,
82 ptid: ?*pid_t,
8283 tp: usize, // aka tls
83 ctid: ?*i32,
84 ctid: ?*pid_t,
8485) usize {
8586 // Can't directly call a naked function; cast to C calling convention first.
8687 return @as(*const fn (
......@@ -88,9 +89,9 @@ pub fn clone(
8889 usize,
8990 u32,
9091 usize,
91 ?*i32,
92 ?*pid_t,
9293 usize,
93 ?*i32,
94 ?*pid_t,
9495 ) callconv(.c) usize, @ptrCast(&syscall_bits.clone))(func, stack, flags, arg, ptid, tp, ctid);
9596}
9697
......@@ -98,6 +99,8 @@ pub const ARCH = arch_bits.ARCH;
9899pub const HWCAP = arch_bits.HWCAP;
99100pub const SC = arch_bits.SC;
100101pub const VDSO = arch_bits.VDSO;
102pub const user_desc = arch_bits.user_desc;
103
101104pub const blkcnt_t = u64;
102105pub const blksize_t = u32;
103106pub const dev_t = u64;
......@@ -105,8 +108,13 @@ pub const ino_t = u64;
105108pub const mode_t = u32;
106109pub const nlink_t = u32;
107110pub const off_t = i64;
111pub const pid_t = i32;
112pub const fd_t = i32;
113pub const socket_t = fd_t;
114pub const uid_t = u32;
115pub const gid_t = u32;
116pub const clock_t = isize;
108117pub const time_t = arch_bits.time_t;
109pub const user_desc = arch_bits.user_desc;
110118
111119pub const tls = @import("linux/tls.zig");
112120pub const BPF = @import("linux/bpf.zig");
......@@ -613,13 +621,13 @@ pub fn brk(addr: usize) usize {
613621 return syscall1(.brk, addr);
614622}
615623
616pub fn dup(old: i32) usize {
617 return syscall1(.dup, @as(usize, @bitCast(@as(isize, old))));
624pub fn dup(old: fd_t) usize {
625 return syscall1(.dup, @as(u32, @bitCast(old)));
618626}
619627
620pub fn dup2(old: i32, new: i32) usize {
628pub fn dup2(old: fd_t, new: fd_t) usize {
621629 if (@hasField(SYS, "dup2")) {
622 return syscall2(.dup2, @as(usize, @bitCast(@as(isize, old))), @as(usize, @bitCast(@as(isize, new))));
630 return syscall2(.dup2, @as(u32, @bitCast(old)), @as(u32, @bitCast(new)));
623631 } else {
624632 if (old == new) {
625633 if (std.debug.runtime_safety) {
......@@ -628,13 +636,13 @@ pub fn dup2(old: i32, new: i32) usize {
628636 }
629637 return @as(usize, @intCast(old));
630638 } else {
631 return syscall3(.dup3, @as(usize, @bitCast(@as(isize, old))), @as(usize, @bitCast(@as(isize, new))), 0);
639 return syscall3(.dup3, @as(u32, @bitCast(old)), @as(u32, @bitCast(new)), 0);
632640 }
633641 }
634642}
635643
636pub fn dup3(old: i32, new: i32, flags: u32) usize {
637 return syscall3(.dup3, @as(usize, @bitCast(@as(isize, old))), @as(usize, @bitCast(@as(isize, new))), flags);
644pub fn dup3(old: fd_t, new: fd_t, flags: u32) usize {
645 return syscall3(.dup3, @as(u32, @bitCast(old)), @as(u32, @bitCast(new)), flags);
638646}
639647
640648pub fn chdir(path: [*:0]const u8) usize {
......@@ -642,7 +650,7 @@ pub fn chdir(path: [*:0]const u8) usize {
642650}
643651
644652pub fn fchdir(fd: fd_t) usize {
645 return syscall1(.fchdir, @as(usize, @bitCast(@as(isize, fd))));
653 return syscall1(.fchdir, @as(u32, @bitCast(fd)));
646654}
647655
648656pub fn chroot(path: [*:0]const u8) usize {
......@@ -664,7 +672,7 @@ pub const EXECVEAT = packed struct(u32) {
664672};
665673
666674pub fn execveat(dirfd: fd_t, path: [*:0]const u8, argv: [*:null]const ?[*:0]const u8, envp: [*:null]const ?[*:0]const u8, flags: EXECVEAT) usize {
667 return syscall5(.execveat, fd_to_usize(dirfd), @intFromPtr(path), @intFromPtr(argv), @intFromPtr(envp), @as(u32, @bitCast(flags)));
675 return syscall5(.execveat, @as(u32, @bitCast(dirfd)), @intFromPtr(path), @intFromPtr(argv), @intFromPtr(envp), @as(u32, @bitCast(flags)));
668676}
669677
670678pub fn fork() usize {
......@@ -686,28 +694,28 @@ pub inline fn vfork() usize {
686694 return @call(.always_inline, syscall0, .{.vfork});
687695}
688696
689pub fn futimens(fd: i32, times: ?*const [2]timespec) usize {
697pub fn futimens(fd: fd_t, times: ?*const [2]timespec) usize {
690698 return utimensat(fd, null, times, 0);
691699}
692700
693pub fn utimensat(dirfd: i32, path: ?[*:0]const u8, times: ?*const [2]timespec, flags: u32) usize {
701pub fn utimensat(dirfd: fd_t, path: ?[*:0]const u8, times: ?*const [2]timespec, flags: u32) usize {
694702 return syscall4(
695703 if (@hasField(SYS, "utimensat") and native_arch != .hexagon) .utimensat else .utimensat_time64,
696 @as(usize, @bitCast(@as(isize, dirfd))),
704 @as(u32, @bitCast(dirfd)),
697705 @intFromPtr(path),
698706 @intFromPtr(times),
699707 flags,
700708 );
701709}
702710
703pub fn fallocate(fd: i32, mode: i32, offset: i64, length: i64) usize {
704 if (usize_bits < 64) {
711pub fn fallocate(fd: fd_t, mode: mode_t, offset: off_t, length: off_t) usize {
712 if (@sizeOf(syscall_arg_t) < @sizeOf(u64)) {
705713 const offset_halves = splitValue64(offset);
706714 const length_halves = splitValue64(length);
707715 return syscall6(
708716 .fallocate,
709 @as(usize, @bitCast(@as(isize, fd))),
710 @as(usize, @bitCast(@as(isize, mode))),
717 @as(u32, @bitCast(fd)),
718 mode,
711719 offset_halves[0],
712720 offset_halves[1],
713721 length_halves[0],
......@@ -716,8 +724,8 @@ pub fn fallocate(fd: i32, mode: i32, offset: i64, length: i64) usize {
716724 } else {
717725 return syscall4(
718726 .fallocate,
719 @as(usize, @bitCast(@as(isize, fd))),
720 @as(usize, @bitCast(@as(isize, mode))),
727 @as(u32, @bitCast(fd)),
728 mode,
721729 @as(u64, @bitCast(offset)),
722730 @as(u64, @bitCast(length)),
723731 );
......@@ -888,19 +896,19 @@ pub fn getcwd(buf: [*]u8, size: usize) usize {
888896 return syscall2(.getcwd, @intFromPtr(buf), size);
889897}
890898
891pub fn getdents(fd: i32, dirp: [*]u8, len: usize) usize {
899pub fn getdents(fd: fd_t, dirp: [*]u8, len: usize) usize {
892900 return syscall3(
893901 .getdents,
894 @as(usize, @bitCast(@as(isize, fd))),
902 @as(u32, @bitCast(fd)),
895903 @intFromPtr(dirp),
896904 @min(len, maxInt(c_int)),
897905 );
898906}
899907
900pub fn getdents64(fd: i32, dirp: [*]u8, len: usize) usize {
908pub fn getdents64(fd: fd_t, dirp: [*]u8, len: usize) usize {
901909 return syscall3(
902910 .getdents64,
903 @as(usize, @bitCast(@as(isize, fd))),
911 @as(u32, @bitCast(fd)),
904912 @intFromPtr(dirp),
905913 @min(len, maxInt(c_int)),
906914 );
......@@ -910,12 +918,12 @@ pub fn inotify_init1(flags: u32) usize {
910918 return syscall1(.inotify_init1, flags);
911919}
912920
913pub fn inotify_add_watch(fd: i32, pathname: [*:0]const u8, mask: u32) usize {
914 return syscall3(.inotify_add_watch, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(pathname), mask);
921pub fn inotify_add_watch(fd: fd_t, pathname: [*:0]const u8, mask: u32) usize {
922 return syscall3(.inotify_add_watch, @as(u32, @bitCast(fd)), @intFromPtr(pathname), mask);
915923}
916924
917pub fn inotify_rm_watch(fd: i32, wd: i32) usize {
918 return syscall2(.inotify_rm_watch, @as(usize, @bitCast(@as(isize, fd))), @as(usize, @bitCast(@as(isize, wd))));
925pub fn inotify_rm_watch(fd: fd_t, wd: fd_t) usize {
926 return syscall2(.inotify_rm_watch, @as(u32, @bitCast(fd)), @as(u32, @bitCast(wd)));
919927}
920928
921929pub fn fanotify_init(flags: fanotify.InitFlags, event_f_flags: u32) usize {
......@@ -929,24 +937,24 @@ pub fn fanotify_mark(
929937 dirfd: fd_t,
930938 pathname: ?[*:0]const u8,
931939) usize {
932 if (usize_bits < 64) {
940 if (@sizeOf(syscall_arg_t) < @sizeOf(u64)) {
933941 const mask_halves = splitValue64(@bitCast(mask));
934942 return syscall6(
935943 .fanotify_mark,
936 @bitCast(@as(isize, fd)),
944 @as(u32, @bitCast(fd)),
937945 @as(u32, @bitCast(flags)),
938946 mask_halves[0],
939947 mask_halves[1],
940 @bitCast(@as(isize, dirfd)),
948 @as(u32, @bitCast(dirfd)),
941949 @intFromPtr(pathname),
942950 );
943951 } else {
944952 return syscall5(
945953 .fanotify_mark,
946 @bitCast(@as(isize, fd)),
954 @as(u32, @bitCast(fd)),
947955 @as(u32, @bitCast(flags)),
948 @bitCast(mask),
949 @bitCast(@as(isize, dirfd)),
956 @as(u64, @bitCast(mask)),
957 @as(u32, @bitCast(dirfd)),
950958 @intFromPtr(pathname),
951959 );
952960 }
......@@ -955,7 +963,7 @@ pub fn fanotify_mark(
955963pub fn name_to_handle_at(
956964 dirfd: fd_t,
957965 pathname: [*:0]const u8,
958 handle: *std.os.linux.file_handle,
966 handle: *file_handle,
959967 mount_id: *i32,
960968 flags: u32,
961969) usize {
......@@ -973,27 +981,27 @@ pub fn readlink(noalias path: [*:0]const u8, noalias buf_ptr: [*]u8, buf_len: us
973981 if (@hasField(SYS, "readlink")) {
974982 return syscall3(.readlink, @intFromPtr(path), @intFromPtr(buf_ptr), buf_len);
975983 } else {
976 return syscall4(.readlinkat, @as(usize, @bitCast(@as(isize, AT.FDCWD))), @intFromPtr(path), @intFromPtr(buf_ptr), buf_len);
984 return syscall4(.readlinkat, @as(u32, @bitCast(@as(i32, AT.FDCWD))), @intFromPtr(path), @intFromPtr(buf_ptr), buf_len);
977985 }
978986}
979987
980pub fn readlinkat(dirfd: i32, noalias path: [*:0]const u8, noalias buf_ptr: [*]u8, buf_len: usize) usize {
981 return syscall4(.readlinkat, @as(usize, @bitCast(@as(isize, dirfd))), @intFromPtr(path), @intFromPtr(buf_ptr), buf_len);
988pub fn readlinkat(dirfd: fd_t, noalias path: [*:0]const u8, noalias buf_ptr: [*]u8, buf_len: usize) usize {
989 return syscall4(.readlinkat, @as(u32, @bitCast(dirfd)), @intFromPtr(path), @intFromPtr(buf_ptr), buf_len);
982990}
983991
984992pub fn mkdir(path: [*:0]const u8, mode: mode_t) usize {
985993 if (@hasField(SYS, "mkdir")) {
986994 return syscall2(.mkdir, @intFromPtr(path), mode);
987995 } else {
988 return syscall3(.mkdirat, @as(usize, @bitCast(@as(isize, AT.FDCWD))), @intFromPtr(path), mode);
996 return syscall3(.mkdirat, @as(u32, @bitCast(@as(i32, AT.FDCWD))), @intFromPtr(path), mode);
989997 }
990998}
991999
992pub fn mkdirat(dirfd: i32, path: [*:0]const u8, mode: mode_t) usize {
993 return syscall3(.mkdirat, @as(usize, @bitCast(@as(isize, dirfd))), @intFromPtr(path), mode);
1000pub fn mkdirat(dirfd: fd_t, path: [*:0]const u8, mode: mode_t) usize {
1001 return syscall3(.mkdirat, @as(u32, @bitCast(dirfd)), @intFromPtr(path), mode);
9941002}
9951003
996pub fn mknod(path: [*:0]const u8, mode: u32, dev: u32) usize {
1004pub fn mknod(path: [*:0]const u8, mode: mode_t, dev: dev_t) usize {
9971005 if (@hasField(SYS, "mknod")) {
9981006 return syscall3(.mknod, @intFromPtr(path), mode, dev);
9991007 } else {
......@@ -1001,8 +1009,8 @@ pub fn mknod(path: [*:0]const u8, mode: u32, dev: u32) usize {
10011009 }
10021010}
10031011
1004pub fn mknodat(dirfd: i32, path: [*:0]const u8, mode: u32, dev: u32) usize {
1005 return syscall4(.mknodat, @as(usize, @bitCast(@as(isize, dirfd))), @intFromPtr(path), mode, dev);
1012pub fn mknodat(dirfd: dev_t, path: [*:0]const u8, mode: mode_t, dev: dev_t) usize {
1013 return syscall4(.mknodat, @as(u32, @bitCast(dirfd)), @intFromPtr(path), mode, dev);
10061014}
10071015
10081016pub fn mount(special: ?[*:0]const u8, dir: [*:0]const u8, fstype: ?[*:0]const u8, flags: u32, data: usize) usize {
......@@ -1038,7 +1046,14 @@ pub const MOVE_MOUNT = packed struct(u32) {
10381046};
10391047
10401048pub fn move_mount(from_dirfd: fd_t, from_path: [*:0]const u8, to_dirfd: fd_t, to_path: [*:0]const u8, flags: MOVE_MOUNT) usize {
1041 return syscall5(.move_mount, fd_to_usize(from_dirfd), @intFromPtr(from_path), fd_to_usize(to_dirfd), @intFromPtr(to_path), @as(u32, @bitCast(flags)));
1049 return syscall5(
1050 .move_mount,
1051 @as(u32, @bitCast(from_dirfd)),
1052 @intFromPtr(from_path),
1053 @as(u32, @bitCast(to_dirfd)),
1054 @intFromPtr(to_path),
1055 @as(u32, @bitCast(flags)),
1056 );
10421057}
10431058
10441059pub const MOUNT_ATTR = packed struct(u32) {
......@@ -1070,7 +1085,7 @@ pub const MOUNT_ATTR = packed struct(u32) {
10701085};
10711086
10721087pub fn mount_setattr(dirfd: fd_t, path: [*:0]const u8, flags: MOUNT_ATTR) usize {
1073 return syscall3(.mount_setattr, fd_to_usize(dirfd), @intFromPtr(path), @as(u32, @bitCast(flags)));
1088 return syscall3(.mount_setattr, @as(u32, @bitCast(dirfd)), @intFromPtr(path), @as(u32, @bitCast(flags)));
10741089}
10751090
10761091pub const FSOPEN = packed struct(u32) {
......@@ -1103,7 +1118,7 @@ pub const FSCONFIG_CMD = enum(u32) {
11031118};
11041119
11051120pub fn fsconfig(fd: fd_t, cmd: FSCONFIG_CMD, key: ?[*:0]const u8, value: ?[*:0]const u8, aux: u32) usize {
1106 return syscall5(.fsconfig, fd_to_usize(fd), @intFromEnum(cmd), @intFromPtr(key), @intFromPtr(value), aux);
1121 return syscall5(.fsconfig, @as(u32, @bitCast(fd)), @intFromEnum(cmd), @intFromPtr(key), @intFromPtr(value), aux);
11071122}
11081123
11091124pub const FSMOUNT = packed struct(u32) {
......@@ -1113,7 +1128,7 @@ pub const FSMOUNT = packed struct(u32) {
11131128};
11141129
11151130pub fn fsmount(fsfd: fd_t, flags: FSMOUNT, attr_flags: MOUNT_ATTR) usize {
1116 return syscall3(.fsmount, fd_to_usize(fsfd), @as(u32, @bitCast(flags)), @as(u32, @bitCast(attr_flags)));
1131 return syscall3(.fsmount, @as(u32, @bitCast(fsfd)), @as(u32, @bitCast(flags)), @as(u32, @bitCast(attr_flags)));
11171132}
11181133
11191134pub const FSPICK = packed struct(u32) {
......@@ -1126,7 +1141,7 @@ pub const FSPICK = packed struct(u32) {
11261141};
11271142
11281143pub fn fspick(dirfd: fd_t, path: [*:0]const u8, flags: FSPICK) usize {
1129 return syscall3(.fspick, fd_to_usize(dirfd), @intFromPtr(path), @as(u32, @bitCast(flags)));
1144 return syscall3(.fspick, @as(u32, @bitCast(dirfd)), @intFromPtr(path), @as(u32, @bitCast(flags)));
11301145}
11311146
11321147pub fn pivot_root(new_root: [*:0]const u8, put_old: [*:0]const u8) usize {
......@@ -1141,7 +1156,7 @@ fn mmap2Unit() u64 {
11411156 };
11421157}
11431158
1144pub fn mmap(address: ?[*]u8, length: usize, prot: PROT, flags: MAP, fd: i32, offset: i64) usize {
1159pub fn mmap(address: ?[*]u8, length: usize, prot: PROT, flags: MAP, fd: fd_t, offset: off_t) usize {
11451160 if (@hasField(SYS, "mmap2")) {
11461161 return syscall6(
11471162 .mmap2,
......@@ -1149,7 +1164,7 @@ pub fn mmap(address: ?[*]u8, length: usize, prot: PROT, flags: MAP, fd: i32, off
11491164 length,
11501165 @as(u32, @bitCast(prot)),
11511166 @as(u32, @bitCast(flags)),
1152 @bitCast(@as(isize, fd)),
1167 @as(u32, @bitCast(fd)),
11531168 @truncate(@as(u64, @bitCast(offset)) / mmap2Unit()),
11541169 );
11551170 } else {
......@@ -1162,7 +1177,7 @@ pub fn mmap(address: ?[*]u8, length: usize, prot: PROT, flags: MAP, fd: i32, off
11621177 length,
11631178 @as(u32, @bitCast(prot)),
11641179 @as(u32, @bitCast(flags)),
1165 @bitCast(@as(isize, fd)),
1180 @as(u32, @bitCast(fd)),
11661181 @as(u64, @bitCast(offset)),
11671182 }),
11681183 ) else syscall6(
......@@ -1171,7 +1186,7 @@ pub fn mmap(address: ?[*]u8, length: usize, prot: PROT, flags: MAP, fd: i32, off
11711186 length,
11721187 @as(u32, @bitCast(prot)),
11731188 @as(u32, @bitCast(flags)),
1174 @bitCast(@as(isize, fd)),
1189 @as(u32, @bitCast(fd)),
11751190 @as(u64, @bitCast(offset)),
11761191 );
11771192 }
......@@ -1278,70 +1293,142 @@ pub fn ppoll(fds: [*]pollfd, n: nfds_t, timeout: ?*timespec, sigmask: ?*const si
12781293 );
12791294}
12801295
1281pub fn read(fd: i32, buf: [*]u8, count: usize) usize {
1282 return syscall3(.read, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(buf), count);
1296pub fn read(fd: fd_t, buf: [*]u8, count: usize) usize {
1297 return syscall3(.read, @as(u32, @bitCast(fd)), @intFromPtr(buf), count);
1298}
1299
1300pub fn pread(fd: fd_t, buf: [*]u8, count: usize, offset: off_t) usize {
1301 if (@sizeOf(syscall_arg_t) < @sizeOf(u64)) {
1302 const offset_halves = splitValue64(offset);
1303 if (require_aligned_register_pair) {
1304 return syscall6(
1305 .pread64,
1306 @as(u32, @bitCast(fd)),
1307 @intFromPtr(buf),
1308 count,
1309 0,
1310 offset_halves[0],
1311 offset_halves[1],
1312 );
1313 } else {
1314 return syscall5(
1315 .pread64,
1316 @as(u32, @bitCast(fd)),
1317 @intFromPtr(buf),
1318 count,
1319 offset_halves[0],
1320 offset_halves[1],
1321 );
1322 }
1323 } else {
1324 return syscall4(
1325 .pread64,
1326 @as(u32, @bitCast(fd)),
1327 @intFromPtr(buf),
1328 count,
1329 @as(u64, @bitCast(offset)),
1330 );
1331 }
1332}
1333
1334pub fn readv(fd: fd_t, iov: [*]const iovec, count: usize) usize {
1335 return syscall3(.readv, @as(u32, @bitCast(fd)), @intFromPtr(iov), count);
12831336}
12841337
1285pub fn preadv(fd: i32, iov: [*]const iovec, count: usize, offset: i64) usize {
1338pub fn preadv(fd: fd_t, iov: [*]const iovec, count: usize, offset: off_t) usize {
12861339 const offset_u: u64 = @bitCast(offset);
12871340 return syscall5(
12881341 .preadv,
1289 @as(usize, @bitCast(@as(isize, fd))),
1342 @as(u32, @bitCast(fd)),
12901343 @intFromPtr(iov),
12911344 count,
12921345 // Kernel expects the offset is split into largest natural word-size.
12931346 // See following link for detail:
12941347 // https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=601cc11d054ae4b5e9b5babec3d8e4667a2cb9b5
1295 @as(usize, @truncate(offset_u)),
1296 if (usize_bits < 64) @as(usize, @truncate(offset_u >> 32)) else 0,
1348 @truncate(offset_u),
1349 if (@sizeOf(syscall_arg_t) < @sizeOf(u64)) @truncate(offset_u >> 32) else 0,
12971350 );
12981351}
12991352
1300pub fn preadv2(fd: i32, iov: [*]const iovec, count: usize, offset: i64, flags: kernel_rwf) usize {
1353pub fn preadv2(fd: fd_t, iov: [*]const iovec, count: usize, offset: off_t, flags: kernel_rwf) usize {
13011354 const offset_u: u64 = @bitCast(offset);
13021355 return syscall6(
13031356 .preadv2,
1304 @as(usize, @bitCast(@as(isize, fd))),
1357 @as(u32, @bitCast(fd)),
13051358 @intFromPtr(iov),
13061359 count,
13071360 // See comments in preadv
1308 @as(usize, @truncate(offset_u)),
1309 if (usize_bits < 64) @as(usize, @truncate(offset_u >> 32)) else 0,
1361 @truncate(offset_u),
1362 if (@sizeOf(syscall_arg_t) < @sizeOf(u64)) @truncate(offset_u >> 32) else 0,
13101363 flags,
13111364 );
13121365}
13131366
1314pub fn readv(fd: i32, iov: [*]const iovec, count: usize) usize {
1315 return syscall3(.readv, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(iov), count);
1367pub fn write(fd: fd_t, buf: [*]const u8, count: usize) usize {
1368 return syscall3(.write, @as(u32, @bitCast(fd)), @intFromPtr(buf), count);
1369}
1370
1371pub fn pwrite(fd: fd_t, buf: [*]const u8, count: usize, offset: off_t) usize {
1372 if (@sizeOf(syscall_arg_t) < @sizeOf(u64)) {
1373 const offset_halves = splitValue64(offset);
1374 if (require_aligned_register_pair) {
1375 return syscall6(
1376 .pwrite64,
1377 @as(u32, @bitCast(fd)),
1378 @intFromPtr(buf),
1379 count,
1380 0,
1381 offset_halves[0],
1382 offset_halves[1],
1383 );
1384 } else {
1385 return syscall5(
1386 .pwrite64,
1387 @as(u32, @bitCast(fd)),
1388 @intFromPtr(buf),
1389 count,
1390 offset_halves[0],
1391 offset_halves[1],
1392 );
1393 }
1394 } else {
1395 return syscall4(
1396 .pwrite64,
1397 @as(u32, @bitCast(fd)),
1398 @intFromPtr(buf),
1399 count,
1400 @as(u64, @bitCast(offset)),
1401 );
1402 }
13161403}
13171404
1318pub fn writev(fd: i32, iov: [*]const iovec_const, count: usize) usize {
1319 return syscall3(.writev, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(iov), count);
1405pub fn writev(fd: fd_t, iov: [*]const iovec_const, count: usize) usize {
1406 return syscall3(.writev, @as(u32, @bitCast(fd)), @intFromPtr(iov), count);
13201407}
13211408
1322pub fn pwritev(fd: i32, iov: [*]const iovec_const, count: usize, offset: i64) usize {
1409pub fn pwritev(fd: fd_t, iov: [*]const iovec_const, count: usize, offset: off_t) usize {
13231410 const offset_u: u64 = @bitCast(offset);
13241411 return syscall5(
13251412 .pwritev,
1326 @as(usize, @bitCast(@as(isize, fd))),
1413 @as(u32, @bitCast(fd)),
13271414 @intFromPtr(iov),
13281415 count,
13291416 // See comments in preadv
1330 @as(usize, @truncate(offset_u)),
1331 if (usize_bits < 64) @as(usize, @truncate(offset_u >> 32)) else 0,
1417 @truncate(offset_u),
1418 if (@sizeOf(syscall_arg_t) < @sizeOf(u64)) @truncate(offset_u >> 32) else 0,
13321419 );
13331420}
13341421
1335pub fn pwritev2(fd: i32, iov: [*]const iovec_const, count: usize, offset: i64, flags: kernel_rwf) usize {
1422pub fn pwritev2(fd: fd_t, iov: [*]const iovec_const, count: usize, offset: off_t, flags: kernel_rwf) usize {
13361423 const offset_u: u64 = @bitCast(offset);
13371424 return syscall6(
13381425 .pwritev2,
1339 @as(usize, @bitCast(@as(isize, fd))),
1426 @as(u32, @bitCast(fd)),
13401427 @intFromPtr(iov),
13411428 count,
13421429 // See comments in preadv
1343 @as(usize, @truncate(offset_u)),
1344 if (usize_bits < 64) @as(usize, @truncate(offset_u >> 32)) else 0,
1430 @truncate(offset_u),
1431 if (@sizeOf(syscall_arg_t) < @sizeOf(u64)) @truncate(offset_u >> 32) else 0,
13451432 flags,
13461433 );
13471434}
......@@ -1350,7 +1437,7 @@ pub fn rmdir(path: [*:0]const u8) usize {
13501437 if (@hasField(SYS, "rmdir")) {
13511438 return syscall1(.rmdir, @intFromPtr(path));
13521439 } else {
1353 return syscall3(.unlinkat, @as(usize, @bitCast(@as(isize, AT.FDCWD))), @intFromPtr(path), AT.REMOVEDIR);
1440 return syscall3(.unlinkat, @as(u32, @bitCast(@as(i32, AT.FDCWD))), @intFromPtr(path), AT.REMOVEDIR);
13541441 }
13551442}
13561443
......@@ -1358,54 +1445,15 @@ pub fn symlink(existing: [*:0]const u8, new: [*:0]const u8) usize {
13581445 if (@hasField(SYS, "symlink")) {
13591446 return syscall2(.symlink, @intFromPtr(existing), @intFromPtr(new));
13601447 } else {
1361 return syscall3(.symlinkat, @intFromPtr(existing), @as(usize, @bitCast(@as(isize, AT.FDCWD))), @intFromPtr(new));
1448 return syscall3(.symlinkat, @intFromPtr(existing), @as(u32, @bitCast(@as(i32, AT.FDCWD))), @intFromPtr(new));
13621449 }
13631450}
13641451
1365pub fn symlinkat(existing: [*:0]const u8, newfd: i32, newpath: [*:0]const u8) usize {
1366 return syscall3(.symlinkat, @intFromPtr(existing), @as(usize, @bitCast(@as(isize, newfd))), @intFromPtr(newpath));
1452pub fn symlinkat(existing: [*:0]const u8, newfd: fd_t, newpath: [*:0]const u8) usize {
1453 return syscall3(.symlinkat, @intFromPtr(existing), @as(u32, @bitCast(newfd)), @intFromPtr(newpath));
13671454}
13681455
1369pub fn pread(fd: i32, buf: [*]u8, count: usize, offset: i64) usize {
1370 if (@hasField(SYS, "pread64") and usize_bits < 64) {
1371 const offset_halves = splitValue64(offset);
1372 if (require_aligned_register_pair) {
1373 return syscall6(
1374 .pread64,
1375 @as(usize, @bitCast(@as(isize, fd))),
1376 @intFromPtr(buf),
1377 count,
1378 0,
1379 offset_halves[0],
1380 offset_halves[1],
1381 );
1382 } else {
1383 return syscall5(
1384 .pread64,
1385 @as(usize, @bitCast(@as(isize, fd))),
1386 @intFromPtr(buf),
1387 count,
1388 offset_halves[0],
1389 offset_halves[1],
1390 );
1391 }
1392 } else {
1393 // Some architectures (eg. 64bit SPARC) pread is called pread64.
1394 const syscall_number = if (!@hasField(SYS, "pread") and @hasField(SYS, "pread64"))
1395 .pread64
1396 else
1397 .pread;
1398 return syscall4(
1399 syscall_number,
1400 @as(usize, @bitCast(@as(isize, fd))),
1401 @intFromPtr(buf),
1402 count,
1403 @as(u64, @bitCast(offset)),
1404 );
1405 }
1406}
1407
1408pub fn access(path: [*:0]const u8, mode: u32) usize {
1456pub fn access(path: [*:0]const u8, mode: mode_t) usize {
14091457 if (@hasField(SYS, "access")) {
14101458 return syscall2(.access, @intFromPtr(path), mode);
14111459 } else {
......@@ -1413,19 +1461,19 @@ pub fn access(path: [*:0]const u8, mode: u32) usize {
14131461 }
14141462}
14151463
1416pub fn faccessat(dirfd: i32, path: [*:0]const u8, mode: u32, flags: u32) usize {
1464pub fn faccessat(dirfd: fd_t, path: [*:0]const u8, mode: mode_t, flags: u32) usize {
14171465 if (flags == 0) {
1418 return syscall3(.faccessat, @as(usize, @bitCast(@as(isize, dirfd))), @intFromPtr(path), mode);
1466 return syscall3(.faccessat, @as(u32, @bitCast(dirfd)), @intFromPtr(path), mode);
14191467 }
1420 return syscall4(.faccessat2, @as(usize, @bitCast(@as(isize, dirfd))), @intFromPtr(path), mode, flags);
1468 return syscall4(.faccessat2, @as(u32, @bitCast(dirfd)), @intFromPtr(path), mode, flags);
14211469}
14221470
14231471pub fn acct(path: [*:0]const u8) usize {
14241472 return syscall1(.acct, @intFromPtr(path));
14251473}
14261474
1427pub fn pipe(fd: *[2]i32) usize {
1428 if (comptime (native_arch.isMIPS() or native_arch.isSPARC())) {
1475pub fn pipe(fd: *[2]fd_t) usize {
1476 if (native_arch.isMIPS() or native_arch.isSPARC()) {
14291477 return syscall_pipe(fd);
14301478 } else if (@hasField(SYS, "pipe")) {
14311479 return syscall1(.pipe, @intFromPtr(fd));
......@@ -1434,21 +1482,17 @@ pub fn pipe(fd: *[2]i32) usize {
14341482 }
14351483}
14361484
1437pub fn pipe2(fd: *[2]i32, flags: O) usize {
1485pub fn pipe2(fd: *[2]fd_t, flags: O) usize {
14381486 return syscall2(.pipe2, @intFromPtr(fd), @as(u32, @bitCast(flags)));
14391487}
14401488
1441pub fn write(fd: i32, buf: [*]const u8, count: usize) usize {
1442 return syscall3(.write, @bitCast(@as(isize, fd)), @intFromPtr(buf), count);
1443}
1444
1445pub fn ftruncate(fd: i32, length: i64) usize {
1446 if (@hasField(SYS, "ftruncate64") and usize_bits < 64) {
1489pub fn ftruncate(fd: fd_t, length: off_t) usize {
1490 if (@sizeOf(syscall_arg_t) < @sizeOf(u64)) {
14471491 const length_halves = splitValue64(length);
14481492 if (require_aligned_register_pair) {
14491493 return syscall4(
14501494 .ftruncate64,
1451 @as(usize, @bitCast(@as(isize, fd))),
1495 @as(u32, @bitCast(fd)),
14521496 0,
14531497 length_halves[0],
14541498 length_halves[1],
......@@ -1456,7 +1500,7 @@ pub fn ftruncate(fd: i32, length: i64) usize {
14561500 } else {
14571501 return syscall3(
14581502 .ftruncate64,
1459 @as(usize, @bitCast(@as(isize, fd))),
1503 @as(u32, @bitCast(fd)),
14601504 length_halves[0],
14611505 length_halves[1],
14621506 );
......@@ -1464,48 +1508,8 @@ pub fn ftruncate(fd: i32, length: i64) usize {
14641508 } else {
14651509 return syscall2(
14661510 .ftruncate,
1467 @as(usize, @bitCast(@as(isize, fd))),
1468 @as(usize, @bitCast(length)),
1469 );
1470 }
1471}
1472
1473pub fn pwrite(fd: i32, buf: [*]const u8, count: usize, offset: i64) usize {
1474 if (@hasField(SYS, "pwrite64") and usize_bits < 64) {
1475 const offset_halves = splitValue64(offset);
1476
1477 if (require_aligned_register_pair) {
1478 return syscall6(
1479 .pwrite64,
1480 @as(usize, @bitCast(@as(isize, fd))),
1481 @intFromPtr(buf),
1482 count,
1483 0,
1484 offset_halves[0],
1485 offset_halves[1],
1486 );
1487 } else {
1488 return syscall5(
1489 .pwrite64,
1490 @as(usize, @bitCast(@as(isize, fd))),
1491 @intFromPtr(buf),
1492 count,
1493 offset_halves[0],
1494 offset_halves[1],
1495 );
1496 }
1497 } else {
1498 // Some architectures (eg. 64bit SPARC) pwrite is called pwrite64.
1499 const syscall_number = if (!@hasField(SYS, "pwrite") and @hasField(SYS, "pwrite64"))
1500 .pwrite64
1501 else
1502 .pwrite;
1503 return syscall4(
1504 syscall_number,
1505 @as(usize, @bitCast(@as(isize, fd))),
1506 @intFromPtr(buf),
1507 count,
1508 @as(u64, @bitCast(offset)),
1511 @as(u32, @bitCast(fd)),
1512 @as(u64, @bitCast(length)),
15091513 );
15101514 }
15111515}
......@@ -1516,50 +1520,50 @@ pub fn rename(old: [*:0]const u8, new: [*:0]const u8) usize {
15161520 } else if (@hasField(SYS, "renameat")) {
15171521 return syscall4(
15181522 .renameat,
1519 @as(usize, @bitCast(@as(isize, AT.FDCWD))),
1523 @as(u32, @bitCast(@as(i32, AT.FDCWD))),
15201524 @intFromPtr(old),
1521 @as(usize, @bitCast(@as(isize, AT.FDCWD))),
1525 @as(u32, @bitCast(@as(i32, AT.FDCWD))),
15221526 @intFromPtr(new),
15231527 );
15241528 } else {
15251529 return syscall5(
15261530 .renameat2,
1527 @as(usize, @bitCast(@as(isize, AT.FDCWD))),
1531 @as(u32, @bitCast(@as(i32, AT.FDCWD))),
15281532 @intFromPtr(old),
1529 @as(usize, @bitCast(@as(isize, AT.FDCWD))),
1533 @as(u32, @bitCast(@as(i32, AT.FDCWD))),
15301534 @intFromPtr(new),
15311535 0,
15321536 );
15331537 }
15341538}
15351539
1536pub fn renameat(oldfd: i32, oldpath: [*:0]const u8, newfd: i32, newpath: [*:0]const u8) usize {
1540pub fn renameat(oldfd: fd_t, oldpath: [*:0]const u8, newfd: fd_t, newpath: [*:0]const u8) usize {
15371541 if (@hasField(SYS, "renameat")) {
15381542 return syscall4(
15391543 .renameat,
1540 @as(usize, @bitCast(@as(isize, oldfd))),
1544 @as(u32, @bitCast(oldfd)),
15411545 @intFromPtr(oldpath),
1542 @as(usize, @bitCast(@as(isize, newfd))),
1546 @as(u32, @bitCast(newfd)),
15431547 @intFromPtr(newpath),
15441548 );
15451549 } else {
15461550 return syscall5(
15471551 .renameat2,
1548 @as(usize, @bitCast(@as(isize, oldfd))),
1552 @as(u32, @bitCast(oldfd)),
15491553 @intFromPtr(oldpath),
1550 @as(usize, @bitCast(@as(isize, newfd))),
1554 @as(u32, @bitCast(newfd)),
15511555 @intFromPtr(newpath),
15521556 0,
15531557 );
15541558 }
15551559}
15561560
1557pub fn renameat2(oldfd: i32, oldpath: [*:0]const u8, newfd: i32, newpath: [*:0]const u8, flags: RENAME) usize {
1561pub fn renameat2(oldfd: fd_t, oldpath: [*:0]const u8, newfd: fd_t, newpath: [*:0]const u8, flags: RENAME) usize {
15581562 return syscall5(
15591563 .renameat2,
1560 @as(usize, @bitCast(@as(isize, oldfd))),
1564 @as(u32, @bitCast(oldfd)),
15611565 @intFromPtr(oldpath),
1562 @as(usize, @bitCast(@as(isize, newfd))),
1566 @as(u32, @bitCast(newfd)),
15631567 @intFromPtr(newpath),
15641568 @as(u32, @bitCast(flags)),
15651569 );
......@@ -1571,7 +1575,7 @@ pub fn open(path: [*:0]const u8, flags: O, perm: mode_t) usize {
15711575 } else {
15721576 return syscall4(
15731577 .openat,
1574 @bitCast(@as(isize, AT.FDCWD)),
1578 @as(u32, @bitCast(@as(i32, AT.FDCWD))),
15751579 @intFromPtr(path),
15761580 @as(u32, @bitCast(flags)),
15771581 perm,
......@@ -1583,13 +1587,13 @@ pub fn create(path: [*:0]const u8, perm: mode_t) usize {
15831587 return syscall2(.creat, @intFromPtr(path), perm);
15841588}
15851589
1586pub fn openat(dirfd: i32, path: [*:0]const u8, flags: O, mode: mode_t) usize {
1590pub fn openat(dirfd: fd_t, path: [*:0]const u8, flags: O, mode: mode_t) usize {
15871591 // dirfd could be negative, for example AT.FDCWD is -100
1588 return syscall4(.openat, @bitCast(@as(isize, dirfd)), @intFromPtr(path), @as(u32, @bitCast(flags)), mode);
1592 return syscall4(.openat, @as(u32, @bitCast(dirfd)), @intFromPtr(path), @as(u32, @bitCast(flags)), mode);
15891593}
15901594
15911595/// See also `clone` (from the arch-specific include)
1592pub fn clone5(flags: usize, child_stack_ptr: usize, parent_tid: *i32, child_tid: *i32, newtls: usize) usize {
1596pub fn clone5(flags: usize, child_stack_ptr: usize, parent_tid: *pid_t, child_tid: *pid_t, newtls: usize) usize {
15931597 return syscall5(.clone, flags, child_stack_ptr, @intFromPtr(parent_tid), @intFromPtr(child_tid), newtls);
15941598}
15951599
......@@ -1604,7 +1608,7 @@ pub fn set_tid_address(tidptr: ?*pid_t) pid_t {
16041608}
16051609
16061610pub fn close(fd: fd_t) usize {
1607 return syscall1(.close, @as(usize, @bitCast(@as(isize, fd))));
1611 return syscall1(.close, @as(u32, @bitCast(fd)));
16081612}
16091613
16101614pub const CLOSE_RANGE = packed struct(u32) {
......@@ -1616,11 +1620,11 @@ pub const CLOSE_RANGE = packed struct(u32) {
16161620};
16171621
16181622pub fn close_range(first: fd_t, last: fd_t, flags: CLOSE_RANGE) usize {
1619 return syscall3(.close_range, fd_to_usize(first), fd_to_usize(last), @as(u32, @bitCast(flags)));
1623 return syscall3(.close_range, @as(u32, @bitCast(first)), @as(u32, @bitCast(last)), @as(u32, @bitCast(flags)));
16201624}
16211625
1622pub fn fchmod(fd: i32, mode: mode_t) usize {
1623 return syscall2(.fchmod, @as(usize, @bitCast(@as(isize, fd))), mode);
1626pub fn fchmod(fd: fd_t, mode: mode_t) usize {
1627 return syscall2(.fchmod, @as(u32, @bitCast(fd)), mode);
16241628}
16251629
16261630pub fn chmod(path: [*:0]const u8, mode: mode_t) usize {
......@@ -1631,16 +1635,16 @@ pub fn chmod(path: [*:0]const u8, mode: mode_t) usize {
16311635 }
16321636}
16331637
1634pub fn fchown(fd: i32, owner: uid_t, group: gid_t) usize {
1638pub fn fchown(fd: fd_t, owner: uid_t, group: gid_t) usize {
16351639 if (@hasField(SYS, "fchown32")) {
1636 return syscall3(.fchown32, @as(usize, @bitCast(@as(isize, fd))), owner, group);
1640 return syscall3(.fchown32, @as(u32, @bitCast(fd)), owner, group);
16371641 } else {
1638 return syscall3(.fchown, @as(usize, @bitCast(@as(isize, fd))), owner, group);
1642 return syscall3(.fchown, @as(u32, @bitCast(fd)), owner, group);
16391643 }
16401644}
16411645
1642pub fn fchownat(fd: i32, path: [*:0]const u8, owner: uid_t, group: gid_t, flags: u32) usize {
1643 return syscall5(.fchownat, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(path), owner, group, flags);
1646pub fn fchownat(fd: fd_t, path: [*:0]const u8, owner: uid_t, group: gid_t, flags: u32) usize {
1647 return syscall5(.fchownat, @as(u32, @bitCast(fd)), @intFromPtr(path), owner, group, flags);
16441648}
16451649
16461650pub fn chown(path: [*:0]const u8, owner: uid_t, group: gid_t) usize {
......@@ -1663,40 +1667,40 @@ pub fn lchown(path: [*:0]const u8, owner: uid_t, group: gid_t) usize {
16631667 }
16641668}
16651669
1666pub fn fchmodat(fd: i32, path: [*:0]const u8, mode: mode_t) usize {
1667 return syscall3(.fchmodat, @bitCast(@as(isize, fd)), @intFromPtr(path), mode);
1670pub fn fchmodat(fd: fd_t, path: [*:0]const u8, mode: mode_t) usize {
1671 return syscall3(.fchmodat, @as(u32, @bitCast(fd)), @intFromPtr(path), mode);
16681672}
16691673
1670pub fn fchmodat2(fd: i32, path: [*:0]const u8, mode: mode_t, flags: u32) usize {
1671 return syscall4(.fchmodat2, @bitCast(@as(isize, fd)), @intFromPtr(path), mode, flags);
1674pub fn fchmodat2(fd: fd_t, path: [*:0]const u8, mode: mode_t, flags: u32) usize {
1675 return syscall4(.fchmodat2, @as(u32, @bitCast(fd)), @intFromPtr(path), mode, flags);
16721676}
16731677
16741678/// Can only be called on 32 bit systems. For 64 bit see `lseek`.
1675pub fn llseek(fd: i32, offset: u64, result: ?*u64, whence: usize) usize {
1679pub fn llseek(fd: fd_t, offset: off_t, result: ?*off_t, whence: u32) usize {
16761680 // NOTE: The offset parameter splitting is independent from the target
16771681 // endianness.
16781682 return syscall5(
16791683 .llseek,
1680 @as(usize, @bitCast(@as(isize, fd))),
1681 @as(usize, @truncate(offset >> 32)),
1682 @as(usize, @truncate(offset)),
1684 @as(u32, @bitCast(fd)),
1685 @truncate(@as(u64, @bitCast(offset >> 32))),
1686 @truncate(@as(u64, @bitCast(offset))),
16831687 @intFromPtr(result),
16841688 whence,
16851689 );
16861690}
16871691
16881692/// Can only be called on 64 bit systems. For 32 bit see `llseek`.
1689pub fn lseek(fd: i32, offset: i64, whence: usize) usize {
1690 return syscall3(.lseek, @as(usize, @bitCast(@as(isize, fd))), @as(usize, @bitCast(offset)), whence);
1693pub fn lseek(fd: fd_t, offset: off_t, whence: u32) usize {
1694 return syscall3(.lseek, @as(u32, @bitCast(fd)), @as(u64, @bitCast(offset)), whence);
16911695}
16921696
16931697pub fn exit(status: i32) noreturn {
1694 _ = syscall1(.exit, @as(usize, @bitCast(@as(isize, status))));
1698 _ = syscall1(.exit, @as(u32, @bitCast(status)));
16951699 unreachable;
16961700}
16971701
16981702pub fn exit_group(status: i32) noreturn {
1699 _ = syscall1(.exit_group, @as(usize, @bitCast(@as(isize, status))));
1703 _ = syscall1(.exit_group, @as(u32, @bitCast(status)));
17001704 unreachable;
17011705}
17021706
......@@ -1762,15 +1766,15 @@ pub fn getrandom(buf: [*]u8, count: usize, flags: u32) usize {
17621766}
17631767
17641768pub fn kill(pid: pid_t, sig: SIG) usize {
1765 return syscall2(.kill, @as(usize, @bitCast(@as(isize, pid))), @intFromEnum(sig));
1769 return syscall2(.kill, @as(u32, @bitCast(pid)), @intFromEnum(sig));
17661770}
17671771
17681772pub fn tkill(tid: pid_t, sig: SIG) usize {
1769 return syscall2(.tkill, @as(usize, @bitCast(@as(isize, tid))), @intFromEnum(sig));
1773 return syscall2(.tkill, @as(u32, @bitCast(tid)), @intFromEnum(sig));
17701774}
17711775
17721776pub fn tgkill(tgid: pid_t, tid: pid_t, sig: SIG) usize {
1773 return syscall3(.tgkill, @as(usize, @bitCast(@as(isize, tgid))), @as(usize, @bitCast(@as(isize, tid))), @intFromEnum(sig));
1777 return syscall3(.tgkill, @as(u32, @bitCast(tgid)), @as(u32, @bitCast(tid)), @intFromEnum(sig));
17741778}
17751779
17761780pub fn link(oldpath: [*:0]const u8, newpath: [*:0]const u8) usize {
......@@ -1783,9 +1787,9 @@ pub fn link(oldpath: [*:0]const u8, newpath: [*:0]const u8) usize {
17831787 } else {
17841788 return syscall5(
17851789 .linkat,
1786 @as(usize, @bitCast(@as(isize, AT.FDCWD))),
1790 @as(u32, @bitCast(@as(i32, AT.FDCWD))),
17871791 @intFromPtr(oldpath),
1788 @as(usize, @bitCast(@as(isize, AT.FDCWD))),
1792 @as(u32, @bitCast(@as(i32, AT.FDCWD))),
17891793 @intFromPtr(newpath),
17901794 0,
17911795 );
......@@ -1795,9 +1799,9 @@ pub fn link(oldpath: [*:0]const u8, newpath: [*:0]const u8) usize {
17951799pub fn linkat(oldfd: fd_t, oldpath: [*:0]const u8, newfd: fd_t, newpath: [*:0]const u8, flags: u32) usize {
17961800 return syscall5(
17971801 .linkat,
1798 @as(usize, @bitCast(@as(isize, oldfd))),
1802 @as(u32, @bitCast(oldfd)),
17991803 @intFromPtr(oldpath),
1800 @as(usize, @bitCast(@as(isize, newfd))),
1804 @as(u32, @bitCast(newfd)),
18011805 @intFromPtr(newpath),
18021806 flags,
18031807 );
......@@ -1807,33 +1811,33 @@ pub fn unlink(path: [*:0]const u8) usize {
18071811 if (@hasField(SYS, "unlink")) {
18081812 return syscall1(.unlink, @intFromPtr(path));
18091813 } else {
1810 return syscall3(.unlinkat, @as(usize, @bitCast(@as(isize, AT.FDCWD))), @intFromPtr(path), 0);
1814 return syscall3(.unlinkat, @as(u32, @bitCast(@as(i32, AT.FDCWD))), @intFromPtr(path), 0);
18111815 }
18121816}
18131817
1814pub fn unlinkat(dirfd: i32, path: [*:0]const u8, flags: u32) usize {
1815 return syscall3(.unlinkat, @as(usize, @bitCast(@as(isize, dirfd))), @intFromPtr(path), flags);
1818pub fn unlinkat(dirfd: fd_t, path: [*:0]const u8, flags: u32) usize {
1819 return syscall3(.unlinkat, @as(u32, @bitCast(dirfd)), @intFromPtr(path), flags);
18161820}
18171821
1818pub fn waitpid(pid: pid_t, status: *u32, flags: u32) usize {
1819 return syscall4(.wait4, @as(usize, @bitCast(@as(isize, pid))), @intFromPtr(status), flags, 0);
1822pub fn waitpid(pid: pid_t, status: *i32, flags: u32) usize {
1823 return syscall4(.wait4, @as(u32, @bitCast(pid)), @intFromPtr(status), flags, 0);
18201824}
18211825
1822pub fn wait4(pid: pid_t, status: *u32, flags: u32, usage: ?*rusage) usize {
1826pub fn wait4(pid: pid_t, status: *i32, flags: u32, usage: ?*rusage) usize {
18231827 return syscall4(
18241828 .wait4,
1825 @as(usize, @bitCast(@as(isize, pid))),
1829 @as(u32, @bitCast(pid)),
18261830 @intFromPtr(status),
18271831 flags,
18281832 @intFromPtr(usage),
18291833 );
18301834}
18311835
1832pub fn waitid(id_type: P, id: i32, infop: *siginfo_t, flags: u32, usage: ?*rusage) usize {
1836pub fn waitid(id_type: P, id: pid_t, infop: *siginfo_t, flags: u32, usage: ?*rusage) usize {
18331837 return syscall5(
18341838 .waitid,
18351839 @intFromEnum(id_type),
1836 @as(usize, @bitCast(@as(isize, id))),
1840 @as(u32, @bitCast(id)),
18371841 @intFromPtr(infop),
18381842 flags,
18391843 @intFromPtr(usage),
......@@ -1932,14 +1936,14 @@ pub const Flock = extern struct {
19321936
19331937pub fn fcntl(fd: fd_t, cmd: i32, arg: usize) usize {
19341938 if (@hasField(SYS, "fcntl64")) {
1935 return syscall3(.fcntl64, @as(usize, @bitCast(@as(isize, fd))), @as(usize, @bitCast(@as(isize, cmd))), arg);
1939 return syscall3(.fcntl64, @as(u32, @bitCast(fd)), @as(u32, @bitCast(cmd)), arg);
19361940 } else {
1937 return syscall3(.fcntl, @as(usize, @bitCast(@as(isize, fd))), @as(usize, @bitCast(@as(isize, cmd))), arg);
1941 return syscall3(.fcntl, @as(u32, @bitCast(fd)), @as(u32, @bitCast(cmd)), arg);
19381942 }
19391943}
19401944
19411945pub fn flock(fd: fd_t, operation: i32) usize {
1942 return syscall2(.flock, @as(usize, @bitCast(@as(isize, fd))), @as(usize, @bitCast(@as(isize, operation))));
1946 return syscall2(.flock, @as(u32, @bitCast(fd)), @as(u32, @bitCast(operation)));
19431947}
19441948
19451949pub const Elf_Symndx = if (native_arch == .s390x) u64 else u32;
......@@ -1979,7 +1983,7 @@ fn init_vdso_clock_gettime(clk: clockid_t, ts: *timespec) callconv(.c) usize {
19791983pub fn clock_getres(clk_id: clockid_t, tp: *timespec) usize {
19801984 return syscall2(
19811985 if (@hasField(SYS, "clock_getres") and native_arch != .hexagon) .clock_getres else .clock_getres_time64,
1982 @as(usize, @intFromEnum(clk_id)),
1986 @intFromEnum(clk_id),
19831987 @intFromPtr(tp),
19841988 );
19851989}
......@@ -1987,7 +1991,7 @@ pub fn clock_getres(clk_id: clockid_t, tp: *timespec) usize {
19871991pub fn clock_settime(clk_id: clockid_t, tp: *const timespec) usize {
19881992 return syscall2(
19891993 if (@hasField(SYS, "clock_settime") and native_arch != .hexagon) .clock_settime else .clock_settime64,
1990 @as(usize, @intFromEnum(clk_id)),
1994 @intFromEnum(clk_id),
19911995 @intFromPtr(tp),
19921996 );
19931997}
......@@ -2141,11 +2145,11 @@ pub fn setresgid(rgid: gid_t, egid: gid_t, sgid: gid_t) usize {
21412145}
21422146
21432147pub fn setpgid(pid: pid_t, pgid: pid_t) usize {
2144 return syscall2(.setpgid, @intCast(pid), @intCast(pgid));
2148 return syscall2(.setpgid, @as(u32, @bitCast(pid)), @as(u32, @bitCast(pgid)));
21452149}
21462150
21472151pub fn getpgid(pid: pid_t) usize {
2148 return syscall1(.getpgid, @intCast(pid));
2152 return syscall1(.getpgid, @as(u32, @bitCast(pid)));
21492153}
21502154
21512155pub fn getgroups(size: usize, list: ?[*]gid_t) usize {
......@@ -2169,7 +2173,7 @@ pub fn setsid() usize {
21692173}
21702174
21712175pub fn getsid(pid: pid_t) usize {
2172 return syscall1(.getsid, @intCast(pid));
2176 return syscall1(.getsid, @as(u32, @bitCast(pid)));
21732177}
21742178
21752179pub fn getpid() pid_t {
......@@ -2240,8 +2244,6 @@ pub fn sigaction(sig: SIG, noalias act: ?*const Sigaction, noalias oact: ?*Sigac
22402244 return 0;
22412245}
22422246
2243const usize_bits = @typeInfo(usize).int.bits;
2244
22452247/// Defined as one greater than the largest defined signal number.
22462248pub const NSIG = if (is_mips) 128 else 65;
22472249
......@@ -2302,18 +2304,18 @@ pub fn sigismember(set: *const sigset_t, sig: SIG) bool {
23022304 return ((set.*)[index.word] & index.mask) != 0;
23032305}
23042306
2305pub fn getsockname(fd: i32, noalias addr: *sockaddr, noalias len: *socklen_t) usize {
2307pub fn getsockname(fd: fd_t, noalias addr: *sockaddr, noalias len: *socklen_t) usize {
23062308 if (native_arch == .x86) {
2307 return socketcall(SC.getsockname, &[3]usize{ @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(addr), @intFromPtr(len) });
2309 return socketcall(SC.getsockname, &[3]usize{ @as(u32, @bitCast(fd)), @intFromPtr(addr), @intFromPtr(len) });
23082310 }
2309 return syscall3(.getsockname, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(addr), @intFromPtr(len));
2311 return syscall3(.getsockname, @as(u32, @bitCast(fd)), @intFromPtr(addr), @intFromPtr(len));
23102312}
23112313
2312pub fn getpeername(fd: i32, noalias addr: *sockaddr, noalias len: *socklen_t) usize {
2314pub fn getpeername(fd: fd_t, noalias addr: *sockaddr, noalias len: *socklen_t) usize {
23132315 if (native_arch == .x86) {
2314 return socketcall(SC.getpeername, &[3]usize{ @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(addr), @intFromPtr(len) });
2316 return socketcall(SC.getpeername, &[3]usize{ @as(u32, @bitCast(fd)), @intFromPtr(addr), @intFromPtr(len) });
23152317 }
2316 return syscall3(.getpeername, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(addr), @intFromPtr(len));
2318 return syscall3(.getpeername, @as(u32, @bitCast(fd)), @intFromPtr(addr), @intFromPtr(len));
23172319}
23182320
23192321pub fn socket(domain: u32, socket_type: u32, protocol: u32) usize {
......@@ -2323,58 +2325,52 @@ pub fn socket(domain: u32, socket_type: u32, protocol: u32) usize {
23232325 return syscall3(.socket, domain, socket_type, protocol);
23242326}
23252327
2326pub fn setsockopt(fd: i32, level: i32, optname: u32, optval: [*]const u8, optlen: socklen_t) usize {
2328pub fn setsockopt(fd: fd_t, level: i32, optname: u32, optval: [*]const u8, optlen: socklen_t) usize {
23272329 if (native_arch == .x86) {
2328 return socketcall(SC.setsockopt, &[5]usize{ @as(usize, @bitCast(@as(isize, fd))), @as(usize, @bitCast(@as(isize, level))), optname, @intFromPtr(optval), @as(usize, @intCast(optlen)) });
2330 return socketcall(SC.setsockopt, &[5]usize{ @as(u32, @bitCast(fd)), @as(usize, @bitCast(@as(isize, level))), optname, @intFromPtr(optval), @as(usize, @intCast(optlen)) });
23292331 }
2330 return syscall5(.setsockopt, @as(usize, @bitCast(@as(isize, fd))), @as(usize, @bitCast(@as(isize, level))), optname, @intFromPtr(optval), @as(usize, @intCast(optlen)));
2332 return syscall5(.setsockopt, @as(u32, @bitCast(fd)), @as(usize, @bitCast(@as(isize, level))), optname, @intFromPtr(optval), @as(usize, @intCast(optlen)));
23312333}
23322334
2333pub fn getsockopt(fd: i32, level: i32, optname: u32, noalias optval: [*]u8, noalias optlen: *socklen_t) usize {
2335pub fn getsockopt(fd: fd_t, level: i32, optname: u32, noalias optval: [*]u8, noalias optlen: *socklen_t) usize {
23342336 if (native_arch == .x86) {
2335 return socketcall(SC.getsockopt, &[5]usize{ @as(usize, @bitCast(@as(isize, fd))), @as(usize, @bitCast(@as(isize, level))), optname, @intFromPtr(optval), @intFromPtr(optlen) });
2337 return socketcall(SC.getsockopt, &[5]usize{ @as(u32, @bitCast(fd)), @as(usize, @bitCast(@as(isize, level))), optname, @intFromPtr(optval), @intFromPtr(optlen) });
23362338 }
2337 return syscall5(.getsockopt, @as(usize, @bitCast(@as(isize, fd))), @as(usize, @bitCast(@as(isize, level))), optname, @intFromPtr(optval), @intFromPtr(optlen));
2339 return syscall5(.getsockopt, @as(u32, @bitCast(fd)), @as(usize, @bitCast(@as(isize, level))), optname, @intFromPtr(optval), @intFromPtr(optlen));
23382340}
23392341
2340pub fn sendmsg(fd: i32, msg: *const msghdr_const, flags: u32) usize {
2341 const fd_usize = @as(usize, @bitCast(@as(isize, fd)));
2342 const msg_usize = @intFromPtr(msg);
2342pub fn sendmsg(fd: fd_t, msg: *const msghdr_const, flags: u32) usize {
23432343 if (native_arch == .x86) {
2344 return socketcall(SC.sendmsg, &[3]usize{ fd_usize, msg_usize, flags });
2344 return socketcall(SC.sendmsg, &[3]usize{ @as(u32, @bitCast(fd)), @intFromPtr(msg), flags });
23452345 } else {
2346 return syscall3(.sendmsg, fd_usize, msg_usize, flags);
2346 return syscall3(.sendmsg, @as(u32, @bitCast(fd)), @intFromPtr(msg), flags);
23472347 }
23482348}
23492349
2350pub fn sendmmsg(fd: i32, msgvec: [*]mmsghdr, vlen: u32, flags: u32) usize {
2351 return syscall4(.sendmmsg, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(msgvec), vlen, flags);
2350pub fn sendmmsg(fd: fd_t, msgvec: [*]mmsghdr, vlen: u32, flags: u32) usize {
2351 return syscall4(.sendmmsg, @as(u32, @bitCast(fd)), @intFromPtr(msgvec), vlen, flags);
23522352}
23532353
2354pub fn connect(fd: i32, addr: *const anyopaque, len: socklen_t) usize {
2355 const fd_usize = @as(usize, @bitCast(@as(isize, fd)));
2356 const addr_usize = @intFromPtr(addr);
2354pub fn connect(fd: fd_t, addr: *const anyopaque, len: socklen_t) usize {
23572355 if (native_arch == .x86) {
2358 return socketcall(SC.connect, &[3]usize{ fd_usize, addr_usize, len });
2356 return socketcall(SC.connect, &[3]usize{ @as(u32, @bitCast(fd)), @intFromPtr(addr), len });
23592357 } else {
2360 return syscall3(.connect, fd_usize, addr_usize, len);
2358 return syscall3(.connect, @as(u32, @bitCast(fd)), @intFromPtr(addr), len);
23612359 }
23622360}
23632361
2364pub fn recvmsg(fd: i32, msg: *msghdr, flags: u32) usize {
2365 const fd_usize = @as(usize, @bitCast(@as(isize, fd)));
2366 const msg_usize = @intFromPtr(msg);
2362pub fn recvmsg(fd: fd_t, msg: *msghdr, flags: u32) usize {
23672363 if (native_arch == .x86) {
2368 return socketcall(SC.recvmsg, &[3]usize{ fd_usize, msg_usize, flags });
2364 return socketcall(SC.recvmsg, &[3]usize{ @as(u32, @bitCast(fd)), @intFromPtr(msg), flags });
23692365 } else {
2370 return syscall3(.recvmsg, fd_usize, msg_usize, flags);
2366 return syscall3(.recvmsg, @as(u32, @bitCast(fd)), @intFromPtr(msg), flags);
23712367 }
23722368}
23732369
2374pub fn recvmmsg(fd: i32, msgvec: ?[*]mmsghdr, vlen: u32, flags: u32, timeout: ?*timespec) usize {
2370pub fn recvmmsg(fd: fd_t, msgvec: ?[*]mmsghdr, vlen: u32, flags: u32, timeout: ?*timespec) usize {
23752371 return syscall5(
23762372 if (@hasField(SYS, "recvmmsg") and native_arch != .hexagon) .recvmmsg else .recvmmsg_time64,
2377 @as(usize, @bitCast(@as(isize, fd))),
2373 @as(u32, @bitCast(fd)),
23782374 @intFromPtr(msgvec),
23792375 vlen,
23802376 flags,
......@@ -2383,43 +2379,39 @@ pub fn recvmmsg(fd: i32, msgvec: ?[*]mmsghdr, vlen: u32, flags: u32, timeout: ?*
23832379}
23842380
23852381pub fn recvfrom(
2386 fd: i32,
2382 fd: fd_t,
23872383 noalias buf: [*]u8,
23882384 len: usize,
23892385 flags: u32,
23902386 noalias addr: ?*sockaddr,
23912387 noalias alen: ?*socklen_t,
23922388) usize {
2393 const fd_usize = @as(usize, @bitCast(@as(isize, fd)));
2394 const buf_usize = @intFromPtr(buf);
2395 const addr_usize = @intFromPtr(addr);
2396 const alen_usize = @intFromPtr(alen);
23972389 if (native_arch == .x86) {
2398 return socketcall(SC.recvfrom, &[6]usize{ fd_usize, buf_usize, len, flags, addr_usize, alen_usize });
2390 return socketcall(SC.recvfrom, &[6]usize{ @as(u32, @bitCast(fd)), @intFromPtr(buf), len, flags, @intFromPtr(addr), @intFromPtr(alen) });
23992391 } else {
2400 return syscall6(.recvfrom, fd_usize, buf_usize, len, flags, addr_usize, alen_usize);
2392 return syscall6(.recvfrom, @as(u32, @bitCast(fd)), @intFromPtr(buf), len, flags, @intFromPtr(addr), @intFromPtr(alen));
24012393 }
24022394}
24032395
2404pub fn shutdown(fd: i32, how: i32) usize {
2396pub fn shutdown(fd: fd_t, how: i32) usize {
24052397 if (native_arch == .x86) {
2406 return socketcall(SC.shutdown, &[2]usize{ @as(usize, @bitCast(@as(isize, fd))), @as(usize, @bitCast(@as(isize, how))) });
2398 return socketcall(SC.shutdown, &[2]usize{ @as(u32, @bitCast(fd)), @as(u32, @bitCast(how)) });
24072399 }
2408 return syscall2(.shutdown, @as(usize, @bitCast(@as(isize, fd))), @as(usize, @bitCast(@as(isize, how))));
2400 return syscall2(.shutdown, @as(u32, @bitCast(fd)), @as(u32, @bitCast(how)));
24092401}
24102402
2411pub fn bind(fd: i32, addr: *const sockaddr, len: socklen_t) usize {
2403pub fn bind(fd: fd_t, addr: *const sockaddr, len: socklen_t) usize {
24122404 if (native_arch == .x86) {
2413 return socketcall(SC.bind, &[3]usize{ @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(addr), @as(usize, @intCast(len)) });
2405 return socketcall(SC.bind, &[3]usize{ @as(u32, @bitCast(fd)), @intFromPtr(addr), len });
24142406 }
2415 return syscall3(.bind, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(addr), @as(usize, @intCast(len)));
2407 return syscall3(.bind, @as(u32, @bitCast(fd)), @intFromPtr(addr), len);
24162408}
24172409
2418pub fn listen(fd: i32, backlog: u32) usize {
2410pub fn listen(fd: fd_t, backlog: u32) usize {
24192411 if (native_arch == .x86) {
2420 return socketcall(SC.listen, &[2]usize{ @as(usize, @bitCast(@as(isize, fd))), backlog });
2412 return socketcall(SC.listen, &[2]usize{ @as(u32, @bitCast(fd)), backlog });
24212413 }
2422 return syscall2(.listen, @as(usize, @bitCast(@as(isize, fd))), backlog);
2414 return syscall2(.listen, @as(u32, @bitCast(fd)), backlog);
24232415}
24242416
24252417pub fn sendto(fd: i32, buf: [*]const u8, len: usize, flags: u32, addr: ?*const sockaddr, alen: socklen_t) usize {
......@@ -2429,51 +2421,41 @@ pub fn sendto(fd: i32, buf: [*]const u8, len: usize, flags: u32, addr: ?*const s
24292421 return syscall6(.sendto, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(buf), len, flags, @intFromPtr(addr), @as(usize, @intCast(alen)));
24302422}
24312423
2432pub fn sendfile(outfd: i32, infd: i32, offset: ?*i64, count: usize) usize {
2433 if (@hasField(SYS, "sendfile64")) {
2434 return syscall4(
2435 .sendfile64,
2436 @as(usize, @bitCast(@as(isize, outfd))),
2437 @as(usize, @bitCast(@as(isize, infd))),
2438 @intFromPtr(offset),
2439 count,
2440 );
2441 } else {
2442 return syscall4(
2443 .sendfile,
2444 @as(usize, @bitCast(@as(isize, outfd))),
2445 @as(usize, @bitCast(@as(isize, infd))),
2446 @intFromPtr(offset),
2447 count,
2448 );
2449 }
2424pub fn sendfile(outfd: fd_t, infd: fd_t, offset: ?*off_t, count: usize) usize {
2425 return syscall4(
2426 if (@hasField(SYS, "sendfile64")) .sendfile64 else .sendfile,
2427 @as(u32, @bitCast(outfd)),
2428 @as(u32, @bitCast(infd)),
2429 @intFromPtr(offset),
2430 count,
2431 );
24502432}
24512433
2452pub fn socketpair(domain: u32, socket_type: u32, protocol: u32, fd: *[2]i32) usize {
2434pub fn socketpair(domain: u32, socket_type: u32, protocol: u32, fd: *[2]fd_t) usize {
24532435 if (native_arch == .x86) {
24542436 return socketcall(SC.socketpair, &[4]usize{ domain, socket_type, protocol, @intFromPtr(fd) });
24552437 }
24562438 return syscall4(.socketpair, domain, socket_type, protocol, @intFromPtr(fd));
24572439}
24582440
2459pub fn accept(fd: i32, noalias addr: ?*sockaddr, noalias len: ?*socklen_t) usize {
2441pub fn accept(fd: fd_t, noalias addr: ?*sockaddr, noalias len: ?*socklen_t) usize {
24602442 if (native_arch == .x86) {
2461 return socketcall(SC.accept, &[4]usize{ @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(addr), @intFromPtr(len), 0 });
2443 return socketcall(SC.accept, &[4]usize{ @as(u32, @bitCast(fd)), @intFromPtr(addr), @intFromPtr(len), 0 });
24622444 }
24632445 return accept4(fd, addr, len, 0);
24642446}
24652447
2466pub fn accept4(fd: i32, noalias addr: ?*sockaddr, noalias len: ?*socklen_t, flags: u32) usize {
2448pub fn accept4(fd: fd_t, noalias addr: ?*sockaddr, noalias len: ?*socklen_t, flags: u32) usize {
24672449 if (native_arch == .x86) {
2468 return socketcall(SC.accept4, &[4]usize{ @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(addr), @intFromPtr(len), flags });
2450 return socketcall(SC.accept4, &[4]usize{ @as(u32, @bitCast(fd)), @intFromPtr(addr), @intFromPtr(len), flags });
24692451 }
2470 return syscall4(.accept4, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(addr), @intFromPtr(len), flags);
2452 return syscall4(.accept4, @as(u32, @bitCast(fd)), @intFromPtr(addr), @intFromPtr(len), flags);
24712453}
24722454
2473pub fn statx(dirfd: i32, path: [*:0]const u8, flags: u32, mask: STATX, statx_buf: *Statx) usize {
2455pub fn statx(dirfd: fd_t, path: [*:0]const u8, flags: u32, mask: STATX, statx_buf: *Statx) usize {
24742456 return syscall5(
24752457 .statx,
2476 @as(usize, @bitCast(@as(isize, dirfd))),
2458 @as(u32, @bitCast(dirfd)),
24772459 @intFromPtr(path),
24782460 flags,
24792461 @as(u32, @bitCast(mask)),
......@@ -2490,7 +2472,7 @@ pub fn llistxattr(path: [*:0]const u8, list: [*]u8, size: usize) usize {
24902472}
24912473
24922474pub fn flistxattr(fd: fd_t, list: [*]u8, size: usize) usize {
2493 return syscall3(.flistxattr, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(list), size);
2475 return syscall3(.flistxattr, @as(u32, @bitCast(fd)), @intFromPtr(list), size);
24942476}
24952477
24962478pub fn getxattr(path: [*:0]const u8, name: [*:0]const u8, value: [*]u8, size: usize) usize {
......@@ -2502,7 +2484,7 @@ pub fn lgetxattr(path: [*:0]const u8, name: [*:0]const u8, value: [*]u8, size: u
25022484}
25032485
25042486pub fn fgetxattr(fd: fd_t, name: [*:0]const u8, value: [*]u8, size: usize) usize {
2505 return syscall4(.fgetxattr, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(name), @intFromPtr(value), size);
2487 return syscall4(.fgetxattr, @as(u32, @bitCast(fd)), @intFromPtr(name), @intFromPtr(value), size);
25062488}
25072489
25082490pub fn setxattr(path: [*:0]const u8, name: [*:0]const u8, value: [*]const u8, size: usize, flags: usize) usize {
......@@ -2514,7 +2496,7 @@ pub fn lsetxattr(path: [*:0]const u8, name: [*:0]const u8, value: [*]const u8, s
25142496}
25152497
25162498pub fn fsetxattr(fd: fd_t, name: [*:0]const u8, value: [*]const u8, size: usize, flags: usize) usize {
2517 return syscall5(.fsetxattr, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(name), @intFromPtr(value), size, flags);
2499 return syscall5(.fsetxattr, @as(u32, @bitCast(fd)), @intFromPtr(name), @intFromPtr(value), size, flags);
25182500}
25192501
25202502pub fn removexattr(path: [*:0]const u8, name: [*:0]const u8) usize {
......@@ -2525,8 +2507,8 @@ pub fn lremovexattr(path: [*:0]const u8, name: [*:0]const u8) usize {
25252507 return syscall2(.lremovexattr, @intFromPtr(path), @intFromPtr(name));
25262508}
25272509
2528pub fn fremovexattr(fd: usize, name: [*:0]const u8) usize {
2529 return syscall2(.fremovexattr, fd, @intFromPtr(name));
2510pub fn fremovexattr(fd: fd_t, name: [*:0]const u8) usize {
2511 return syscall2(.fremovexattr, @as(u32, @bitCast(fd)), @intFromPtr(name));
25302512}
25312513
25322514pub const sched_param = extern struct {
......@@ -2556,27 +2538,27 @@ pub const SCHED = packed struct(i32) {
25562538};
25572539
25582540pub fn sched_setparam(pid: pid_t, param: *const sched_param) usize {
2559 return syscall2(.sched_setparam, @as(usize, @bitCast(@as(isize, pid))), @intFromPtr(param));
2541 return syscall2(.sched_setparam, @as(u32, @bitCast(pid)), @intFromPtr(param));
25602542}
25612543
25622544pub fn sched_getparam(pid: pid_t, param: *sched_param) usize {
2563 return syscall2(.sched_getparam, @as(usize, @bitCast(@as(isize, pid))), @intFromPtr(param));
2545 return syscall2(.sched_getparam, @as(u32, @bitCast(pid)), @intFromPtr(param));
25642546}
25652547
25662548pub fn sched_setscheduler(pid: pid_t, policy: SCHED, param: *const sched_param) usize {
2567 return syscall3(.sched_setscheduler, @as(usize, @bitCast(@as(isize, pid))), @intCast(@as(u32, @bitCast(policy))), @intFromPtr(param));
2549 return syscall3(.sched_setscheduler, @as(u32, @bitCast(pid)), @as(u32, @bitCast(policy)), @intFromPtr(param));
25682550}
25692551
25702552pub fn sched_getscheduler(pid: pid_t) usize {
2571 return syscall1(.sched_getscheduler, @as(usize, @bitCast(@as(isize, pid))));
2553 return syscall1(.sched_getscheduler, @as(u32, @bitCast(pid)));
25722554}
25732555
25742556pub fn sched_get_priority_max(policy: SCHED) usize {
2575 return syscall1(.sched_get_priority_max, @intCast(@as(u32, @bitCast(policy))));
2557 return syscall1(.sched_get_priority_max, @as(u32, @bitCast(policy)));
25762558}
25772559
25782560pub fn sched_get_priority_min(policy: SCHED) usize {
2579 return syscall1(.sched_get_priority_min, @intCast(@as(u32, @bitCast(policy))));
2561 return syscall1(.sched_get_priority_min, @as(u32, @bitCast(policy)));
25802562}
25812563
25822564pub fn getcpu(cpu: ?*usize, node: ?*usize) usize {
......@@ -2595,24 +2577,24 @@ pub const sched_attr = extern struct {
25952577 period: u64 = 0,
25962578};
25972579
2598pub fn sched_setattr(pid: pid_t, attr: *const sched_attr, flags: usize) usize {
2599 return syscall3(.sched_setattr, @as(usize, @bitCast(@as(isize, pid))), @intFromPtr(attr), flags);
2580pub fn sched_setattr(pid: pid_t, attr: *const sched_attr, flags: u32) usize {
2581 return syscall3(.sched_setattr, @as(u32, @bitCast(pid)), @intFromPtr(attr), flags);
26002582}
26012583
2602pub fn sched_getattr(pid: pid_t, attr: *sched_attr, size: usize, flags: usize) usize {
2603 return syscall4(.sched_getattr, @as(usize, @bitCast(@as(isize, pid))), @intFromPtr(attr), size, flags);
2584pub fn sched_getattr(pid: pid_t, attr: *sched_attr, size: u32, flags: u32) usize {
2585 return syscall4(.sched_getattr, @as(u32, @bitCast(pid)), @intFromPtr(attr), size, flags);
26042586}
26052587
26062588pub fn sched_rr_get_interval(pid: pid_t, tp: *timespec) usize {
2607 return syscall2(.sched_rr_get_interval, @as(usize, @bitCast(@as(isize, pid))), @intFromPtr(tp));
2589 return syscall2(.sched_rr_get_interval, @as(u32, @bitCast(pid)), @intFromPtr(tp));
26082590}
26092591
26102592pub fn sched_yield() usize {
26112593 return syscall0(.sched_yield);
26122594}
26132595
2614pub fn sched_getaffinity(pid: pid_t, size: usize, set: *cpu_set_t) usize {
2615 const rc = syscall3(.sched_getaffinity, @as(usize, @bitCast(@as(isize, pid))), size, @intFromPtr(set));
2596pub fn sched_getaffinity(pid: pid_t, size: u32, set: *cpu_set_t) usize {
2597 const rc = syscall3(.sched_getaffinity, @as(u32, @bitCast(pid)), size, @intFromPtr(set));
26162598 if (@as(isize, @bitCast(rc)) < 0) return rc;
26172599 if (rc < size) @memset(@as([*]u8, @ptrCast(set))[rc..size], 0);
26182600 return 0;
......@@ -2620,7 +2602,7 @@ pub fn sched_getaffinity(pid: pid_t, size: usize, set: *cpu_set_t) usize {
26202602
26212603pub fn sched_setaffinity(pid: pid_t, set: *const cpu_set_t) !void {
26222604 const size = @sizeOf(cpu_set_t);
2623 const rc = syscall3(.sched_setaffinity, @as(usize, @bitCast(@as(isize, pid))), size, @intFromPtr(set));
2605 const rc = syscall3(.sched_setaffinity, @as(u32, @bitCast(pid)), size, @intFromPtr(set));
26242606
26252607 switch (errno(rc)) {
26262608 .SUCCESS => return,
......@@ -2632,25 +2614,25 @@ pub fn epoll_create() usize {
26322614 return epoll_create1(0);
26332615}
26342616
2635pub fn epoll_create1(flags: usize) usize {
2617pub fn epoll_create1(flags: u32) usize {
26362618 return syscall1(.epoll_create1, flags);
26372619}
26382620
2639pub fn epoll_ctl(epoll_fd: i32, op: u32, fd: i32, ev: ?*epoll_event) usize {
2640 return syscall4(.epoll_ctl, @as(usize, @bitCast(@as(isize, epoll_fd))), @as(usize, @intCast(op)), @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(ev));
2621pub fn epoll_ctl(epoll_fd: fd_t, op: u32, fd: fd_t, ev: ?*epoll_event) usize {
2622 return syscall4(.epoll_ctl, @as(u32, @bitCast(epoll_fd)), op, @as(u32, @bitCast(fd)), @intFromPtr(ev));
26412623}
26422624
2643pub fn epoll_wait(epoll_fd: i32, events: [*]epoll_event, maxevents: u32, timeout: i32) usize {
2625pub fn epoll_wait(epoll_fd: fd_t, events: [*]epoll_event, maxevents: u32, timeout: i32) usize {
26442626 return epoll_pwait(epoll_fd, events, maxevents, timeout, null);
26452627}
26462628
2647pub fn epoll_pwait(epoll_fd: i32, events: [*]epoll_event, maxevents: u32, timeout: i32, sigmask: ?*const sigset_t) usize {
2629pub fn epoll_pwait(epoll_fd: fd_t, events: [*]epoll_event, maxevents: u32, timeout: i32, sigmask: ?*const sigset_t) usize {
26482630 return syscall6(
26492631 .epoll_pwait,
2650 @as(usize, @bitCast(@as(isize, epoll_fd))),
2632 @as(u32, @bitCast(epoll_fd)),
26512633 @intFromPtr(events),
2652 @as(usize, @intCast(maxevents)),
2653 @as(usize, @bitCast(@as(isize, timeout))),
2634 maxevents,
2635 @as(u32, @bitCast(timeout)),
26542636 @intFromPtr(sigmask),
26552637 NSIG / 8,
26562638 );
......@@ -2673,18 +2655,18 @@ pub const itimerspec = extern struct {
26732655 it_value: timespec,
26742656};
26752657
2676pub fn timerfd_gettime(fd: i32, curr_value: *itimerspec) usize {
2658pub fn timerfd_gettime(fd: fd_t, curr_value: *itimerspec) usize {
26772659 return syscall2(
26782660 if (@hasField(SYS, "timerfd_gettime") and native_arch != .hexagon) .timerfd_gettime else .timerfd_gettime64,
2679 @bitCast(@as(isize, fd)),
2661 @as(u32, @bitCast(fd)),
26802662 @intFromPtr(curr_value),
26812663 );
26822664}
26832665
2684pub fn timerfd_settime(fd: i32, flags: TFD.TIMER, new_value: *const itimerspec, old_value: ?*itimerspec) usize {
2666pub fn timerfd_settime(fd: fd_t, flags: TFD.TIMER, new_value: *const itimerspec, old_value: ?*itimerspec) usize {
26852667 return syscall4(
26862668 if (@hasField(SYS, "timerfd_settime") and native_arch != .hexagon) .timerfd_settime else .timerfd_settime64,
2687 @bitCast(@as(isize, fd)),
2669 @as(u32, @bitCast(fd)),
26882670 @as(u32, @bitCast(flags)),
26892671 @intFromPtr(new_value),
26902672 @intFromPtr(old_value),
......@@ -2699,11 +2681,11 @@ pub const ITIMER = enum(i32) {
26992681};
27002682
27012683pub fn getitimer(which: i32, curr_value: *itimerspec) usize {
2702 return syscall2(.getitimer, @as(usize, @bitCast(@as(isize, which))), @intFromPtr(curr_value));
2684 return syscall2(.getitimer, @as(u32, @bitCast(which)), @intFromPtr(curr_value));
27032685}
27042686
27052687pub fn setitimer(which: i32, new_value: *const itimerspec, old_value: ?*itimerspec) usize {
2706 return syscall3(.setitimer, @as(usize, @bitCast(@as(isize, which))), @intFromPtr(new_value), @intFromPtr(old_value));
2688 return syscall3(.setitimer, @as(u32, @bitCast(which)), @intFromPtr(new_value), @intFromPtr(old_value));
27072689}
27082690
27092691pub fn unshare(flags: usize) usize {
......@@ -2711,7 +2693,7 @@ pub fn unshare(flags: usize) usize {
27112693}
27122694
27132695pub fn setns(fd: fd_t, flags: u32) usize {
2714 return syscall2(.setns, @as(usize, @bitCast(@as(isize, fd))), flags);
2696 return syscall2(.setns, @as(u32, @bitCast(fd)), flags);
27152697}
27162698
27172699pub fn capget(hdrp: *cap_user_header_t, datap: *cap_user_data_t) usize {
......@@ -2734,12 +2716,12 @@ pub fn io_uring_setup(entries: u32, p: *io_uring_params) usize {
27342716 return syscall2(.io_uring_setup, entries, @intFromPtr(p));
27352717}
27362718
2737pub fn io_uring_enter(fd: i32, to_submit: u32, min_complete: u32, flags: u32, sig: ?*sigset_t) usize {
2738 return syscall6(.io_uring_enter, @as(usize, @bitCast(@as(isize, fd))), to_submit, min_complete, flags, @intFromPtr(sig), NSIG / 8);
2719pub fn io_uring_enter(fd: fd_t, to_submit: u32, min_complete: u32, flags: u32, sig: ?*sigset_t) usize {
2720 return syscall6(.io_uring_enter, @as(u32, @bitCast(fd)), to_submit, min_complete, flags, @intFromPtr(sig), NSIG / 8);
27392721}
27402722
2741pub fn io_uring_register(fd: i32, opcode: IORING_REGISTER, arg: ?*const anyopaque, nr_args: u32) usize {
2742 return syscall4(.io_uring_register, @as(usize, @bitCast(@as(isize, fd))), @intFromEnum(opcode), @intFromPtr(arg), nr_args);
2723pub fn io_uring_register(fd: fd_t, opcode: IORING_REGISTER, arg: ?*const anyopaque, nr_args: u32) usize {
2724 return syscall4(.io_uring_register, @as(u32, @bitCast(fd)), @intFromEnum(opcode), @intFromPtr(arg), nr_args);
27432725}
27442726
27452727pub fn memfd_create(name: [*:0]const u8, flags: u32) usize {
......@@ -2747,43 +2729,43 @@ pub fn memfd_create(name: [*:0]const u8, flags: u32) usize {
27472729}
27482730
27492731pub fn getrusage(who: i32, usage: *rusage) usize {
2750 return syscall2(.getrusage, @as(usize, @bitCast(@as(isize, who))), @intFromPtr(usage));
2732 return syscall2(.getrusage, @as(u32, @bitCast(who)), @intFromPtr(usage));
27512733}
27522734
27532735pub fn tcgetattr(fd: fd_t, termios_p: *termios) usize {
2754 return syscall3(.ioctl, @as(usize, @bitCast(@as(isize, fd))), T.CGETS, @intFromPtr(termios_p));
2736 return syscall3(.ioctl, @as(u32, @bitCast(fd)), T.CGETS, @intFromPtr(termios_p));
27552737}
27562738
27572739pub fn tcsetattr(fd: fd_t, optional_action: TCSA, termios_p: *const termios) usize {
2758 return syscall3(.ioctl, @as(usize, @bitCast(@as(isize, fd))), T.CSETS + @intFromEnum(optional_action), @intFromPtr(termios_p));
2740 return syscall3(.ioctl, @as(u32, @bitCast(fd)), T.CSETS + @intFromEnum(optional_action), @intFromPtr(termios_p));
27592741}
27602742
27612743pub fn tcgetpgrp(fd: fd_t, pgrp: *pid_t) usize {
2762 return syscall3(.ioctl, @as(usize, @bitCast(@as(isize, fd))), T.IOCGPGRP, @intFromPtr(pgrp));
2744 return syscall3(.ioctl, @as(u32, @bitCast(fd)), T.IOCGPGRP, @intFromPtr(pgrp));
27632745}
27642746
27652747pub fn tcsetpgrp(fd: fd_t, pgrp: *const pid_t) usize {
2766 return syscall3(.ioctl, @as(usize, @bitCast(@as(isize, fd))), T.IOCSPGRP, @intFromPtr(pgrp));
2748 return syscall3(.ioctl, @as(u32, @bitCast(fd)), T.IOCSPGRP, @intFromPtr(pgrp));
27672749}
27682750
27692751pub fn tcdrain(fd: fd_t) usize {
2770 return syscall3(.ioctl, @as(usize, @bitCast(@as(isize, fd))), T.CSBRK, 1);
2752 return syscall3(.ioctl, @as(u32, @bitCast(fd)), T.CSBRK, 1);
27712753}
27722754
27732755pub fn ioctl(fd: fd_t, request: u32, arg: usize) usize {
2774 return syscall3(.ioctl, @as(usize, @bitCast(@as(isize, fd))), request, arg);
2756 return syscall3(.ioctl, @as(u32, @bitCast(fd)), request, arg);
27752757}
27762758
27772759pub fn signalfd(fd: fd_t, mask: *const sigset_t, flags: u32) usize {
2778 return syscall4(.signalfd4, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(mask), NSIG / 8, flags);
2760 return syscall4(.signalfd4, @as(u32, @bitCast(fd)), @intFromPtr(mask), NSIG / 8, flags);
27792761}
27802762
2781pub fn copy_file_range(fd_in: fd_t, off_in: ?*i64, fd_out: fd_t, off_out: ?*i64, len: usize, flags: u32) usize {
2763pub fn copy_file_range(fd_in: fd_t, off_in: ?*off_t, fd_out: fd_t, off_out: ?*off_t, len: usize, flags: u32) usize {
27822764 return syscall6(
27832765 .copy_file_range,
2784 @as(usize, @bitCast(@as(isize, fd_in))),
2766 @as(u32, @bitCast(fd_in)),
27852767 @intFromPtr(off_in),
2786 @as(usize, @bitCast(@as(isize, fd_out))),
2768 @as(u32, @bitCast(fd_out)),
27872769 @intFromPtr(off_out),
27882770 len,
27892771 flags,
......@@ -2799,19 +2781,19 @@ pub fn sync() void {
27992781}
28002782
28012783pub fn syncfs(fd: fd_t) usize {
2802 return syscall1(.syncfs, @as(usize, @bitCast(@as(isize, fd))));
2784 return syscall1(.syncfs, @as(u32, @bitCast(fd)));
28032785}
28042786
28052787pub fn fsync(fd: fd_t) usize {
2806 return syscall1(.fsync, @as(usize, @bitCast(@as(isize, fd))));
2788 return syscall1(.fsync, @as(u32, @bitCast(fd)));
28072789}
28082790
28092791pub fn fdatasync(fd: fd_t) usize {
2810 return syscall1(.fdatasync, @as(usize, @bitCast(@as(isize, fd))));
2792 return syscall1(.fdatasync, @as(u32, @bitCast(fd)));
28112793}
28122794
28132795pub fn prctl(option: i32, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
2814 return syscall5(.prctl, @as(usize, @bitCast(@as(isize, option))), arg2, arg3, arg4, arg5);
2796 return syscall5(.prctl, @as(u32, @bitCast(option)), arg2, arg3, arg4, arg5);
28152797}
28162798
28172799pub fn getrlimit(resource: rlimit_resource, rlim: *rlimit) usize {
......@@ -2827,8 +2809,8 @@ pub fn setrlimit(resource: rlimit_resource, rlim: *const rlimit) usize {
28272809pub fn prlimit(pid: pid_t, resource: rlimit_resource, new_limit: ?*const rlimit, old_limit: ?*rlimit) usize {
28282810 return syscall4(
28292811 .prlimit64,
2830 @as(usize, @bitCast(@as(isize, pid))),
2831 @as(usize, @bitCast(@as(isize, @intFromEnum(resource)))),
2812 @as(u32, @bitCast(pid)),
2813 @as(u32, @bitCast(@as(i32, @intFromEnum(resource)))),
28322814 @intFromPtr(new_limit),
28332815 @intFromPtr(old_limit),
28342816 );
......@@ -2843,14 +2825,14 @@ pub fn madvise(address: [*]u8, len: usize, advice: u32) usize {
28432825}
28442826
28452827pub fn pidfd_open(pid: pid_t, flags: u32) usize {
2846 return syscall2(.pidfd_open, @as(usize, @bitCast(@as(isize, pid))), flags);
2828 return syscall2(.pidfd_open, @as(u32, @bitCast(pid)), flags);
28472829}
28482830
28492831pub fn pidfd_getfd(pidfd: fd_t, targetfd: fd_t, flags: u32) usize {
28502832 return syscall3(
28512833 .pidfd_getfd,
2852 @as(usize, @bitCast(@as(isize, pidfd))),
2853 @as(usize, @bitCast(@as(isize, targetfd))),
2834 @as(u32, @bitCast(pidfd)),
2835 @as(u32, @bitCast(targetfd)),
28542836 flags,
28552837 );
28562838}
......@@ -2858,7 +2840,7 @@ pub fn pidfd_getfd(pidfd: fd_t, targetfd: fd_t, flags: u32) usize {
28582840pub fn pidfd_send_signal(pidfd: fd_t, sig: SIG, info: ?*siginfo_t, flags: u32) usize {
28592841 return syscall4(
28602842 .pidfd_send_signal,
2861 @as(usize, @bitCast(@as(isize, pidfd))),
2843 @as(u32, @bitCast(pidfd)),
28622844 @intFromEnum(sig),
28632845 @intFromPtr(info),
28642846 flags,
......@@ -2868,7 +2850,7 @@ pub fn pidfd_send_signal(pidfd: fd_t, sig: SIG, info: ?*siginfo_t, flags: u32) u
28682850pub fn process_vm_readv(pid: pid_t, local: []const iovec, remote: []const iovec_const, flags: usize) usize {
28692851 return syscall6(
28702852 .process_vm_readv,
2871 @as(usize, @bitCast(@as(isize, pid))),
2853 @as(u32, @bitCast(pid)),
28722854 @intFromPtr(local.ptr),
28732855 local.len,
28742856 @intFromPtr(remote.ptr),
......@@ -2880,7 +2862,7 @@ pub fn process_vm_readv(pid: pid_t, local: []const iovec, remote: []const iovec_
28802862pub fn process_vm_writev(pid: pid_t, local: []const iovec_const, remote: []const iovec_const, flags: usize) usize {
28812863 return syscall6(
28822864 .process_vm_writev,
2883 @as(usize, @bitCast(@as(isize, pid))),
2865 @as(u32, @bitCast(pid)),
28842866 @intFromPtr(local.ptr),
28852867 local.len,
28862868 @intFromPtr(remote.ptr),
......@@ -2890,50 +2872,43 @@ pub fn process_vm_writev(pid: pid_t, local: []const iovec_const, remote: []const
28902872}
28912873
28922874pub fn fadvise(fd: fd_t, offset: i64, len: i64, advice: usize) usize {
2893 if (comptime native_arch.isArm() or native_arch == .hexagon or native_arch.isPowerPC32()) {
2894 // These architectures reorder the arguments so that a register is not skipped to align the
2895 // register number that `offset` is passed in.
2875 if (native_arch.isMIPS32()) {
2876 // MIPS O32 weirdly differs from the other architectures that require
2877 // aligned register pairs for this specific syscall.
28962878
28972879 const offset_halves = splitValue64(offset);
28982880 const length_halves = splitValue64(len);
28992881
2900 return syscall6(
2901 .fadvise64_64,
2902 @as(usize, @bitCast(@as(isize, fd))),
2903 advice,
2882 return syscall7(
2883 .fadvise64,
2884 @as(u32, @bitCast(fd)),
2885 0,
29042886 offset_halves[0],
29052887 offset_halves[1],
29062888 length_halves[0],
29072889 length_halves[1],
2890 advice,
29082891 );
2909 } else if (native_arch.isMIPS32()) {
2910 // MIPS O32 does not deal with the register alignment issue, so pass a dummy value.
2911
2892 } else if (require_aligned_register_pair) {
29122893 const offset_halves = splitValue64(offset);
29132894 const length_halves = splitValue64(len);
29142895
2915 return syscall7(
2916 .fadvise64,
2917 @as(usize, @bitCast(@as(isize, fd))),
2918 0,
2896 return syscall6(
2897 .fadvise64_64,
2898 @as(u32, @bitCast(fd)),
2899 advice,
29192900 offset_halves[0],
29202901 offset_halves[1],
29212902 length_halves[0],
29222903 length_halves[1],
2923 advice,
29242904 );
2925 } else if (comptime usize_bits < 64) {
2926 // Other 32-bit architectures do not require register alignment.
2927
2905 } else if (@sizeOf(syscall_arg_t) < @sizeOf(u64)) {
29282906 const offset_halves = splitValue64(offset);
29292907 const length_halves = splitValue64(len);
29302908
29312909 return syscall6(
2932 switch (builtin.abi) {
2933 .gnuabin32, .gnux32, .muslabin32, .muslx32 => .fadvise64,
2934 else => .fadvise64_64,
2935 },
2936 @as(usize, @bitCast(@as(isize, fd))),
2910 .fadvise64_64,
2911 @as(u32, @bitCast(fd)),
29372912 offset_halves[0],
29382913 offset_halves[1],
29392914 length_halves[0],
......@@ -2941,14 +2916,11 @@ pub fn fadvise(fd: fd_t, offset: i64, len: i64, advice: usize) usize {
29412916 advice,
29422917 );
29432918 } else {
2944 // On 64-bit architectures, fadvise64_64 and fadvise64 are the same. Generally, older ports
2945 // call it fadvise64 (x86, PowerPC, etc), while newer ports call it fadvise64_64 (RISC-V,
2946 // LoongArch, etc). SPARC is the odd one out because it has both.
29472919 return syscall4(
2948 if (@hasField(SYS, "fadvise64_64")) .fadvise64_64 else .fadvise64,
2949 @as(usize, @bitCast(@as(isize, fd))),
2950 @as(usize, @bitCast(offset)),
2951 @as(usize, @bitCast(len)),
2920 .fadvise64,
2921 @as(u32, @bitCast(fd)),
2922 @as(u64, @bitCast(offset)),
2923 @as(u64, @bitCast(len)),
29522924 advice,
29532925 );
29542926 }
......@@ -2964,9 +2936,9 @@ pub fn perf_event_open(
29642936 return syscall5(
29652937 .perf_event_open,
29662938 @intFromPtr(attr),
2967 @as(usize, @bitCast(@as(isize, pid))),
2968 @as(usize, @bitCast(@as(isize, cpu))),
2969 @as(usize, @bitCast(@as(isize, group_fd))),
2939 @as(u32, @bitCast(pid)),
2940 @as(u32, @bitCast(cpu)),
2941 @as(u32, @bitCast(group_fd)),
29702942 flags,
29712943 );
29722944}
......@@ -2985,7 +2957,7 @@ pub fn ptrace(
29852957 return syscall5(
29862958 .ptrace,
29872959 req,
2988 @as(usize, @bitCast(@as(isize, pid))),
2960 @as(u32, @bitCast(pid)),
29892961 addr,
29902962 data,
29912963 addr2,
......@@ -3007,14 +2979,14 @@ pub fn cachestat(
30072979) usize {
30082980 return syscall4(
30092981 .cachestat,
3010 @as(usize, @bitCast(@as(isize, fd))),
2982 @as(u32, @bitCast(fd)),
30112983 @intFromPtr(cstat_range),
30122984 @intFromPtr(cstat),
30132985 flags,
30142986 );
30152987}
30162988
3017pub fn map_shadow_stack(addr: u64, size: u64, flags: u32) usize {
2989pub fn map_shadow_stack(addr: usize, size: usize, flags: u32) usize {
30182990 return syscall3(.map_shadow_stack, addr, size, flags);
30192991}
30202992
......@@ -3678,13 +3650,6 @@ pub const E = switch (native_arch) {
36783650 },
36793651};
36803652
3681pub const pid_t = i32;
3682pub const fd_t = i32;
3683pub const socket_t = i32;
3684pub const uid_t = u32;
3685pub const gid_t = u32;
3686pub const clock_t = isize;
3687
36883653pub const NAME_MAX = 255;
36893654pub const PATH_MAX = 4096;
36903655pub const IOV_MAX = 1024;
......@@ -10176,7 +10141,3 @@ pub const cmsghdr = extern struct {
1017610141 level: i32,
1017710142 type: i32,
1017810143};
10179
10180inline fn fd_to_usize(fd: fd_t) usize {
10181 return @as(usize, @bitCast(@as(isize, fd)));
10182}
lib/std/os/linux/aarch64.zig+41-12
......@@ -2,14 +2,21 @@ const builtin = @import("builtin");
22const std = @import("../../std.zig");
33const SYS = std.os.linux.SYS;
44
5pub fn syscall0(number: SYS) u64 {
5pub const syscall_arg_t = u64;
6
7pub fn syscall0(
8 number: SYS,
9) u64 {
610 return asm volatile ("svc #0"
711 : [ret] "={x0}" (-> u64),
812 : [number] "{x8}" (@intFromEnum(number)),
913 : .{ .memory = true });
1014}
1115
12pub fn syscall1(number: SYS, arg1: u64) u64 {
16pub fn syscall1(
17 number: SYS,
18 arg1: syscall_arg_t,
19) u64 {
1320 return asm volatile ("svc #0"
1421 : [ret] "={x0}" (-> u64),
1522 : [number] "{x8}" (@intFromEnum(number)),
......@@ -17,7 +24,11 @@ pub fn syscall1(number: SYS, arg1: u64) u64 {
1724 : .{ .memory = true });
1825}
1926
20pub fn syscall2(number: SYS, arg1: u64, arg2: u64) u64 {
27pub fn syscall2(
28 number: SYS,
29 arg1: syscall_arg_t,
30 arg2: syscall_arg_t,
31) u64 {
2132 return asm volatile ("svc #0"
2233 : [ret] "={x0}" (-> u64),
2334 : [number] "{x8}" (@intFromEnum(number)),
......@@ -26,7 +37,12 @@ pub fn syscall2(number: SYS, arg1: u64, arg2: u64) u64 {
2637 : .{ .memory = true });
2738}
2839
29pub fn syscall3(number: SYS, arg1: u64, arg2: u64, arg3: u64) u64 {
40pub fn syscall3(
41 number: SYS,
42 arg1: syscall_arg_t,
43 arg2: syscall_arg_t,
44 arg3: syscall_arg_t,
45) u64 {
3046 return asm volatile ("svc #0"
3147 : [ret] "={x0}" (-> u64),
3248 : [number] "{x8}" (@intFromEnum(number)),
......@@ -36,7 +52,13 @@ pub fn syscall3(number: SYS, arg1: u64, arg2: u64, arg3: u64) u64 {
3652 : .{ .memory = true });
3753}
3854
39pub fn syscall4(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64) u64 {
55pub fn syscall4(
56 number: SYS,
57 arg1: syscall_arg_t,
58 arg2: syscall_arg_t,
59 arg3: syscall_arg_t,
60 arg4: syscall_arg_t,
61) u64 {
4062 return asm volatile ("svc #0"
4163 : [ret] "={x0}" (-> u64),
4264 : [number] "{x8}" (@intFromEnum(number)),
......@@ -47,7 +69,14 @@ pub fn syscall4(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64) u64 {
4769 : .{ .memory = true });
4870}
4971
50pub fn syscall5(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64, arg5: u64) u64 {
72pub fn syscall5(
73 number: SYS,
74 arg1: syscall_arg_t,
75 arg2: syscall_arg_t,
76 arg3: syscall_arg_t,
77 arg4: syscall_arg_t,
78 arg5: syscall_arg_t,
79) u64 {
5180 return asm volatile ("svc #0"
5281 : [ret] "={x0}" (-> u64),
5382 : [number] "{x8}" (@intFromEnum(number)),
......@@ -61,12 +90,12 @@ pub fn syscall5(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64, arg5: u
6190
6291pub fn syscall6(
6392 number: SYS,
64 arg1: u64,
65 arg2: u64,
66 arg3: u64,
67 arg4: u64,
68 arg5: u64,
69 arg6: u64,
93 arg1: syscall_arg_t,
94 arg2: syscall_arg_t,
95 arg3: syscall_arg_t,
96 arg4: syscall_arg_t,
97 arg5: syscall_arg_t,
98 arg6: syscall_arg_t,
7099) u64 {
71100 return asm volatile ("svc #0"
72101 : [ret] "={x0}" (-> u64),
lib/std/os/linux/arc.zig+41-12
......@@ -2,14 +2,21 @@ const builtin = @import("builtin");
22const std = @import("../../std.zig");
33const SYS = std.os.linux.SYS;
44
5pub fn syscall0(number: SYS) u32 {
5pub const syscall_arg_t = u32;
6
7pub fn syscall0(
8 number: SYS,
9) u32 {
610 return asm volatile ("trap_s 0"
711 : [ret] "={r0}" (-> u32),
812 : [number] "{r8}" (@intFromEnum(number)),
913 : .{ .memory = true });
1014}
1115
12pub fn syscall1(number: SYS, arg1: u32) u32 {
16pub fn syscall1(
17 number: SYS,
18 arg1: syscall_arg_t,
19) u32 {
1320 return asm volatile ("trap_s 0"
1421 : [ret] "={r0}" (-> u32),
1522 : [number] "{r8}" (@intFromEnum(number)),
......@@ -17,7 +24,11 @@ pub fn syscall1(number: SYS, arg1: u32) u32 {
1724 : .{ .memory = true });
1825}
1926
20pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {
27pub fn syscall2(
28 number: SYS,
29 arg1: syscall_arg_t,
30 arg2: syscall_arg_t,
31) u32 {
2132 return asm volatile ("trap_s 0"
2233 : [ret] "={r0}" (-> u32),
2334 : [number] "{r8}" (@intFromEnum(number)),
......@@ -26,7 +37,12 @@ pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {
2637 : .{ .memory = true });
2738}
2839
29pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {
40pub fn syscall3(
41 number: SYS,
42 arg1: syscall_arg_t,
43 arg2: syscall_arg_t,
44 arg3: syscall_arg_t,
45) u32 {
3046 return asm volatile ("trap_s 0"
3147 : [ret] "={r0}" (-> u32),
3248 : [number] "{r8}" (@intFromEnum(number)),
......@@ -36,7 +52,13 @@ pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {
3652 : .{ .memory = true });
3753}
3854
39pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {
55pub fn syscall4(
56 number: SYS,
57 arg1: syscall_arg_t,
58 arg2: syscall_arg_t,
59 arg3: syscall_arg_t,
60 arg4: syscall_arg_t,
61) u32 {
4062 return asm volatile ("trap_s 0"
4163 : [ret] "={r0}" (-> u32),
4264 : [number] "{r8}" (@intFromEnum(number)),
......@@ -47,7 +69,14 @@ pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {
4769 : .{ .memory = true });
4870}
4971
50pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u32) u32 {
72pub fn syscall5(
73 number: SYS,
74 arg1: syscall_arg_t,
75 arg2: syscall_arg_t,
76 arg3: syscall_arg_t,
77 arg4: syscall_arg_t,
78 arg5: syscall_arg_t,
79) u32 {
5180 return asm volatile ("trap_s 0"
5281 : [ret] "={r0}" (-> u32),
5382 : [number] "{r8}" (@intFromEnum(number)),
......@@ -61,12 +90,12 @@ pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u
6190
6291pub fn syscall6(
6392 number: SYS,
64 arg1: u32,
65 arg2: u32,
66 arg3: u32,
67 arg4: u32,
68 arg5: u32,
69 arg6: u32,
93 arg1: syscall_arg_t,
94 arg2: syscall_arg_t,
95 arg3: syscall_arg_t,
96 arg4: syscall_arg_t,
97 arg5: syscall_arg_t,
98 arg6: syscall_arg_t,
7099) u32 {
71100 return asm volatile ("trap_s 0"
72101 : [ret] "={r0}" (-> u32),
lib/std/os/linux/arm.zig+41-12
......@@ -2,14 +2,21 @@ const builtin = @import("builtin");
22const std = @import("../../std.zig");
33const SYS = std.os.linux.SYS;
44
5pub fn syscall0(number: SYS) u32 {
5pub const syscall_arg_t = u32;
6
7pub fn syscall0(
8 number: SYS,
9) u32 {
610 return asm volatile ("svc #0"
711 : [ret] "={r0}" (-> u32),
812 : [number] "{r7}" (@intFromEnum(number)),
913 : .{ .memory = true });
1014}
1115
12pub fn syscall1(number: SYS, arg1: u32) u32 {
16pub fn syscall1(
17 number: SYS,
18 arg1: syscall_arg_t,
19) u32 {
1320 return asm volatile ("svc #0"
1421 : [ret] "={r0}" (-> u32),
1522 : [number] "{r7}" (@intFromEnum(number)),
......@@ -17,7 +24,11 @@ pub fn syscall1(number: SYS, arg1: u32) u32 {
1724 : .{ .memory = true });
1825}
1926
20pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {
27pub fn syscall2(
28 number: SYS,
29 arg1: syscall_arg_t,
30 arg2: syscall_arg_t,
31) u32 {
2132 return asm volatile ("svc #0"
2233 : [ret] "={r0}" (-> u32),
2334 : [number] "{r7}" (@intFromEnum(number)),
......@@ -26,7 +37,12 @@ pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {
2637 : .{ .memory = true });
2738}
2839
29pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {
40pub fn syscall3(
41 number: SYS,
42 arg1: syscall_arg_t,
43 arg2: syscall_arg_t,
44 arg3: syscall_arg_t,
45) u32 {
3046 return asm volatile ("svc #0"
3147 : [ret] "={r0}" (-> u32),
3248 : [number] "{r7}" (@intFromEnum(number)),
......@@ -36,7 +52,13 @@ pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {
3652 : .{ .memory = true });
3753}
3854
39pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {
55pub fn syscall4(
56 number: SYS,
57 arg1: syscall_arg_t,
58 arg2: syscall_arg_t,
59 arg3: syscall_arg_t,
60 arg4: syscall_arg_t,
61) u32 {
4062 return asm volatile ("svc #0"
4163 : [ret] "={r0}" (-> u32),
4264 : [number] "{r7}" (@intFromEnum(number)),
......@@ -47,7 +69,14 @@ pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {
4769 : .{ .memory = true });
4870}
4971
50pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u32) u32 {
72pub fn syscall5(
73 number: SYS,
74 arg1: syscall_arg_t,
75 arg2: syscall_arg_t,
76 arg3: syscall_arg_t,
77 arg4: syscall_arg_t,
78 arg5: syscall_arg_t,
79) u32 {
5180 return asm volatile ("svc #0"
5281 : [ret] "={r0}" (-> u32),
5382 : [number] "{r7}" (@intFromEnum(number)),
......@@ -61,12 +90,12 @@ pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u
6190
6291pub fn syscall6(
6392 number: SYS,
64 arg1: u32,
65 arg2: u32,
66 arg3: u32,
67 arg4: u32,
68 arg5: u32,
69 arg6: u32,
93 arg1: syscall_arg_t,
94 arg2: syscall_arg_t,
95 arg3: syscall_arg_t,
96 arg4: syscall_arg_t,
97 arg5: syscall_arg_t,
98 arg6: syscall_arg_t,
7099) u32 {
71100 return asm volatile ("svc #0"
72101 : [ret] "={r0}" (-> u32),
lib/std/os/linux/hexagon.zig+33-11
......@@ -2,14 +2,21 @@ const builtin = @import("builtin");
22const std = @import("../../std.zig");
33const SYS = std.os.linux.SYS;
44
5pub fn syscall0(number: SYS) u32 {
5pub const syscall_arg_t = u32;
6
7pub fn syscall0(
8 number: SYS,
9) u32 {
610 return asm volatile ("trap0(#1)"
711 : [ret] "={r0}" (-> u32),
812 : [number] "{r6}" (@intFromEnum(number)),
913 : .{ .memory = true });
1014}
1115
12pub fn syscall1(number: SYS, arg1: u32) u32 {
16pub fn syscall1(
17 number: SYS,
18 arg1: syscall_arg_t,
19) u32 {
1320 return asm volatile ("trap0(#1)"
1421 : [ret] "={r0}" (-> u32),
1522 : [number] "{r6}" (@intFromEnum(number)),
......@@ -17,7 +24,11 @@ pub fn syscall1(number: SYS, arg1: u32) u32 {
1724 : .{ .memory = true });
1825}
1926
20pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {
27pub fn syscall2(
28 number: SYS,
29 arg1: syscall_arg_t,
30 arg2: syscall_arg_t,
31) u32 {
2132 return asm volatile ("trap0(#1)"
2233 : [ret] "={r0}" (-> u32),
2334 : [number] "{r6}" (@intFromEnum(number)),
......@@ -26,7 +37,12 @@ pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {
2637 : .{ .memory = true });
2738}
2839
29pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {
40pub fn syscall3(
41 number: SYS,
42 arg1: syscall_arg_t,
43 arg2: syscall_arg_t,
44 arg3: syscall_arg_t,
45) u32 {
3046 return asm volatile ("trap0(#1)"
3147 : [ret] "={r0}" (-> u32),
3248 : [number] "{r6}" (@intFromEnum(number)),
......@@ -36,7 +52,13 @@ pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {
3652 : .{ .memory = true });
3753}
3854
39pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {
55pub fn syscall4(
56 number: SYS,
57 arg1: syscall_arg_t,
58 arg2: syscall_arg_t,
59 arg3: syscall_arg_t,
60 arg4: syscall_arg_t,
61) u32 {
4062 return asm volatile ("trap0(#1)"
4163 : [ret] "={r0}" (-> u32),
4264 : [number] "{r6}" (@intFromEnum(number)),
......@@ -61,12 +83,12 @@ pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u
6183
6284pub fn syscall6(
6385 number: SYS,
64 arg1: u32,
65 arg2: u32,
66 arg3: u32,
67 arg4: u32,
68 arg5: u32,
69 arg6: u32,
86 arg1: syscall_arg_t,
87 arg2: syscall_arg_t,
88 arg3: syscall_arg_t,
89 arg4: syscall_arg_t,
90 arg5: syscall_arg_t,
91 arg6: syscall_arg_t,
7092) u32 {
7193 return asm volatile ("trap0(#1)"
7294 : [ret] "={r0}" (-> u32),
lib/std/os/linux/loongarch32.zig+41-12
......@@ -2,7 +2,11 @@ const builtin = @import("builtin");
22const std = @import("../../std.zig");
33const SYS = std.os.linux.SYS;
44
5pub fn syscall0(number: SYS) u32 {
5pub const syscall_arg_t = u32;
6
7pub fn syscall0(
8 number: SYS,
9) u32 {
610 return asm volatile (
711 \\ syscall 0
812 : [ret] "={$r4}" (-> u32),
......@@ -10,7 +14,10 @@ pub fn syscall0(number: SYS) u32 {
1014 : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
1115}
1216
13pub fn syscall1(number: SYS, arg1: u32) u32 {
17pub fn syscall1(
18 number: SYS,
19 arg1: syscall_arg_t,
20) u32 {
1421 return asm volatile (
1522 \\ syscall 0
1623 : [ret] "={$r4}" (-> u32),
......@@ -19,7 +26,11 @@ pub fn syscall1(number: SYS, arg1: u32) u32 {
1926 : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
2027}
2128
22pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {
29pub fn syscall2(
30 number: SYS,
31 arg1: syscall_arg_t,
32 arg2: syscall_arg_t,
33) u32 {
2334 return asm volatile (
2435 \\ syscall 0
2536 : [ret] "={$r4}" (-> u32),
......@@ -29,7 +40,12 @@ pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {
2940 : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
3041}
3142
32pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {
43pub fn syscall3(
44 number: SYS,
45 arg1: syscall_arg_t,
46 arg2: syscall_arg_t,
47 arg3: syscall_arg_t,
48) u32 {
3349 return asm volatile (
3450 \\ syscall 0
3551 : [ret] "={$r4}" (-> u32),
......@@ -40,7 +56,13 @@ pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {
4056 : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
4157}
4258
43pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {
59pub fn syscall4(
60 number: SYS,
61 arg1: syscall_arg_t,
62 arg2: syscall_arg_t,
63 arg3: syscall_arg_t,
64 arg4: syscall_arg_t,
65) u32 {
4466 return asm volatile (
4567 \\ syscall 0
4668 : [ret] "={$r4}" (-> u32),
......@@ -52,7 +74,14 @@ pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {
5274 : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
5375}
5476
55pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u32) u32 {
77pub fn syscall5(
78 number: SYS,
79 arg1: syscall_arg_t,
80 arg2: syscall_arg_t,
81 arg3: syscall_arg_t,
82 arg4: syscall_arg_t,
83 arg5: syscall_arg_t,
84) u32 {
5685 return asm volatile (
5786 \\ syscall 0
5887 : [ret] "={$r4}" (-> u32),
......@@ -67,12 +96,12 @@ pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u
6796
6897pub fn syscall6(
6998 number: SYS,
70 arg1: u32,
71 arg2: u32,
72 arg3: u32,
73 arg4: u32,
74 arg5: u32,
75 arg6: u32,
99 arg1: syscall_arg_t,
100 arg2: syscall_arg_t,
101 arg3: syscall_arg_t,
102 arg4: syscall_arg_t,
103 arg5: syscall_arg_t,
104 arg6: syscall_arg_t,
76105) u32 {
77106 return asm volatile (
78107 \\ syscall 0
lib/std/os/linux/loongarch64.zig+41-12
......@@ -2,7 +2,11 @@ const builtin = @import("builtin");
22const std = @import("../../std.zig");
33const SYS = std.os.linux.SYS;
44
5pub fn syscall0(number: SYS) u64 {
5pub const syscall_arg_t = u64;
6
7pub fn syscall0(
8 number: SYS,
9) u64 {
610 return asm volatile (
711 \\ syscall 0
812 : [ret] "={$r4}" (-> u64),
......@@ -10,7 +14,10 @@ pub fn syscall0(number: SYS) u64 {
1014 : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
1115}
1216
13pub fn syscall1(number: SYS, arg1: u64) u64 {
17pub fn syscall1(
18 number: SYS,
19 arg1: syscall_arg_t,
20) u64 {
1421 return asm volatile (
1522 \\ syscall 0
1623 : [ret] "={$r4}" (-> u64),
......@@ -19,7 +26,11 @@ pub fn syscall1(number: SYS, arg1: u64) u64 {
1926 : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
2027}
2128
22pub fn syscall2(number: SYS, arg1: u64, arg2: u64) u64 {
29pub fn syscall2(
30 number: SYS,
31 arg1: syscall_arg_t,
32 arg2: syscall_arg_t,
33) u64 {
2334 return asm volatile (
2435 \\ syscall 0
2536 : [ret] "={$r4}" (-> u64),
......@@ -29,7 +40,12 @@ pub fn syscall2(number: SYS, arg1: u64, arg2: u64) u64 {
2940 : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
3041}
3142
32pub fn syscall3(number: SYS, arg1: u64, arg2: u64, arg3: u64) u64 {
43pub fn syscall3(
44 number: SYS,
45 arg1: syscall_arg_t,
46 arg2: syscall_arg_t,
47 arg3: syscall_arg_t,
48) u64 {
3349 return asm volatile (
3450 \\ syscall 0
3551 : [ret] "={$r4}" (-> u64),
......@@ -40,7 +56,13 @@ pub fn syscall3(number: SYS, arg1: u64, arg2: u64, arg3: u64) u64 {
4056 : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
4157}
4258
43pub fn syscall4(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64) u64 {
59pub fn syscall4(
60 number: SYS,
61 arg1: syscall_arg_t,
62 arg2: syscall_arg_t,
63 arg3: syscall_arg_t,
64 arg4: syscall_arg_t,
65) u64 {
4466 return asm volatile (
4567 \\ syscall 0
4668 : [ret] "={$r4}" (-> u64),
......@@ -52,7 +74,14 @@ pub fn syscall4(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64) u64 {
5274 : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
5375}
5476
55pub fn syscall5(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64, arg5: u64) u64 {
77pub fn syscall5(
78 number: SYS,
79 arg1: syscall_arg_t,
80 arg2: syscall_arg_t,
81 arg3: syscall_arg_t,
82 arg4: syscall_arg_t,
83 arg5: syscall_arg_t,
84) u64 {
5685 return asm volatile (
5786 \\ syscall 0
5887 : [ret] "={$r4}" (-> u64),
......@@ -67,12 +96,12 @@ pub fn syscall5(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64, arg5: u
6796
6897pub fn syscall6(
6998 number: SYS,
70 arg1: u64,
71 arg2: u64,
72 arg3: u64,
73 arg4: u64,
74 arg5: u64,
75 arg6: u64,
99 arg1: syscall_arg_t,
100 arg2: syscall_arg_t,
101 arg3: syscall_arg_t,
102 arg4: syscall_arg_t,
103 arg5: syscall_arg_t,
104 arg6: syscall_arg_t,
76105) u64 {
77106 return asm volatile (
78107 \\ syscall 0
lib/std/os/linux/m68k.zig+41-13
......@@ -2,14 +2,21 @@ const builtin = @import("builtin");
22const std = @import("../../std.zig");
33const SYS = std.os.linux.SYS;
44
5pub fn syscall0(number: SYS) u32 {
5pub const syscall_arg_t = u32;
6
7pub fn syscall0(
8 number: SYS,
9) u32 {
610 return asm volatile ("trap #0"
711 : [ret] "={d0}" (-> u32),
812 : [number] "{d0}" (@intFromEnum(number)),
913 : .{ .memory = true });
1014}
1115
12pub fn syscall1(number: SYS, arg1: u32) u32 {
16pub fn syscall1(
17 number: SYS,
18 arg1: syscall_arg_t,
19) u32 {
1320 return asm volatile ("trap #0"
1421 : [ret] "={d0}" (-> u32),
1522 : [number] "{d0}" (@intFromEnum(number)),
......@@ -17,7 +24,11 @@ pub fn syscall1(number: SYS, arg1: u32) u32 {
1724 : .{ .memory = true });
1825}
1926
20pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {
27pub fn syscall2(
28 number: SYS,
29 arg1: syscall_arg_t,
30 arg2: syscall_arg_t,
31) u32 {
2132 return asm volatile ("trap #0"
2233 : [ret] "={d0}" (-> u32),
2334 : [number] "{d0}" (@intFromEnum(number)),
......@@ -26,7 +37,12 @@ pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {
2637 : .{ .memory = true });
2738}
2839
29pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {
40pub fn syscall3(
41 number: SYS,
42 arg1: syscall_arg_t,
43 arg2: syscall_arg_t,
44 arg3: syscall_arg_t,
45) u32 {
3046 return asm volatile ("trap #0"
3147 : [ret] "={d0}" (-> u32),
3248 : [number] "{d0}" (@intFromEnum(number)),
......@@ -36,7 +52,13 @@ pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {
3652 : .{ .memory = true });
3753}
3854
39pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {
55pub fn syscall4(
56 number: SYS,
57 arg1: syscall_arg_t,
58 arg2: syscall_arg_t,
59 arg3: syscall_arg_t,
60 arg4: syscall_arg_t,
61) u32 {
4062 return asm volatile ("trap #0"
4163 : [ret] "={d0}" (-> u32),
4264 : [number] "{d0}" (@intFromEnum(number)),
......@@ -47,7 +69,14 @@ pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {
4769 : .{ .memory = true });
4870}
4971
50pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u32) u32 {
72pub fn syscall5(
73 number: SYS,
74 arg1: syscall_arg_t,
75 arg2: syscall_arg_t,
76 arg3: syscall_arg_t,
77 arg4: syscall_arg_t,
78 arg5: syscall_arg_t,
79) u32 {
5180 return asm volatile ("trap #0"
5281 : [ret] "={d0}" (-> u32),
5382 : [number] "{d0}" (@intFromEnum(number)),
......@@ -61,12 +90,12 @@ pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u
6190
6291pub fn syscall6(
6392 number: SYS,
64 arg1: u32,
65 arg2: u32,
66 arg3: u32,
67 arg4: u32,
68 arg5: u32,
69 arg6: u32,
93 arg1: syscall_arg_t,
94 arg2: syscall_arg_t,
95 arg3: syscall_arg_t,
96 arg4: syscall_arg_t,
97 arg5: syscall_arg_t,
98 arg6: syscall_arg_t,
7099) u32 {
71100 return asm volatile ("trap #0"
72101 : [ret] "={d0}" (-> u32),
......@@ -144,5 +173,4 @@ pub fn restore_rt() callconv(.naked) noreturn {
144173
145174pub const time_t = i32;
146175
147// No VDSO used as of glibc 112a0ae18b831bf31f44d81b82666980312511d6.
148176pub const VDSO = void;
lib/std/os/linux/mips.zig+67-36
......@@ -2,7 +2,11 @@ const builtin = @import("builtin");
22const std = @import("../../std.zig");
33const SYS = std.os.linux.SYS;
44
5pub fn syscall0(number: SYS) u32 {
5pub const syscall_arg_t = u32;
6
7pub fn syscall0(
8 number: SYS,
9) u32 {
610 return asm volatile (
711 \\ syscall
812 \\ beq $a3, $zero, 1f
......@@ -14,24 +18,10 @@ pub fn syscall0(number: SYS) u32 {
1418 : .{ .r1 = true, .r3 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
1519}
1620
17pub fn syscall_pipe(fd: *[2]i32) u32 {
18 return asm volatile (
19 \\ syscall
20 \\ beq $a3, $zero, 1f
21 \\ blez $v0, 2f
22 \\ subu $v0, $zero, $v0
23 \\ b 2f
24 \\1:
25 \\ sw $v0, 0($a0)
26 \\ sw $v1, 4($a0)
27 \\2:
28 : [ret] "={$2}" (-> u32),
29 : [number] "{$2}" (@intFromEnum(SYS.pipe)),
30 [fd] "{$4}" (fd),
31 : .{ .r1 = true, .r3 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
32}
33
34pub fn syscall1(number: SYS, arg1: u32) u32 {
21pub fn syscall1(
22 number: SYS,
23 arg1: syscall_arg_t,
24) u32 {
3525 return asm volatile (
3626 \\ syscall
3727 \\ beq $a3, $zero, 1f
......@@ -44,7 +34,11 @@ pub fn syscall1(number: SYS, arg1: u32) u32 {
4434 : .{ .r1 = true, .r3 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
4535}
4636
47pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {
37pub fn syscall2(
38 number: SYS,
39 arg1: syscall_arg_t,
40 arg2: syscall_arg_t,
41) u32 {
4842 return asm volatile (
4943 \\ syscall
5044 \\ beq $a3, $zero, 1f
......@@ -58,7 +52,12 @@ pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {
5852 : .{ .r1 = true, .r3 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
5953}
6054
61pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {
55pub fn syscall3(
56 number: SYS,
57 arg1: syscall_arg_t,
58 arg2: syscall_arg_t,
59 arg3: syscall_arg_t,
60) u32 {
6261 return asm volatile (
6362 \\ syscall
6463 \\ beq $a3, $zero, 1f
......@@ -73,7 +72,13 @@ pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {
7372 : .{ .r1 = true, .r3 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
7473}
7574
76pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {
75pub fn syscall4(
76 number: SYS,
77 arg1: syscall_arg_t,
78 arg2: syscall_arg_t,
79 arg3: syscall_arg_t,
80 arg4: syscall_arg_t,
81) u32 {
7782 return asm volatile (
7883 \\ syscall
7984 \\ beq $a3, $zero, 1f
......@@ -92,7 +97,14 @@ pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {
9297// NOTE: The o32 calling convention requires the callee to reserve 16 bytes for
9398// the first four arguments even though they're passed in $a0-$a3.
9499
95pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u32) u32 {
100pub fn syscall5(
101 number: SYS,
102 arg1: syscall_arg_t,
103 arg2: syscall_arg_t,
104 arg3: syscall_arg_t,
105 arg4: syscall_arg_t,
106 arg5: syscall_arg_t,
107) u32 {
96108 return asm volatile (
97109 \\ subu $sp, $sp, 24
98110 \\ sw %[arg5], 16($sp)
......@@ -114,12 +126,12 @@ pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u
114126
115127pub fn syscall6(
116128 number: SYS,
117 arg1: u32,
118 arg2: u32,
119 arg3: u32,
120 arg4: u32,
121 arg5: u32,
122 arg6: u32,
129 arg1: syscall_arg_t,
130 arg2: syscall_arg_t,
131 arg3: syscall_arg_t,
132 arg4: syscall_arg_t,
133 arg5: syscall_arg_t,
134 arg6: syscall_arg_t,
123135) u32 {
124136 return asm volatile (
125137 \\ subu $sp, $sp, 24
......@@ -144,13 +156,13 @@ pub fn syscall6(
144156
145157pub fn syscall7(
146158 number: SYS,
147 arg1: u32,
148 arg2: u32,
149 arg3: u32,
150 arg4: u32,
151 arg5: u32,
152 arg6: u32,
153 arg7: u32,
159 arg1: syscall_arg_t,
160 arg2: syscall_arg_t,
161 arg3: syscall_arg_t,
162 arg4: syscall_arg_t,
163 arg5: syscall_arg_t,
164 arg6: syscall_arg_t,
165 arg7: syscall_arg_t,
154166) u32 {
155167 return asm volatile (
156168 \\ subu $sp, $sp, 32
......@@ -175,6 +187,25 @@ pub fn syscall7(
175187 : .{ .r1 = true, .r3 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
176188}
177189
190pub fn syscall_pipe(
191 fd: *[2]std.os.linux.fd_t,
192) u32 {
193 return asm volatile (
194 \\ syscall
195 \\ beq $a3, $zero, 1f
196 \\ blez $v0, 2f
197 \\ subu $v0, $zero, $v0
198 \\ b 2f
199 \\1:
200 \\ sw $v0, 0($a0)
201 \\ sw $v1, 4($a0)
202 \\2:
203 : [ret] "={$2}" (-> u32),
204 : [number] "{$2}" (@intFromEnum(SYS.pipe)),
205 [fd] "{$4}" (fd),
206 : .{ .r1 = true, .r3 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
207}
208
178209pub fn clone() callconv(.naked) u32 {
179210 // __clone(func, stack, flags, arg, ptid, tls, ctid)
180211 // a0, a1, a2, a3, +0, +4, +8
lib/std/os/linux/mips64.zig+60-29
......@@ -2,7 +2,11 @@ const builtin = @import("builtin");
22const std = @import("../../std.zig");
33const SYS = std.os.linux.SYS;
44
5pub fn syscall0(number: SYS) u64 {
5pub const syscall_arg_t = u64;
6
7pub fn syscall0(
8 number: SYS,
9) u64 {
610 return asm volatile (
711 \\ syscall
812 \\ beq $a3, $zero, 1f
......@@ -14,24 +18,10 @@ pub fn syscall0(number: SYS) u64 {
1418 : .{ .r1 = true, .r3 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
1519}
1620
17pub fn syscall_pipe(fd: *[2]i32) u64 {
18 return asm volatile (
19 \\ syscall
20 \\ beq $a3, $zero, 1f
21 \\ blez $v0, 2f
22 \\ dsubu $v0, $zero, $v0
23 \\ b 2f
24 \\1:
25 \\ sw $v0, 0($a0)
26 \\ sw $v1, 4($a0)
27 \\2:
28 : [ret] "={$2}" (-> u64),
29 : [number] "{$2}" (@intFromEnum(SYS.pipe)),
30 [fd] "{$4}" (fd),
31 : .{ .r1 = true, .r3 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
32}
33
34pub fn syscall1(number: SYS, arg1: u64) u64 {
21pub fn syscall1(
22 number: SYS,
23 arg1: syscall_arg_t,
24) u64 {
3525 return asm volatile (
3626 \\ syscall
3727 \\ beq $a3, $zero, 1f
......@@ -44,7 +34,11 @@ pub fn syscall1(number: SYS, arg1: u64) u64 {
4434 : .{ .r1 = true, .r3 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
4535}
4636
47pub fn syscall2(number: SYS, arg1: u64, arg2: u64) u64 {
37pub fn syscall2(
38 number: SYS,
39 arg1: syscall_arg_t,
40 arg2: syscall_arg_t,
41) u64 {
4842 return asm volatile (
4943 \\ syscall
5044 \\ beq $a3, $zero, 1f
......@@ -58,7 +52,12 @@ pub fn syscall2(number: SYS, arg1: u64, arg2: u64) u64 {
5852 : .{ .r1 = true, .r3 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
5953}
6054
61pub fn syscall3(number: SYS, arg1: u64, arg2: u64, arg3: u64) u64 {
55pub fn syscall3(
56 number: SYS,
57 arg1: syscall_arg_t,
58 arg2: syscall_arg_t,
59 arg3: syscall_arg_t,
60) u64 {
6261 return asm volatile (
6362 \\ syscall
6463 \\ beq $a3, $zero, 1f
......@@ -73,7 +72,13 @@ pub fn syscall3(number: SYS, arg1: u64, arg2: u64, arg3: u64) u64 {
7372 : .{ .r1 = true, .r3 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
7473}
7574
76pub fn syscall4(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64) u64 {
75pub fn syscall4(
76 number: SYS,
77 arg1: syscall_arg_t,
78 arg2: syscall_arg_t,
79 arg3: syscall_arg_t,
80 arg4: syscall_arg_t,
81) u64 {
7782 return asm volatile (
7883 \\ syscall
7984 \\ beq $a3, $zero, 1f
......@@ -89,7 +94,14 @@ pub fn syscall4(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64) u64 {
8994 : .{ .r1 = true, .r3 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
9095}
9196
92pub fn syscall5(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64, arg5: u64) u64 {
97pub fn syscall5(
98 number: SYS,
99 arg1: syscall_arg_t,
100 arg2: syscall_arg_t,
101 arg3: syscall_arg_t,
102 arg4: syscall_arg_t,
103 arg5: syscall_arg_t,
104) u64 {
93105 return asm volatile (
94106 \\ syscall
95107 \\ beq $a3, $zero, 1f
......@@ -108,12 +120,12 @@ pub fn syscall5(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64, arg5: u
108120
109121pub fn syscall6(
110122 number: SYS,
111 arg1: u64,
112 arg2: u64,
113 arg3: u64,
114 arg4: u64,
115 arg5: u64,
116 arg6: u64,
123 arg1: syscall_arg_t,
124 arg2: syscall_arg_t,
125 arg3: syscall_arg_t,
126 arg4: syscall_arg_t,
127 arg5: syscall_arg_t,
128 arg6: syscall_arg_t,
117129) u64 {
118130 return asm volatile (
119131 \\ syscall
......@@ -132,6 +144,25 @@ pub fn syscall6(
132144 : .{ .r1 = true, .r3 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
133145}
134146
147pub fn syscall_pipe(
148 fd: *[2]std.os.linux.fd_t,
149) u64 {
150 return asm volatile (
151 \\ syscall
152 \\ beq $a3, $zero, 1f
153 \\ blez $v0, 2f
154 \\ dsubu $v0, $zero, $v0
155 \\ b 2f
156 \\1:
157 \\ sw $v0, 0($a0)
158 \\ sw $v1, 4($a0)
159 \\2:
160 : [ret] "={$2}" (-> u64),
161 : [number] "{$2}" (@intFromEnum(SYS.pipe)),
162 [fd] "{$4}" (fd),
163 : .{ .r1 = true, .r3 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
164}
165
135166pub fn clone() callconv(.naked) u64 {
136167 // __clone(func, stack, flags, arg, ptid, tls, ctid)
137168 // a0, a1, a2, a3, a4, a5, a6
lib/std/os/linux/mipsn32.zig+60-29
......@@ -2,7 +2,11 @@ const builtin = @import("builtin");
22const std = @import("../../std.zig");
33const SYS = std.os.linux.SYS;
44
5pub fn syscall0(number: SYS) u32 {
5pub const syscall_arg_t = u64;
6
7pub fn syscall0(
8 number: SYS,
9) u32 {
610 return asm volatile (
711 \\ syscall
812 \\ beq $a3, $zero, 1f
......@@ -14,24 +18,10 @@ pub fn syscall0(number: SYS) u32 {
1418 : .{ .r1 = true, .r3 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
1519}
1620
17pub fn syscall_pipe(fd: *[2]i32) u32 {
18 return asm volatile (
19 \\ syscall
20 \\ beq $a3, $zero, 1f
21 \\ blez $v0, 2f
22 \\ subu $v0, $zero, $v0
23 \\ b 2f
24 \\1:
25 \\ sw $v0, 0($a0)
26 \\ sw $v1, 4($a0)
27 \\2:
28 : [ret] "={$2}" (-> u32),
29 : [number] "{$2}" (@intFromEnum(SYS.pipe)),
30 [fd] "{$4}" (fd),
31 : .{ .r1 = true, .r3 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
32}
33
34pub fn syscall1(number: SYS, arg1: u32) u32 {
21pub fn syscall1(
22 number: SYS,
23 arg1: syscall_arg_t,
24) u32 {
3525 return asm volatile (
3626 \\ syscall
3727 \\ beq $a3, $zero, 1f
......@@ -44,7 +34,11 @@ pub fn syscall1(number: SYS, arg1: u32) u32 {
4434 : .{ .r1 = true, .r3 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
4535}
4636
47pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {
37pub fn syscall2(
38 number: SYS,
39 arg1: syscall_arg_t,
40 arg2: syscall_arg_t,
41) u32 {
4842 return asm volatile (
4943 \\ syscall
5044 \\ beq $a3, $zero, 1f
......@@ -58,7 +52,12 @@ pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {
5852 : .{ .r1 = true, .r3 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
5953}
6054
61pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {
55pub fn syscall3(
56 number: SYS,
57 arg1: syscall_arg_t,
58 arg2: syscall_arg_t,
59 arg3: syscall_arg_t,
60) u32 {
6261 return asm volatile (
6362 \\ syscall
6463 \\ beq $a3, $zero, 1f
......@@ -73,7 +72,13 @@ pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {
7372 : .{ .r1 = true, .r3 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
7473}
7574
76pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {
75pub fn syscall4(
76 number: SYS,
77 arg1: syscall_arg_t,
78 arg2: syscall_arg_t,
79 arg3: syscall_arg_t,
80 arg4: syscall_arg_t,
81) u32 {
7782 return asm volatile (
7883 \\ syscall
7984 \\ beq $a3, $zero, 1f
......@@ -89,7 +94,14 @@ pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {
8994 : .{ .r1 = true, .r3 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
9095}
9196
92pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u32) u32 {
97pub fn syscall5(
98 number: SYS,
99 arg1: syscall_arg_t,
100 arg2: syscall_arg_t,
101 arg3: syscall_arg_t,
102 arg4: syscall_arg_t,
103 arg5: syscall_arg_t,
104) u32 {
93105 return asm volatile (
94106 \\ syscall
95107 \\ beq $a3, $zero, 1f
......@@ -108,12 +120,12 @@ pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u
108120
109121pub fn syscall6(
110122 number: SYS,
111 arg1: u32,
112 arg2: u32,
113 arg3: u32,
114 arg4: u32,
115 arg5: u32,
116 arg6: u32,
123 arg1: syscall_arg_t,
124 arg2: syscall_arg_t,
125 arg3: syscall_arg_t,
126 arg4: syscall_arg_t,
127 arg5: syscall_arg_t,
128 arg6: syscall_arg_t,
117129) u32 {
118130 return asm volatile (
119131 \\ syscall
......@@ -132,6 +144,25 @@ pub fn syscall6(
132144 : .{ .r1 = true, .r3 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
133145}
134146
147pub fn syscall_pipe(
148 fd: *[2]std.os.linux.fd_t,
149) u32 {
150 return asm volatile (
151 \\ syscall
152 \\ beq $a3, $zero, 1f
153 \\ blez $v0, 2f
154 \\ subu $v0, $zero, $v0
155 \\ b 2f
156 \\1:
157 \\ sw $v0, 0($a0)
158 \\ sw $v1, 4($a0)
159 \\2:
160 : [ret] "={$2}" (-> u32),
161 : [number] "{$2}" (@intFromEnum(SYS.pipe)),
162 [fd] "{$4}" (fd),
163 : .{ .r1 = true, .r3 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
164}
165
135166pub fn clone() callconv(.naked) u32 {
136167 // __clone(func, stack, flags, arg, ptid, tls, ctid)
137168 // a0, a1, a2, a3, a4, a5, a6
lib/std/os/linux/or1k.zig+41-12
......@@ -2,7 +2,11 @@ const builtin = @import("builtin");
22const std = @import("../../std.zig");
33const SYS = std.os.linux.SYS;
44
5pub fn syscall0(number: SYS) u32 {
5pub const syscall_arg_t = u32;
6
7pub fn syscall0(
8 number: SYS,
9) u32 {
610 return asm volatile (
711 \\ l.sys 1
812 : [ret] "={r11}" (-> u32),
......@@ -10,7 +14,10 @@ pub fn syscall0(number: SYS) u32 {
1014 : .{ .r3 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r12 = true, .r13 = true, .r15 = true, .r17 = true, .r19 = true, .r21 = true, .r23 = true, .r25 = true, .r27 = true, .r29 = true, .r31 = true, .memory = true });
1115}
1216
13pub fn syscall1(number: SYS, arg1: u32) u32 {
17pub fn syscall1(
18 number: SYS,
19 arg1: syscall_arg_t,
20) u32 {
1421 return asm volatile (
1522 \\ l.sys 1
1623 : [ret] "={r11}" (-> u32),
......@@ -19,7 +26,11 @@ pub fn syscall1(number: SYS, arg1: u32) u32 {
1926 : .{ .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r12 = true, .r13 = true, .r15 = true, .r17 = true, .r19 = true, .r21 = true, .r23 = true, .r25 = true, .r27 = true, .r29 = true, .r31 = true, .memory = true });
2027}
2128
22pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {
29pub fn syscall2(
30 number: SYS,
31 arg1: syscall_arg_t,
32 arg2: syscall_arg_t,
33) u32 {
2334 return asm volatile (
2435 \\ l.sys 1
2536 : [ret] "={r11}" (-> u32),
......@@ -29,7 +40,12 @@ pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {
2940 : .{ .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r12 = true, .r13 = true, .r15 = true, .r17 = true, .r19 = true, .r21 = true, .r23 = true, .r25 = true, .r27 = true, .r29 = true, .r31 = true, .memory = true });
3041}
3142
32pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {
43pub fn syscall3(
44 number: SYS,
45 arg1: syscall_arg_t,
46 arg2: syscall_arg_t,
47 arg3: syscall_arg_t,
48) u32 {
3349 return asm volatile (
3450 \\ l.sys 1
3551 : [ret] "={r11}" (-> u32),
......@@ -40,7 +56,13 @@ pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {
4056 : .{ .r6 = true, .r7 = true, .r8 = true, .r12 = true, .r13 = true, .r15 = true, .r17 = true, .r19 = true, .r21 = true, .r23 = true, .r25 = true, .r27 = true, .r29 = true, .r31 = true, .memory = true });
4157}
4258
43pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {
59pub fn syscall4(
60 number: SYS,
61 arg1: syscall_arg_t,
62 arg2: syscall_arg_t,
63 arg3: syscall_arg_t,
64 arg4: syscall_arg_t,
65) u32 {
4466 return asm volatile (
4567 \\ l.sys 1
4668 : [ret] "={r11}" (-> u32),
......@@ -52,7 +74,14 @@ pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {
5274 : .{ .r7 = true, .r8 = true, .r12 = true, .r13 = true, .r15 = true, .r17 = true, .r19 = true, .r21 = true, .r23 = true, .r25 = true, .r27 = true, .r29 = true, .r31 = true, .memory = true });
5375}
5476
55pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u32) u32 {
77pub fn syscall5(
78 number: SYS,
79 arg1: syscall_arg_t,
80 arg2: syscall_arg_t,
81 arg3: syscall_arg_t,
82 arg4: syscall_arg_t,
83 arg5: syscall_arg_t,
84) u32 {
5685 return asm volatile (
5786 \\ l.sys 1
5887 : [ret] "={r11}" (-> u32),
......@@ -67,12 +96,12 @@ pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u
6796
6897pub fn syscall6(
6998 number: SYS,
70 arg1: u32,
71 arg2: u32,
72 arg3: u32,
73 arg4: u32,
74 arg5: u32,
75 arg6: u32,
99 arg1: syscall_arg_t,
100 arg2: syscall_arg_t,
101 arg3: syscall_arg_t,
102 arg4: syscall_arg_t,
103 arg5: syscall_arg_t,
104 arg6: syscall_arg_t,
76105) u32 {
77106 return asm volatile (
78107 \\ l.sys 1
lib/std/os/linux/powerpc.zig+41-12
......@@ -2,7 +2,11 @@ const builtin = @import("builtin");
22const std = @import("../../std.zig");
33const SYS = std.os.linux.SYS;
44
5pub fn syscall0(number: SYS) u32 {
5pub const syscall_arg_t = u32;
6
7pub fn syscall0(
8 number: SYS,
9) u32 {
610 // r0 is both an input register and a clobber. musl and glibc achieve this with
711 // a "+" constraint, which isn't supported in Zig, so instead we separately list
812 // r0 as both an input and an output. (Listing it as an input and a clobber would
......@@ -19,7 +23,10 @@ pub fn syscall0(number: SYS) u32 {
1923 : .{ .memory = true, .cr0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .ctr = true, .xer = true });
2024}
2125
22pub fn syscall1(number: SYS, arg1: u32) u32 {
26pub fn syscall1(
27 number: SYS,
28 arg1: syscall_arg_t,
29) u32 {
2330 // r0 is both an input and a clobber.
2431 var r0_out: u32 = undefined;
2532 return asm volatile (
......@@ -34,7 +41,11 @@ pub fn syscall1(number: SYS, arg1: u32) u32 {
3441 : .{ .memory = true, .cr0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .ctr = true, .xer = true });
3542}
3643
37pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {
44pub fn syscall2(
45 number: SYS,
46 arg1: syscall_arg_t,
47 arg2: syscall_arg_t,
48) u32 {
3849 // These registers are both inputs and clobbers.
3950 var r0_out: u32 = undefined;
4051 var r4_out: u32 = undefined;
......@@ -52,7 +63,12 @@ pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {
5263 : .{ .memory = true, .cr0 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .ctr = true, .xer = true });
5364}
5465
55pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {
66pub fn syscall3(
67 number: SYS,
68 arg1: syscall_arg_t,
69 arg2: syscall_arg_t,
70 arg3: syscall_arg_t,
71) u32 {
5672 // These registers are both inputs and clobbers.
5773 var r0_out: u32 = undefined;
5874 var r4_out: u32 = undefined;
......@@ -73,7 +89,13 @@ pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {
7389 : .{ .memory = true, .cr0 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .ctr = true, .xer = true });
7490}
7591
76pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {
92pub fn syscall4(
93 number: SYS,
94 arg1: syscall_arg_t,
95 arg2: syscall_arg_t,
96 arg3: syscall_arg_t,
97 arg4: syscall_arg_t,
98) u32 {
7799 // These registers are both inputs and clobbers.
78100 var r0_out: u32 = undefined;
79101 var r4_out: u32 = undefined;
......@@ -97,7 +119,14 @@ pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {
97119 : .{ .memory = true, .cr0 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .ctr = true, .xer = true });
98120}
99121
100pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u32) u32 {
122pub fn syscall5(
123 number: SYS,
124 arg1: syscall_arg_t,
125 arg2: syscall_arg_t,
126 arg3: syscall_arg_t,
127 arg4: syscall_arg_t,
128 arg5: syscall_arg_t,
129) u32 {
101130 // These registers are both inputs and clobbers.
102131 var r0_out: u32 = undefined;
103132 var r4_out: u32 = undefined;
......@@ -126,12 +155,12 @@ pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u
126155
127156pub fn syscall6(
128157 number: SYS,
129 arg1: u32,
130 arg2: u32,
131 arg3: u32,
132 arg4: u32,
133 arg5: u32,
134 arg6: u32,
158 arg1: syscall_arg_t,
159 arg2: syscall_arg_t,
160 arg3: syscall_arg_t,
161 arg4: syscall_arg_t,
162 arg5: syscall_arg_t,
163 arg6: syscall_arg_t,
135164) u32 {
136165 // These registers are both inputs and clobbers.
137166 var r0_out: u32 = undefined;
lib/std/os/linux/powerpc64.zig+41-12
......@@ -2,7 +2,11 @@ const builtin = @import("builtin");
22const std = @import("../../std.zig");
33const SYS = std.os.linux.SYS;
44
5pub fn syscall0(number: SYS) u64 {
5pub const syscall_arg_t = u64;
6
7pub fn syscall0(
8 number: SYS,
9) u64 {
610 // r0 is both an input register and a clobber. musl and glibc achieve this with
711 // a "+" constraint, which isn't supported in Zig, so instead we separately list
812 // r0 as both an input and an output. (Listing it as an input and a clobber would
......@@ -19,7 +23,10 @@ pub fn syscall0(number: SYS) u64 {
1923 : .{ .memory = true, .cr0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .ctr = true, .xer = true });
2024}
2125
22pub fn syscall1(number: SYS, arg1: u64) u64 {
26pub fn syscall1(
27 number: SYS,
28 arg1: syscall_arg_t,
29) u64 {
2330 // r0 is both an input and a clobber.
2431 var r0_out: u64 = undefined;
2532 return asm volatile (
......@@ -34,7 +41,11 @@ pub fn syscall1(number: SYS, arg1: u64) u64 {
3441 : .{ .memory = true, .cr0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .ctr = true, .xer = true });
3542}
3643
37pub fn syscall2(number: SYS, arg1: u64, arg2: u64) u64 {
44pub fn syscall2(
45 number: SYS,
46 arg1: syscall_arg_t,
47 arg2: syscall_arg_t,
48) u64 {
3849 // These registers are both inputs and clobbers.
3950 var r0_out: u64 = undefined;
4051 var r4_out: u64 = undefined;
......@@ -52,7 +63,12 @@ pub fn syscall2(number: SYS, arg1: u64, arg2: u64) u64 {
5263 : .{ .memory = true, .cr0 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .ctr = true, .xer = true });
5364}
5465
55pub fn syscall3(number: SYS, arg1: u64, arg2: u64, arg3: u64) u64 {
66pub fn syscall3(
67 number: SYS,
68 arg1: syscall_arg_t,
69 arg2: syscall_arg_t,
70 arg3: syscall_arg_t,
71) u64 {
5672 // These registers are both inputs and clobbers.
5773 var r0_out: u64 = undefined;
5874 var r4_out: u64 = undefined;
......@@ -73,7 +89,13 @@ pub fn syscall3(number: SYS, arg1: u64, arg2: u64, arg3: u64) u64 {
7389 : .{ .memory = true, .cr0 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .ctr = true, .xer = true });
7490}
7591
76pub fn syscall4(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64) u64 {
92pub fn syscall4(
93 number: SYS,
94 arg1: syscall_arg_t,
95 arg2: syscall_arg_t,
96 arg3: syscall_arg_t,
97 arg4: syscall_arg_t,
98) u64 {
7799 // These registers are both inputs and clobbers.
78100 var r0_out: u64 = undefined;
79101 var r4_out: u64 = undefined;
......@@ -97,7 +119,14 @@ pub fn syscall4(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64) u64 {
97119 : .{ .memory = true, .cr0 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .ctr = true, .xer = true });
98120}
99121
100pub fn syscall5(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64, arg5: u64) u64 {
122pub fn syscall5(
123 number: SYS,
124 arg1: syscall_arg_t,
125 arg2: syscall_arg_t,
126 arg3: syscall_arg_t,
127 arg4: syscall_arg_t,
128 arg5: syscall_arg_t,
129) u64 {
101130 // These registers are both inputs and clobbers.
102131 var r0_out: u64 = undefined;
103132 var r4_out: u64 = undefined;
......@@ -126,12 +155,12 @@ pub fn syscall5(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64, arg5: u
126155
127156pub fn syscall6(
128157 number: SYS,
129 arg1: u64,
130 arg2: u64,
131 arg3: u64,
132 arg4: u64,
133 arg5: u64,
134 arg6: u64,
158 arg1: syscall_arg_t,
159 arg2: syscall_arg_t,
160 arg3: syscall_arg_t,
161 arg4: syscall_arg_t,
162 arg5: syscall_arg_t,
163 arg6: syscall_arg_t,
135164) u64 {
136165 // These registers are both inputs and clobbers.
137166 var r0_out: u64 = undefined;
lib/std/os/linux/riscv32.zig+41-12
......@@ -2,14 +2,21 @@ const builtin = @import("builtin");
22const std = @import("../../std.zig");
33const SYS = std.os.linux.SYS;
44
5pub fn syscall0(number: SYS) u32 {
5pub const syscall_arg_t = u32;
6
7pub fn syscall0(
8 number: SYS,
9) u32 {
610 return asm volatile ("ecall"
711 : [ret] "={x10}" (-> u32),
812 : [number] "{x17}" (@intFromEnum(number)),
913 : .{ .memory = true });
1014}
1115
12pub fn syscall1(number: SYS, arg1: u32) u32 {
16pub fn syscall1(
17 number: SYS,
18 arg1: syscall_arg_t,
19) u32 {
1320 return asm volatile ("ecall"
1421 : [ret] "={x10}" (-> u32),
1522 : [number] "{x17}" (@intFromEnum(number)),
......@@ -17,7 +24,11 @@ pub fn syscall1(number: SYS, arg1: u32) u32 {
1724 : .{ .memory = true });
1825}
1926
20pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {
27pub fn syscall2(
28 number: SYS,
29 arg1: syscall_arg_t,
30 arg2: syscall_arg_t,
31) u32 {
2132 return asm volatile ("ecall"
2233 : [ret] "={x10}" (-> u32),
2334 : [number] "{x17}" (@intFromEnum(number)),
......@@ -26,7 +37,12 @@ pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {
2637 : .{ .memory = true });
2738}
2839
29pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {
40pub fn syscall3(
41 number: SYS,
42 arg1: syscall_arg_t,
43 arg2: syscall_arg_t,
44 arg3: syscall_arg_t,
45) u32 {
3046 return asm volatile ("ecall"
3147 : [ret] "={x10}" (-> u32),
3248 : [number] "{x17}" (@intFromEnum(number)),
......@@ -36,7 +52,13 @@ pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {
3652 : .{ .memory = true });
3753}
3854
39pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {
55pub fn syscall4(
56 number: SYS,
57 arg1: syscall_arg_t,
58 arg2: syscall_arg_t,
59 arg3: syscall_arg_t,
60 arg4: syscall_arg_t,
61) u32 {
4062 return asm volatile ("ecall"
4163 : [ret] "={x10}" (-> u32),
4264 : [number] "{x17}" (@intFromEnum(number)),
......@@ -47,7 +69,14 @@ pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {
4769 : .{ .memory = true });
4870}
4971
50pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u32) u32 {
72pub fn syscall5(
73 number: SYS,
74 arg1: syscall_arg_t,
75 arg2: syscall_arg_t,
76 arg3: syscall_arg_t,
77 arg4: syscall_arg_t,
78 arg5: syscall_arg_t,
79) u32 {
5180 return asm volatile ("ecall"
5281 : [ret] "={x10}" (-> u32),
5382 : [number] "{x17}" (@intFromEnum(number)),
......@@ -61,12 +90,12 @@ pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u
6190
6291pub fn syscall6(
6392 number: SYS,
64 arg1: u32,
65 arg2: u32,
66 arg3: u32,
67 arg4: u32,
68 arg5: u32,
69 arg6: u32,
93 arg1: syscall_arg_t,
94 arg2: syscall_arg_t,
95 arg3: syscall_arg_t,
96 arg4: syscall_arg_t,
97 arg5: syscall_arg_t,
98 arg6: syscall_arg_t,
7099) u32 {
71100 return asm volatile ("ecall"
72101 : [ret] "={x10}" (-> u32),
lib/std/os/linux/riscv64.zig+41-12
......@@ -2,14 +2,21 @@ const builtin = @import("builtin");
22const std = @import("../../std.zig");
33const SYS = std.os.linux.SYS;
44
5pub fn syscall0(number: SYS) u64 {
5pub const syscall_arg_t = u64;
6
7pub fn syscall0(
8 number: SYS,
9) u64 {
610 return asm volatile ("ecall"
711 : [ret] "={x10}" (-> u64),
812 : [number] "{x17}" (@intFromEnum(number)),
913 : .{ .memory = true });
1014}
1115
12pub fn syscall1(number: SYS, arg1: u64) u64 {
16pub fn syscall1(
17 number: SYS,
18 arg1: syscall_arg_t,
19) u64 {
1320 return asm volatile ("ecall"
1421 : [ret] "={x10}" (-> u64),
1522 : [number] "{x17}" (@intFromEnum(number)),
......@@ -17,7 +24,11 @@ pub fn syscall1(number: SYS, arg1: u64) u64 {
1724 : .{ .memory = true });
1825}
1926
20pub fn syscall2(number: SYS, arg1: u64, arg2: u64) u64 {
27pub fn syscall2(
28 number: SYS,
29 arg1: syscall_arg_t,
30 arg2: syscall_arg_t,
31) u64 {
2132 return asm volatile ("ecall"
2233 : [ret] "={x10}" (-> u64),
2334 : [number] "{x17}" (@intFromEnum(number)),
......@@ -26,7 +37,12 @@ pub fn syscall2(number: SYS, arg1: u64, arg2: u64) u64 {
2637 : .{ .memory = true });
2738}
2839
29pub fn syscall3(number: SYS, arg1: u64, arg2: u64, arg3: u64) u64 {
40pub fn syscall3(
41 number: SYS,
42 arg1: syscall_arg_t,
43 arg2: syscall_arg_t,
44 arg3: syscall_arg_t,
45) u64 {
3046 return asm volatile ("ecall"
3147 : [ret] "={x10}" (-> u64),
3248 : [number] "{x17}" (@intFromEnum(number)),
......@@ -36,7 +52,13 @@ pub fn syscall3(number: SYS, arg1: u64, arg2: u64, arg3: u64) u64 {
3652 : .{ .memory = true });
3753}
3854
39pub fn syscall4(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64) u64 {
55pub fn syscall4(
56 number: SYS,
57 arg1: syscall_arg_t,
58 arg2: syscall_arg_t,
59 arg3: syscall_arg_t,
60 arg4: syscall_arg_t,
61) u64 {
4062 return asm volatile ("ecall"
4163 : [ret] "={x10}" (-> u64),
4264 : [number] "{x17}" (@intFromEnum(number)),
......@@ -47,7 +69,14 @@ pub fn syscall4(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64) u64 {
4769 : .{ .memory = true });
4870}
4971
50pub fn syscall5(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64, arg5: u64) u64 {
72pub fn syscall5(
73 number: SYS,
74 arg1: syscall_arg_t,
75 arg2: syscall_arg_t,
76 arg3: syscall_arg_t,
77 arg4: syscall_arg_t,
78 arg5: syscall_arg_t,
79) u64 {
5180 return asm volatile ("ecall"
5281 : [ret] "={x10}" (-> u64),
5382 : [number] "{x17}" (@intFromEnum(number)),
......@@ -61,12 +90,12 @@ pub fn syscall5(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64, arg5: u
6190
6291pub fn syscall6(
6392 number: SYS,
64 arg1: u64,
65 arg2: u64,
66 arg3: u64,
67 arg4: u64,
68 arg5: u64,
69 arg6: u64,
93 arg1: syscall_arg_t,
94 arg2: syscall_arg_t,
95 arg3: syscall_arg_t,
96 arg4: syscall_arg_t,
97 arg5: syscall_arg_t,
98 arg6: syscall_arg_t,
7099) u64 {
71100 return asm volatile ("ecall"
72101 : [ret] "={x10}" (-> u64),
lib/std/os/linux/s390x.zig+44-7
......@@ -2,14 +2,21 @@ const builtin = @import("builtin");
22const std = @import("../../std.zig");
33const SYS = std.os.linux.SYS;
44
5pub fn syscall0(number: SYS) u64 {
5pub const syscall_arg_t = u64;
6
7pub fn syscall0(
8 number: SYS,
9) u64 {
610 return asm volatile ("svc 0"
711 : [ret] "={r2}" (-> u64),
812 : [number] "{r1}" (@intFromEnum(number)),
913 : .{ .memory = true });
1014}
1115
12pub fn syscall1(number: SYS, arg1: u64) u64 {
16pub fn syscall1(
17 number: SYS,
18 arg1: syscall_arg_t,
19) u64 {
1320 return asm volatile ("svc 0"
1421 : [ret] "={r2}" (-> u64),
1522 : [number] "{r1}" (@intFromEnum(number)),
......@@ -17,7 +24,11 @@ pub fn syscall1(number: SYS, arg1: u64) u64 {
1724 : .{ .memory = true });
1825}
1926
20pub fn syscall2(number: SYS, arg1: u64, arg2: u64) u64 {
27pub fn syscall2(
28 number: SYS,
29 arg1: syscall_arg_t,
30 arg2: syscall_arg_t,
31) u64 {
2132 return asm volatile ("svc 0"
2233 : [ret] "={r2}" (-> u64),
2334 : [number] "{r1}" (@intFromEnum(number)),
......@@ -26,7 +37,12 @@ pub fn syscall2(number: SYS, arg1: u64, arg2: u64) u64 {
2637 : .{ .memory = true });
2738}
2839
29pub fn syscall3(number: SYS, arg1: u64, arg2: u64, arg3: u64) u64 {
40pub fn syscall3(
41 number: SYS,
42 arg1: syscall_arg_t,
43 arg2: syscall_arg_t,
44 arg3: syscall_arg_t,
45) u64 {
3046 return asm volatile ("svc 0"
3147 : [ret] "={r2}" (-> u64),
3248 : [number] "{r1}" (@intFromEnum(number)),
......@@ -36,7 +52,13 @@ pub fn syscall3(number: SYS, arg1: u64, arg2: u64, arg3: u64) u64 {
3652 : .{ .memory = true });
3753}
3854
39pub fn syscall4(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64) u64 {
55pub fn syscall4(
56 number: SYS,
57 arg1: syscall_arg_t,
58 arg2: syscall_arg_t,
59 arg3: syscall_arg_t,
60 arg4: syscall_arg_t,
61) u64 {
4062 return asm volatile ("svc 0"
4163 : [ret] "={r2}" (-> u64),
4264 : [number] "{r1}" (@intFromEnum(number)),
......@@ -47,7 +69,14 @@ pub fn syscall4(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64) u64 {
4769 : .{ .memory = true });
4870}
4971
50pub fn syscall5(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64, arg5: u64) u64 {
72pub fn syscall5(
73 number: SYS,
74 arg1: syscall_arg_t,
75 arg2: syscall_arg_t,
76 arg3: syscall_arg_t,
77 arg4: syscall_arg_t,
78 arg5: syscall_arg_t,
79) u64 {
5180 return asm volatile ("svc 0"
5281 : [ret] "={r2}" (-> u64),
5382 : [number] "{r1}" (@intFromEnum(number)),
......@@ -59,7 +88,15 @@ pub fn syscall5(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64, arg5: u
5988 : .{ .memory = true });
6089}
6190
62pub fn syscall6(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64, arg5: u64, arg6: u64) u64 {
91pub fn syscall6(
92 number: SYS,
93 arg1: syscall_arg_t,
94 arg2: syscall_arg_t,
95 arg3: syscall_arg_t,
96 arg4: syscall_arg_t,
97 arg5: syscall_arg_t,
98 arg6: syscall_arg_t,
99) u64 {
63100 return asm volatile ("svc 0"
64101 : [ret] "={r2}" (-> u64),
65102 : [number] "{r1}" (@intFromEnum(number)),
lib/std/os/linux/sparc64.zig+83-52
......@@ -2,49 +2,26 @@ const builtin = @import("builtin");
22const std = @import("../../std.zig");
33const SYS = std.os.linux.SYS;
44
5pub fn syscall_pipe(fd: *[2]i32) u64 {
6 return asm volatile (
7 \\ mov %[arg], %%g3
8 \\ t 0x6d
9 \\ bcc,pt %%xcc, 1f
10 \\ nop
11 \\ # Return the error code
12 \\ ba 2f
13 \\ neg %%o0
14 \\1:
15 \\ st %%o0, [%%g3+0]
16 \\ st %%o1, [%%g3+4]
17 \\ clr %%o0
18 \\2:
19 : [ret] "={o0}" (-> u64),
20 : [number] "{g1}" (@intFromEnum(SYS.pipe)),
21 [arg] "r" (fd),
22 : .{ .memory = true, .g3 = true });
23}
5pub const syscall_arg_t = u64;
246
25pub fn syscall_fork() u64 {
26 // Linux/sparc64 fork() returns two values in %o0 and %o1:
27 // - On the parent's side, %o0 is the child's PID and %o1 is 0.
28 // - On the child's side, %o0 is the parent's PID and %o1 is 1.
29 // We need to clear the child's %o0 so that the return values
30 // conform to the libc convention.
7pub fn syscall0(
8 number: SYS,
9) u64 {
3110 return asm volatile (
3211 \\ t 0x6d
3312 \\ bcc,pt %%xcc, 1f
3413 \\ nop
35 \\ ba 2f
3614 \\ neg %%o0
3715 \\ 1:
38 \\ # Clear the child's %%o0
39 \\ dec %%o1
40 \\ and %%o1, %%o0, %%o0
41 \\ 2:
4216 : [ret] "={o0}" (-> u64),
43 : [number] "{g1}" (@intFromEnum(SYS.fork)),
17 : [number] "{g1}" (@intFromEnum(number)),
4418 : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
4519}
4620
47pub fn syscall0(number: SYS) u64 {
21pub fn syscall1(
22 number: SYS,
23 arg1: syscall_arg_t,
24) u64 {
4825 return asm volatile (
4926 \\ t 0x6d
5027 \\ bcc,pt %%xcc, 1f
......@@ -53,10 +30,15 @@ pub fn syscall0(number: SYS) u64 {
5330 \\ 1:
5431 : [ret] "={o0}" (-> u64),
5532 : [number] "{g1}" (@intFromEnum(number)),
33 [arg1] "{o0}" (arg1),
5634 : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
5735}
5836
59pub fn syscall1(number: SYS, arg1: u64) u64 {
37pub fn syscall2(
38 number: SYS,
39 arg1: syscall_arg_t,
40 arg2: syscall_arg_t,
41) u64 {
6042 return asm volatile (
6143 \\ t 0x6d
6244 \\ bcc,pt %%xcc, 1f
......@@ -66,10 +48,16 @@ pub fn syscall1(number: SYS, arg1: u64) u64 {
6648 : [ret] "={o0}" (-> u64),
6749 : [number] "{g1}" (@intFromEnum(number)),
6850 [arg1] "{o0}" (arg1),
51 [arg2] "{o1}" (arg2),
6952 : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
7053}
7154
72pub fn syscall2(number: SYS, arg1: u64, arg2: u64) u64 {
55pub fn syscall3(
56 number: SYS,
57 arg1: syscall_arg_t,
58 arg2: syscall_arg_t,
59 arg3: syscall_arg_t,
60) u64 {
7361 return asm volatile (
7462 \\ t 0x6d
7563 \\ bcc,pt %%xcc, 1f
......@@ -80,10 +68,17 @@ pub fn syscall2(number: SYS, arg1: u64, arg2: u64) u64 {
8068 : [number] "{g1}" (@intFromEnum(number)),
8169 [arg1] "{o0}" (arg1),
8270 [arg2] "{o1}" (arg2),
71 [arg3] "{o2}" (arg3),
8372 : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
8473}
8574
86pub fn syscall3(number: SYS, arg1: u64, arg2: u64, arg3: u64) u64 {
75pub fn syscall4(
76 number: SYS,
77 arg1: syscall_arg_t,
78 arg2: syscall_arg_t,
79 arg3: syscall_arg_t,
80 arg4: syscall_arg_t,
81) u64 {
8782 return asm volatile (
8883 \\ t 0x6d
8984 \\ bcc,pt %%xcc, 1f
......@@ -95,10 +90,18 @@ pub fn syscall3(number: SYS, arg1: u64, arg2: u64, arg3: u64) u64 {
9590 [arg1] "{o0}" (arg1),
9691 [arg2] "{o1}" (arg2),
9792 [arg3] "{o2}" (arg3),
93 [arg4] "{o3}" (arg4),
9894 : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
9995}
10096
101pub fn syscall4(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64) u64 {
97pub fn syscall5(
98 number: SYS,
99 arg1: syscall_arg_t,
100 arg2: syscall_arg_t,
101 arg3: syscall_arg_t,
102 arg4: syscall_arg_t,
103 arg5: syscall_arg_t,
104) u64 {
102105 return asm volatile (
103106 \\ t 0x6d
104107 \\ bcc,pt %%xcc, 1f
......@@ -111,10 +114,19 @@ pub fn syscall4(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64) u64 {
111114 [arg2] "{o1}" (arg2),
112115 [arg3] "{o2}" (arg3),
113116 [arg4] "{o3}" (arg4),
117 [arg5] "{o4}" (arg5),
114118 : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
115119}
116120
117pub fn syscall5(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64, arg5: u64) u64 {
121pub fn syscall6(
122 number: SYS,
123 arg1: syscall_arg_t,
124 arg2: syscall_arg_t,
125 arg3: syscall_arg_t,
126 arg4: syscall_arg_t,
127 arg5: syscall_arg_t,
128 arg6: syscall_arg_t,
129) u64 {
118130 return asm volatile (
119131 \\ t 0x6d
120132 \\ bcc,pt %%xcc, 1f
......@@ -128,32 +140,51 @@ pub fn syscall5(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64, arg5: u
128140 [arg3] "{o2}" (arg3),
129141 [arg4] "{o3}" (arg4),
130142 [arg5] "{o4}" (arg5),
143 [arg6] "{o5}" (arg6),
131144 : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
132145}
133146
134pub fn syscall6(
135 number: SYS,
136 arg1: u64,
137 arg2: u64,
138 arg3: u64,
139 arg4: u64,
140 arg5: u64,
141 arg6: u64,
147pub fn syscall_pipe(
148 fd: *[2]std.os.linux.fd_t,
142149) u64 {
150 return asm volatile (
151 \\ mov %[arg], %%g3
152 \\ t 0x6d
153 \\ bcc,pt %%xcc, 1f
154 \\ nop
155 \\ # Return the error code
156 \\ ba 2f
157 \\ neg %%o0
158 \\1:
159 \\ st %%o0, [%%g3+0]
160 \\ st %%o1, [%%g3+4]
161 \\ clr %%o0
162 \\2:
163 : [ret] "={o0}" (-> u64),
164 : [number] "{g1}" (@intFromEnum(SYS.pipe)),
165 [arg] "r" (fd),
166 : .{ .memory = true, .g3 = true });
167}
168
169pub fn syscall_fork() u64 {
170 // Linux/sparc64 fork() returns two values in %o0 and %o1:
171 // - On the parent's side, %o0 is the child's PID and %o1 is 0.
172 // - On the child's side, %o0 is the parent's PID and %o1 is 1.
173 // We need to clear the child's %o0 so that the return values
174 // conform to the libc convention.
143175 return asm volatile (
144176 \\ t 0x6d
145177 \\ bcc,pt %%xcc, 1f
146178 \\ nop
179 \\ ba 2f
147180 \\ neg %%o0
148181 \\ 1:
182 \\ # Clear the child's %%o0
183 \\ dec %%o1
184 \\ and %%o1, %%o0, %%o0
185 \\ 2:
149186 : [ret] "={o0}" (-> u64),
150 : [number] "{g1}" (@intFromEnum(number)),
151 [arg1] "{o0}" (arg1),
152 [arg2] "{o1}" (arg2),
153 [arg3] "{o2}" (arg3),
154 [arg4] "{o3}" (arg4),
155 [arg5] "{o4}" (arg5),
156 [arg6] "{o5}" (arg6),
187 : [number] "{g1}" (@intFromEnum(SYS.fork)),
157188 : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
158189}
159190
lib/std/os/linux/thumb.zig+52-36
......@@ -5,9 +5,14 @@
55//! to break the frame chain.
66const std = @import("../../std.zig");
77const SYS = std.os.linux.SYS;
8const arm = @import("arm.zig");
89
9pub fn syscall0(number: SYS) u32 {
10 var buf: [2]u32 = .{ @intFromEnum(number), undefined };
10pub const syscall_arg_t = arm.syscall_arg_t;
11
12pub fn syscall0(
13 number: SYS,
14) u32 {
15 var buf: [2]syscall_arg_t = .{ @intFromEnum(number), undefined };
1116 return asm volatile (
1217 \\ str r7, [%[tmp], #4]
1318 \\ ldr r7, [%[tmp]]
......@@ -18,8 +23,11 @@ pub fn syscall0(number: SYS) u32 {
1823 : .{ .memory = true });
1924}
2025
21pub fn syscall1(number: SYS, arg1: u32) u32 {
22 var buf: [2]u32 = .{ @intFromEnum(number), undefined };
26pub fn syscall1(
27 number: SYS,
28 arg1: syscall_arg_t,
29) u32 {
30 var buf: [2]syscall_arg_t = .{ @intFromEnum(number), undefined };
2331 return asm volatile (
2432 \\ str r7, [%[tmp], #4]
2533 \\ ldr r7, [%[tmp]]
......@@ -31,8 +39,12 @@ pub fn syscall1(number: SYS, arg1: u32) u32 {
3139 : .{ .memory = true });
3240}
3341
34pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {
35 var buf: [2]u32 = .{ @intFromEnum(number), undefined };
42pub fn syscall2(
43 number: SYS,
44 arg1: syscall_arg_t,
45 arg2: syscall_arg_t,
46) u32 {
47 var buf: [2]syscall_arg_t = .{ @intFromEnum(number), undefined };
3648 return asm volatile (
3749 \\ str r7, [%[tmp], #4]
3850 \\ ldr r7, [%[tmp]]
......@@ -45,8 +57,13 @@ pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {
4557 : .{ .memory = true });
4658}
4759
48pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {
49 var buf: [2]u32 = .{ @intFromEnum(number), undefined };
60pub fn syscall3(
61 number: SYS,
62 arg1: syscall_arg_t,
63 arg2: syscall_arg_t,
64 arg3: syscall_arg_t,
65) u32 {
66 var buf: [2]syscall_arg_t = .{ @intFromEnum(number), undefined };
5067 return asm volatile (
5168 \\ str r7, [%[tmp], #4]
5269 \\ ldr r7, [%[tmp]]
......@@ -60,8 +77,14 @@ pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {
6077 : .{ .memory = true });
6178}
6279
63pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {
64 var buf: [2]u32 = .{ @intFromEnum(number), undefined };
80pub fn syscall4(
81 number: SYS,
82 arg1: syscall_arg_t,
83 arg2: syscall_arg_t,
84 arg3: syscall_arg_t,
85 arg4: syscall_arg_t,
86) u32 {
87 var buf: [2]syscall_arg_t = .{ @intFromEnum(number), undefined };
6588 return asm volatile (
6689 \\ str r7, [%[tmp], #4]
6790 \\ ldr r7, [%[tmp]]
......@@ -76,8 +99,15 @@ pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {
7699 : .{ .memory = true });
77100}
78101
79pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u32) u32 {
80 var buf: [2]u32 = .{ @intFromEnum(number), undefined };
102pub fn syscall5(
103 number: SYS,
104 arg1: syscall_arg_t,
105 arg2: syscall_arg_t,
106 arg3: syscall_arg_t,
107 arg4: syscall_arg_t,
108 arg5: syscall_arg_t,
109) u32 {
110 var buf: [2]syscall_arg_t = .{ @intFromEnum(number), undefined };
81111 return asm volatile (
82112 \\ str r7, [%[tmp], #4]
83113 \\ ldr r7, [%[tmp]]
......@@ -95,14 +125,14 @@ pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u
95125
96126pub fn syscall6(
97127 number: SYS,
98 arg1: u32,
99 arg2: u32,
100 arg3: u32,
101 arg4: u32,
102 arg5: u32,
103 arg6: u32,
128 arg1: syscall_arg_t,
129 arg2: syscall_arg_t,
130 arg3: syscall_arg_t,
131 arg4: syscall_arg_t,
132 arg5: syscall_arg_t,
133 arg6: syscall_arg_t,
104134) u32 {
105 var buf: [2]u32 = .{ @intFromEnum(number), undefined };
135 var buf: [2]syscall_arg_t = .{ @intFromEnum(number), undefined };
106136 return asm volatile (
107137 \\ str r7, [%[tmp], #4]
108138 \\ ldr r7, [%[tmp]]
......@@ -119,22 +149,8 @@ pub fn syscall6(
119149 : .{ .memory = true });
120150}
121151
122pub const clone = @import("arm.zig").clone;
152pub const clone = arm.clone;
123153
124pub fn restore() callconv(.naked) noreturn {
125 asm volatile (
126 \\ mov r7, %[number]
127 \\ svc #0
128 :
129 : [number] "I" (@intFromEnum(SYS.sigreturn)),
130 );
131}
154pub const restore = arm.restore;
132155
133pub fn restore_rt() callconv(.naked) noreturn {
134 asm volatile (
135 \\ mov r7, %[number]
136 \\ svc #0
137 :
138 : [number] "I" (@intFromEnum(SYS.rt_sigreturn)),
139 );
140}
156pub const restore_rt = arm.restore_rt;
lib/std/os/linux/x32.zig+41-12
......@@ -2,14 +2,21 @@ const builtin = @import("builtin");
22const std = @import("../../std.zig");
33const SYS = std.os.linux.SYS;
44
5pub fn syscall0(number: SYS) u32 {
5pub const syscall_arg_t = u64;
6
7pub fn syscall0(
8 number: SYS,
9) u32 {
610 return asm volatile ("syscall"
711 : [ret] "={rax}" (-> u32),
812 : [number] "{rax}" (@intFromEnum(number)),
913 : .{ .rcx = true, .r11 = true, .memory = true });
1014}
1115
12pub fn syscall1(number: SYS, arg1: u32) u32 {
16pub fn syscall1(
17 number: SYS,
18 arg1: syscall_arg_t,
19) u32 {
1320 return asm volatile ("syscall"
1421 : [ret] "={rax}" (-> u32),
1522 : [number] "{rax}" (@intFromEnum(number)),
......@@ -17,7 +24,11 @@ pub fn syscall1(number: SYS, arg1: u32) u32 {
1724 : .{ .rcx = true, .r11 = true, .memory = true });
1825}
1926
20pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {
27pub fn syscall2(
28 number: SYS,
29 arg1: syscall_arg_t,
30 arg2: syscall_arg_t,
31) u32 {
2132 return asm volatile ("syscall"
2233 : [ret] "={rax}" (-> u32),
2334 : [number] "{rax}" (@intFromEnum(number)),
......@@ -26,7 +37,12 @@ pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {
2637 : .{ .rcx = true, .r11 = true, .memory = true });
2738}
2839
29pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {
40pub fn syscall3(
41 number: SYS,
42 arg1: syscall_arg_t,
43 arg2: syscall_arg_t,
44 arg3: syscall_arg_t,
45) u32 {
3046 return asm volatile ("syscall"
3147 : [ret] "={rax}" (-> u32),
3248 : [number] "{rax}" (@intFromEnum(number)),
......@@ -36,7 +52,13 @@ pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {
3652 : .{ .rcx = true, .r11 = true, .memory = true });
3753}
3854
39pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {
55pub fn syscall4(
56 number: SYS,
57 arg1: syscall_arg_t,
58 arg2: syscall_arg_t,
59 arg3: syscall_arg_t,
60 arg4: syscall_arg_t,
61) u32 {
4062 return asm volatile ("syscall"
4163 : [ret] "={rax}" (-> u32),
4264 : [number] "{rax}" (@intFromEnum(number)),
......@@ -47,7 +69,14 @@ pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {
4769 : .{ .rcx = true, .r11 = true, .memory = true });
4870}
4971
50pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u32) u32 {
72pub fn syscall5(
73 number: SYS,
74 arg1: syscall_arg_t,
75 arg2: syscall_arg_t,
76 arg3: syscall_arg_t,
77 arg4: syscall_arg_t,
78 arg5: syscall_arg_t,
79) u32 {
5180 return asm volatile ("syscall"
5281 : [ret] "={rax}" (-> u32),
5382 : [number] "{rax}" (@intFromEnum(number)),
......@@ -61,12 +90,12 @@ pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u
6190
6291pub fn syscall6(
6392 number: SYS,
64 arg1: u32,
65 arg2: u32,
66 arg3: u32,
67 arg4: u32,
68 arg5: u32,
69 arg6: u32,
93 arg1: syscall_arg_t,
94 arg2: syscall_arg_t,
95 arg3: syscall_arg_t,
96 arg4: syscall_arg_t,
97 arg5: syscall_arg_t,
98 arg6: syscall_arg_t,
7099) u32 {
71100 return asm volatile ("syscall"
72101 : [ret] "={rax}" (-> u32),
lib/std/os/linux/x86.zig+42-13
......@@ -2,14 +2,21 @@ const builtin = @import("builtin");
22const std = @import("../../std.zig");
33const SYS = std.os.linux.SYS;
44
5pub fn syscall0(number: SYS) u32 {
5pub const syscall_arg_t = u32;
6
7pub fn syscall0(
8 number: SYS,
9) u32 {
610 return asm volatile ("int $0x80"
711 : [ret] "={eax}" (-> u32),
812 : [number] "{eax}" (@intFromEnum(number)),
913 : .{ .memory = true });
1014}
1115
12pub fn syscall1(number: SYS, arg1: u32) u32 {
16pub fn syscall1(
17 number: SYS,
18 arg1: syscall_arg_t,
19) u32 {
1320 return asm volatile ("int $0x80"
1421 : [ret] "={eax}" (-> u32),
1522 : [number] "{eax}" (@intFromEnum(number)),
......@@ -17,7 +24,11 @@ pub fn syscall1(number: SYS, arg1: u32) u32 {
1724 : .{ .memory = true });
1825}
1926
20pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {
27pub fn syscall2(
28 number: SYS,
29 arg1: syscall_arg_t,
30 arg2: syscall_arg_t,
31) u32 {
2132 return asm volatile ("int $0x80"
2233 : [ret] "={eax}" (-> u32),
2334 : [number] "{eax}" (@intFromEnum(number)),
......@@ -26,7 +37,12 @@ pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {
2637 : .{ .memory = true });
2738}
2839
29pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {
40pub fn syscall3(
41 number: SYS,
42 arg1: syscall_arg_t,
43 arg2: syscall_arg_t,
44 arg3: syscall_arg_t,
45) u32 {
3046 return asm volatile ("int $0x80"
3147 : [ret] "={eax}" (-> u32),
3248 : [number] "{eax}" (@intFromEnum(number)),
......@@ -36,7 +52,13 @@ pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {
3652 : .{ .memory = true });
3753}
3854
39pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {
55pub fn syscall4(
56 number: SYS,
57 arg1: syscall_arg_t,
58 arg2: syscall_arg_t,
59 arg3: syscall_arg_t,
60 arg4: syscall_arg_t,
61) u32 {
4062 return asm volatile ("int $0x80"
4163 : [ret] "={eax}" (-> u32),
4264 : [number] "{eax}" (@intFromEnum(number)),
......@@ -47,7 +69,14 @@ pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {
4769 : .{ .memory = true });
4870}
4971
50pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u32) u32 {
72pub fn syscall5(
73 number: SYS,
74 arg1: syscall_arg_t,
75 arg2: syscall_arg_t,
76 arg3: syscall_arg_t,
77 arg4: syscall_arg_t,
78 arg5: syscall_arg_t,
79) u32 {
5180 return asm volatile ("int $0x80"
5281 : [ret] "={eax}" (-> u32),
5382 : [number] "{eax}" (@intFromEnum(number)),
......@@ -61,12 +90,12 @@ pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u
6190
6291pub fn syscall6(
6392 number: SYS,
64 arg1: u32,
65 arg2: u32,
66 arg3: u32,
67 arg4: u32,
68 arg5: u32,
69 arg6: u32,
93 arg1: syscall_arg_t,
94 arg2: syscall_arg_t,
95 arg3: syscall_arg_t,
96 arg4: syscall_arg_t,
97 arg5: syscall_arg_t,
98 arg6: syscall_arg_t,
7099) u32 {
71100 // arg6 can't be passed to asm in a register because ebp might be reserved as the frame pointer
72101 // and there are no more GPRs available; so we'll need a memory operand for it. Adding that
......@@ -74,7 +103,7 @@ pub fn syscall6(
74103 // *its* own GPR, so we need to pass another arg in memory too! This is surprisingly hard to get
75104 // right, because we can't touch esp or ebp until we're done with the memory input (as that
76105 // input could be relative to esp or ebp).
77 const args56: [2]u32 = .{ arg5, arg6 };
106 const args56: [2]syscall_arg_t = .{ arg5, arg6 };
78107 return asm volatile (
79108 \\ push %[args56]
80109 \\ push %%ebp
lib/std/os/linux/x86_64.zig+41-12
......@@ -2,14 +2,21 @@ const builtin = @import("builtin");
22const std = @import("../../std.zig");
33const SYS = std.os.linux.SYS;
44
5pub fn syscall0(number: SYS) u64 {
5pub const syscall_arg_t = u64;
6
7pub fn syscall0(
8 number: SYS,
9) u64 {
610 return asm volatile ("syscall"
711 : [ret] "={rax}" (-> u64),
812 : [number] "{rax}" (@intFromEnum(number)),
913 : .{ .rcx = true, .r11 = true, .memory = true });
1014}
1115
12pub fn syscall1(number: SYS, arg1: u64) u64 {
16pub fn syscall1(
17 number: SYS,
18 arg1: syscall_arg_t,
19) u64 {
1320 return asm volatile ("syscall"
1421 : [ret] "={rax}" (-> u64),
1522 : [number] "{rax}" (@intFromEnum(number)),
......@@ -17,7 +24,11 @@ pub fn syscall1(number: SYS, arg1: u64) u64 {
1724 : .{ .rcx = true, .r11 = true, .memory = true });
1825}
1926
20pub fn syscall2(number: SYS, arg1: u64, arg2: u64) u64 {
27pub fn syscall2(
28 number: SYS,
29 arg1: syscall_arg_t,
30 arg2: syscall_arg_t,
31) u64 {
2132 return asm volatile ("syscall"
2233 : [ret] "={rax}" (-> u64),
2334 : [number] "{rax}" (@intFromEnum(number)),
......@@ -26,7 +37,12 @@ pub fn syscall2(number: SYS, arg1: u64, arg2: u64) u64 {
2637 : .{ .rcx = true, .r11 = true, .memory = true });
2738}
2839
29pub fn syscall3(number: SYS, arg1: u64, arg2: u64, arg3: u64) u64 {
40pub fn syscall3(
41 number: SYS,
42 arg1: syscall_arg_t,
43 arg2: syscall_arg_t,
44 arg3: syscall_arg_t,
45) u64 {
3046 return asm volatile ("syscall"
3147 : [ret] "={rax}" (-> u64),
3248 : [number] "{rax}" (@intFromEnum(number)),
......@@ -36,7 +52,13 @@ pub fn syscall3(number: SYS, arg1: u64, arg2: u64, arg3: u64) u64 {
3652 : .{ .rcx = true, .r11 = true, .memory = true });
3753}
3854
39pub fn syscall4(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64) u64 {
55pub fn syscall4(
56 number: SYS,
57 arg1: syscall_arg_t,
58 arg2: syscall_arg_t,
59 arg3: syscall_arg_t,
60 arg4: syscall_arg_t,
61) u64 {
4062 return asm volatile ("syscall"
4163 : [ret] "={rax}" (-> u64),
4264 : [number] "{rax}" (@intFromEnum(number)),
......@@ -47,7 +69,14 @@ pub fn syscall4(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64) u64 {
4769 : .{ .rcx = true, .r11 = true, .memory = true });
4870}
4971
50pub fn syscall5(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64, arg5: u64) u64 {
72pub fn syscall5(
73 number: SYS,
74 arg1: syscall_arg_t,
75 arg2: syscall_arg_t,
76 arg3: syscall_arg_t,
77 arg4: syscall_arg_t,
78 arg5: syscall_arg_t,
79) u64 {
5180 return asm volatile ("syscall"
5281 : [ret] "={rax}" (-> u64),
5382 : [number] "{rax}" (@intFromEnum(number)),
......@@ -61,12 +90,12 @@ pub fn syscall5(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64, arg5: u
6190
6291pub fn syscall6(
6392 number: SYS,
64 arg1: u64,
65 arg2: u64,
66 arg3: u64,
67 arg4: u64,
68 arg5: u64,
69 arg6: u64,
93 arg1: syscall_arg_t,
94 arg2: syscall_arg_t,
95 arg3: syscall_arg_t,
96 arg4: syscall_arg_t,
97 arg5: syscall_arg_t,
98 arg6: syscall_arg_t,
7099) u64 {
71100 return asm volatile ("syscall"
72101 : [ret] "={rax}" (-> u64),