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 {...@@ -16,7 +16,7 @@ comptime {
16}16}
1717
18fn fallocateLinux(fd: c_int, mode: c_int, offset: off_t, len: off_t) callconv(.c) c_int {18fn 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));
20}20}
2121
22fn posix_fadviseLinux(fd: c_int, offset: off_t, len: off_t, advice: c_int) callconv(.c) c_int {22fn 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...@@ -10035,10 +10035,10 @@ fn fileSeekBy(userdata: ?*anyopaque, file: File, offset: i64) File.SeekError!voi
10035 if (posix.SEEK == void) return error.Unseekable;10035 if (posix.SEEK == void) return error.Unseekable;
1003610036
10037 if (native_os == .linux and !builtin.link_libc and @sizeOf(usize) == 4) {10037 if (native_os == .linux and !builtin.link_libc and @sizeOf(usize) == 4) {
10038 var result: u64 = undefined;10038 var result: i64 = undefined;
10039 const syscall: Syscall = try .start();10039 const syscall: Syscall = try .start();
10040 while (true) {10040 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))) {
10042 .SUCCESS => {10042 .SUCCESS => {
10043 syscall.finish();10043 syscall.finish();
10044 return;10044 return;
...@@ -10149,8 +10149,8 @@ fn posixSeekTo(fd: posix.fd_t, offset: u64) File.SeekError!void {...@@ -10149,8 +10149,8 @@ fn posixSeekTo(fd: posix.fd_t, offset: u64) File.SeekError!void {
10149 if (native_os == .linux and !builtin.link_libc and @sizeOf(usize) == 4) {10149 if (native_os == .linux and !builtin.link_libc and @sizeOf(usize) == 4) {
10150 const syscall: Syscall = try .start();10150 const syscall: Syscall = try .start();
10151 while (true) {10151 while (true) {
10152 var result: u64 = undefined;10152 var result: i64 = undefined;
10153 switch (posix.errno(posix.system.llseek(fd, offset, &result, posix.SEEK.SET))) {10153 switch (posix.errno(posix.system.llseek(fd, @bitCast(offset), &result, posix.SEEK.SET))) {
10154 .SUCCESS => {10154 .SUCCESS => {
10155 syscall.finish();10155 syscall.finish();
10156 return;10156 return;
...@@ -15247,7 +15247,7 @@ fn childWaitPosix(child: *process.Child) process.Child.WaitError!process.Child.T...@@ -15247,7 +15247,7 @@ fn childWaitPosix(child: *process.Child) process.Child.WaitError!process.Child.T
15247 const ru_ptr = if (child.request_resource_usage_statistics) &ru else null;15247 const ru_ptr = if (child.request_resource_usage_statistics) &ru else null;
1524815248
15249 if (have_wait4) {15249 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;
15251 const syscall: Syscall = try .start();15251 const syscall: Syscall = try .start();
15252 while (true) switch (posix.errno(posix.system.wait4(pid, &status, 0, ru_ptr))) {15252 while (true) switch (posix.errno(posix.system.wait4(pid, &status, 0, ru_ptr))) {
15253 .SUCCESS => {15253 .SUCCESS => {
...@@ -15290,7 +15290,7 @@ fn childWaitPosix(child: *process.Child) process.Child.WaitError!process.Child.T...@@ -15290,7 +15290,7 @@ fn childWaitPosix(child: *process.Child) process.Child.WaitError!process.Child.T
15290 };15290 };
15291 }15291 }
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;
15294 const syscall: Syscall = try .start();15294 const syscall: Syscall = try .start();
15295 while (true) switch (posix.errno(posix.system.waitpid(pid, &status, 0))) {15295 while (true) switch (posix.errno(posix.system.waitpid(pid, &status, 0))) {
15296 .SUCCESS => {15296 .SUCCESS => {
...@@ -15332,7 +15332,7 @@ fn childKillPosix(child: *process.Child) !void {...@@ -15332,7 +15332,7 @@ fn childKillPosix(child: *process.Child) !void {
15332 };15332 };
1533315333
15334 if (have_wait4) {15334 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;
15336 while (true) switch (posix.errno(posix.system.wait4(pid, &status, 0, null))) {15336 while (true) switch (posix.errno(posix.system.wait4(pid, &status, 0, null))) {
15337 .SUCCESS => return,15337 .SUCCESS => return,
15338 .INTR => continue,15338 .INTR => continue,
...@@ -15352,7 +15352,7 @@ fn childKillPosix(child: *process.Child) !void {...@@ -15352,7 +15352,7 @@ fn childKillPosix(child: *process.Child) !void {
15352 };15352 };
15353 }15353 }
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;
15356 while (true) switch (posix.errno(posix.system.waitpid(pid, &status, 0))) {15356 while (true) switch (posix.errno(posix.system.waitpid(pid, &status, 0))) {
15357 .SUCCESS => return,15357 .SUCCESS => return,
15358 .INTR => continue,15358 .INTR => continue,
lib/std/os/linux.zig+383-422
...@@ -59,6 +59,7 @@ const arch_bits = switch (native_arch) {...@@ -59,6 +59,7 @@ const arch_bits = switch (native_arch) {
5959
60const syscall_bits = if (native_arch.isThumb()) @import("linux/thumb.zig") else arch_bits;60const syscall_bits = if (native_arch.isThumb()) @import("linux/thumb.zig") else arch_bits;
6161
62pub const syscall_arg_t = syscall_bits.syscall_arg_t;
62pub const syscall0 = syscall_bits.syscall0;63pub const syscall0 = syscall_bits.syscall0;
63pub const syscall1 = syscall_bits.syscall1;64pub const syscall1 = syscall_bits.syscall1;
64pub const syscall2 = syscall_bits.syscall2;65pub const syscall2 = syscall_bits.syscall2;
...@@ -78,9 +79,9 @@ pub fn clone(...@@ -78,9 +79,9 @@ pub fn clone(
78 stack: usize,79 stack: usize,
79 flags: u32,80 flags: u32,
80 arg: usize,81 arg: usize,
81 ptid: ?*i32,82 ptid: ?*pid_t,
82 tp: usize, // aka tls83 tp: usize, // aka tls
83 ctid: ?*i32,84 ctid: ?*pid_t,
84) usize {85) usize {
85 // Can't directly call a naked function; cast to C calling convention first.86 // Can't directly call a naked function; cast to C calling convention first.
86 return @as(*const fn (87 return @as(*const fn (
...@@ -88,9 +89,9 @@ pub fn clone(...@@ -88,9 +89,9 @@ pub fn clone(
88 usize,89 usize,
89 u32,90 u32,
90 usize,91 usize,
91 ?*i32,92 ?*pid_t,
92 usize,93 usize,
93 ?*i32,94 ?*pid_t,
94 ) callconv(.c) usize, @ptrCast(&syscall_bits.clone))(func, stack, flags, arg, ptid, tp, ctid);95 ) callconv(.c) usize, @ptrCast(&syscall_bits.clone))(func, stack, flags, arg, ptid, tp, ctid);
95}96}
9697
...@@ -98,6 +99,8 @@ pub const ARCH = arch_bits.ARCH;...@@ -98,6 +99,8 @@ pub const ARCH = arch_bits.ARCH;
98pub const HWCAP = arch_bits.HWCAP;99pub const HWCAP = arch_bits.HWCAP;
99pub const SC = arch_bits.SC;100pub const SC = arch_bits.SC;
100pub const VDSO = arch_bits.VDSO;101pub const VDSO = arch_bits.VDSO;
102pub const user_desc = arch_bits.user_desc;
103
101pub const blkcnt_t = u64;104pub const blkcnt_t = u64;
102pub const blksize_t = u32;105pub const blksize_t = u32;
103pub const dev_t = u64;106pub const dev_t = u64;
...@@ -105,8 +108,13 @@ pub const ino_t = u64;...@@ -105,8 +108,13 @@ pub const ino_t = u64;
105pub const mode_t = u32;108pub const mode_t = u32;
106pub const nlink_t = u32;109pub const nlink_t = u32;
107pub const off_t = i64;110pub 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;
108pub const time_t = arch_bits.time_t;117pub const time_t = arch_bits.time_t;
109pub const user_desc = arch_bits.user_desc;
110118
111pub const tls = @import("linux/tls.zig");119pub const tls = @import("linux/tls.zig");
112pub const BPF = @import("linux/bpf.zig");120pub const BPF = @import("linux/bpf.zig");
...@@ -613,13 +621,13 @@ pub fn brk(addr: usize) usize {...@@ -613,13 +621,13 @@ pub fn brk(addr: usize) usize {
613 return syscall1(.brk, addr);621 return syscall1(.brk, addr);
614}622}
615623
616pub fn dup(old: i32) usize {624pub fn dup(old: fd_t) usize {
617 return syscall1(.dup, @as(usize, @bitCast(@as(isize, old))));625 return syscall1(.dup, @as(u32, @bitCast(old)));
618}626}
619627
620pub fn dup2(old: i32, new: i32) usize {628pub fn dup2(old: fd_t, new: fd_t) usize {
621 if (@hasField(SYS, "dup2")) {629 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)));
623 } else {631 } else {
624 if (old == new) {632 if (old == new) {
625 if (std.debug.runtime_safety) {633 if (std.debug.runtime_safety) {
...@@ -628,13 +636,13 @@ pub fn dup2(old: i32, new: i32) usize {...@@ -628,13 +636,13 @@ pub fn dup2(old: i32, new: i32) usize {
628 }636 }
629 return @as(usize, @intCast(old));637 return @as(usize, @intCast(old));
630 } else {638 } 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);
632 }640 }
633 }641 }
634}642}
635643
636pub fn dup3(old: i32, new: i32, flags: u32) usize {644pub fn dup3(old: fd_t, new: fd_t, flags: u32) usize {
637 return syscall3(.dup3, @as(usize, @bitCast(@as(isize, old))), @as(usize, @bitCast(@as(isize, new))), flags);645 return syscall3(.dup3, @as(u32, @bitCast(old)), @as(u32, @bitCast(new)), flags);
638}646}
639647
640pub fn chdir(path: [*:0]const u8) usize {648pub fn chdir(path: [*:0]const u8) usize {
...@@ -642,7 +650,7 @@ pub fn chdir(path: [*:0]const u8) usize {...@@ -642,7 +650,7 @@ pub fn chdir(path: [*:0]const u8) usize {
642}650}
643651
644pub fn fchdir(fd: fd_t) usize {652pub fn fchdir(fd: fd_t) usize {
645 return syscall1(.fchdir, @as(usize, @bitCast(@as(isize, fd))));653 return syscall1(.fchdir, @as(u32, @bitCast(fd)));
646}654}
647655
648pub fn chroot(path: [*:0]const u8) usize {656pub fn chroot(path: [*:0]const u8) usize {
...@@ -664,7 +672,7 @@ pub const EXECVEAT = packed struct(u32) {...@@ -664,7 +672,7 @@ pub const EXECVEAT = packed struct(u32) {
664};672};
665673
666pub fn execveat(dirfd: fd_t, path: [*:0]const u8, argv: [*:null]const ?[*:0]const u8, envp: [*:null]const ?[*:0]const u8, flags: EXECVEAT) usize {674pub 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)));
668}676}
669677
670pub fn fork() usize {678pub fn fork() usize {
...@@ -686,28 +694,28 @@ pub inline fn vfork() usize {...@@ -686,28 +694,28 @@ pub inline fn vfork() usize {
686 return @call(.always_inline, syscall0, .{.vfork});694 return @call(.always_inline, syscall0, .{.vfork});
687}695}
688696
689pub fn futimens(fd: i32, times: ?*const [2]timespec) usize {697pub fn futimens(fd: fd_t, times: ?*const [2]timespec) usize {
690 return utimensat(fd, null, times, 0);698 return utimensat(fd, null, times, 0);
691}699}
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 {
694 return syscall4(702 return syscall4(
695 if (@hasField(SYS, "utimensat") and native_arch != .hexagon) .utimensat else .utimensat_time64,703 if (@hasField(SYS, "utimensat") and native_arch != .hexagon) .utimensat else .utimensat_time64,
696 @as(usize, @bitCast(@as(isize, dirfd))),704 @as(u32, @bitCast(dirfd)),
697 @intFromPtr(path),705 @intFromPtr(path),
698 @intFromPtr(times),706 @intFromPtr(times),
699 flags,707 flags,
700 );708 );
701}709}
702710
703pub fn fallocate(fd: i32, mode: i32, offset: i64, length: i64) usize {711pub fn fallocate(fd: fd_t, mode: mode_t, offset: off_t, length: off_t) usize {
704 if (usize_bits < 64) {712 if (@sizeOf(syscall_arg_t) < @sizeOf(u64)) {
705 const offset_halves = splitValue64(offset);713 const offset_halves = splitValue64(offset);
706 const length_halves = splitValue64(length);714 const length_halves = splitValue64(length);
707 return syscall6(715 return syscall6(
708 .fallocate,716 .fallocate,
709 @as(usize, @bitCast(@as(isize, fd))),717 @as(u32, @bitCast(fd)),
710 @as(usize, @bitCast(@as(isize, mode))),718 mode,
711 offset_halves[0],719 offset_halves[0],
712 offset_halves[1],720 offset_halves[1],
713 length_halves[0],721 length_halves[0],
...@@ -716,8 +724,8 @@ pub fn fallocate(fd: i32, mode: i32, offset: i64, length: i64) usize {...@@ -716,8 +724,8 @@ pub fn fallocate(fd: i32, mode: i32, offset: i64, length: i64) usize {
716 } else {724 } else {
717 return syscall4(725 return syscall4(
718 .fallocate,726 .fallocate,
719 @as(usize, @bitCast(@as(isize, fd))),727 @as(u32, @bitCast(fd)),
720 @as(usize, @bitCast(@as(isize, mode))),728 mode,
721 @as(u64, @bitCast(offset)),729 @as(u64, @bitCast(offset)),
722 @as(u64, @bitCast(length)),730 @as(u64, @bitCast(length)),
723 );731 );
...@@ -888,19 +896,19 @@ pub fn getcwd(buf: [*]u8, size: usize) usize {...@@ -888,19 +896,19 @@ pub fn getcwd(buf: [*]u8, size: usize) usize {
888 return syscall2(.getcwd, @intFromPtr(buf), size);896 return syscall2(.getcwd, @intFromPtr(buf), size);
889}897}
890898
891pub fn getdents(fd: i32, dirp: [*]u8, len: usize) usize {899pub fn getdents(fd: fd_t, dirp: [*]u8, len: usize) usize {
892 return syscall3(900 return syscall3(
893 .getdents,901 .getdents,
894 @as(usize, @bitCast(@as(isize, fd))),902 @as(u32, @bitCast(fd)),
895 @intFromPtr(dirp),903 @intFromPtr(dirp),
896 @min(len, maxInt(c_int)),904 @min(len, maxInt(c_int)),
897 );905 );
898}906}
899907
900pub fn getdents64(fd: i32, dirp: [*]u8, len: usize) usize {908pub fn getdents64(fd: fd_t, dirp: [*]u8, len: usize) usize {
901 return syscall3(909 return syscall3(
902 .getdents64,910 .getdents64,
903 @as(usize, @bitCast(@as(isize, fd))),911 @as(u32, @bitCast(fd)),
904 @intFromPtr(dirp),912 @intFromPtr(dirp),
905 @min(len, maxInt(c_int)),913 @min(len, maxInt(c_int)),
906 );914 );
...@@ -910,12 +918,12 @@ pub fn inotify_init1(flags: u32) usize {...@@ -910,12 +918,12 @@ pub fn inotify_init1(flags: u32) usize {
910 return syscall1(.inotify_init1, flags);918 return syscall1(.inotify_init1, flags);
911}919}
912920
913pub fn inotify_add_watch(fd: i32, pathname: [*:0]const u8, mask: u32) usize {921pub fn inotify_add_watch(fd: fd_t, pathname: [*:0]const u8, mask: u32) usize {
914 return syscall3(.inotify_add_watch, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(pathname), mask);922 return syscall3(.inotify_add_watch, @as(u32, @bitCast(fd)), @intFromPtr(pathname), mask);
915}923}
916924
917pub fn inotify_rm_watch(fd: i32, wd: i32) usize {925pub fn inotify_rm_watch(fd: fd_t, wd: fd_t) usize {
918 return syscall2(.inotify_rm_watch, @as(usize, @bitCast(@as(isize, fd))), @as(usize, @bitCast(@as(isize, wd))));926 return syscall2(.inotify_rm_watch, @as(u32, @bitCast(fd)), @as(u32, @bitCast(wd)));
919}927}
920928
921pub fn fanotify_init(flags: fanotify.InitFlags, event_f_flags: u32) usize {929pub fn fanotify_init(flags: fanotify.InitFlags, event_f_flags: u32) usize {
...@@ -929,24 +937,24 @@ pub fn fanotify_mark(...@@ -929,24 +937,24 @@ pub fn fanotify_mark(
929 dirfd: fd_t,937 dirfd: fd_t,
930 pathname: ?[*:0]const u8,938 pathname: ?[*:0]const u8,
931) usize {939) usize {
932 if (usize_bits < 64) {940 if (@sizeOf(syscall_arg_t) < @sizeOf(u64)) {
933 const mask_halves = splitValue64(@bitCast(mask));941 const mask_halves = splitValue64(@bitCast(mask));
934 return syscall6(942 return syscall6(
935 .fanotify_mark,943 .fanotify_mark,
936 @bitCast(@as(isize, fd)),944 @as(u32, @bitCast(fd)),
937 @as(u32, @bitCast(flags)),945 @as(u32, @bitCast(flags)),
938 mask_halves[0],946 mask_halves[0],
939 mask_halves[1],947 mask_halves[1],
940 @bitCast(@as(isize, dirfd)),948 @as(u32, @bitCast(dirfd)),
941 @intFromPtr(pathname),949 @intFromPtr(pathname),
942 );950 );
943 } else {951 } else {
944 return syscall5(952 return syscall5(
945 .fanotify_mark,953 .fanotify_mark,
946 @bitCast(@as(isize, fd)),954 @as(u32, @bitCast(fd)),
947 @as(u32, @bitCast(flags)),955 @as(u32, @bitCast(flags)),
948 @bitCast(mask),956 @as(u64, @bitCast(mask)),
949 @bitCast(@as(isize, dirfd)),957 @as(u32, @bitCast(dirfd)),
950 @intFromPtr(pathname),958 @intFromPtr(pathname),
951 );959 );
952 }960 }
...@@ -955,7 +963,7 @@ pub fn fanotify_mark(...@@ -955,7 +963,7 @@ pub fn fanotify_mark(
955pub fn name_to_handle_at(963pub fn name_to_handle_at(
956 dirfd: fd_t,964 dirfd: fd_t,
957 pathname: [*:0]const u8,965 pathname: [*:0]const u8,
958 handle: *std.os.linux.file_handle,966 handle: *file_handle,
959 mount_id: *i32,967 mount_id: *i32,
960 flags: u32,968 flags: u32,
961) usize {969) usize {
...@@ -973,27 +981,27 @@ pub fn readlink(noalias path: [*:0]const u8, noalias buf_ptr: [*]u8, buf_len: us...@@ -973,27 +981,27 @@ pub fn readlink(noalias path: [*:0]const u8, noalias buf_ptr: [*]u8, buf_len: us
973 if (@hasField(SYS, "readlink")) {981 if (@hasField(SYS, "readlink")) {
974 return syscall3(.readlink, @intFromPtr(path), @intFromPtr(buf_ptr), buf_len);982 return syscall3(.readlink, @intFromPtr(path), @intFromPtr(buf_ptr), buf_len);
975 } else {983 } 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);
977 }985 }
978}986}
979987
980pub fn readlinkat(dirfd: i32, noalias path: [*:0]const u8, noalias buf_ptr: [*]u8, buf_len: usize) usize {988pub fn readlinkat(dirfd: fd_t, 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);989 return syscall4(.readlinkat, @as(u32, @bitCast(dirfd)), @intFromPtr(path), @intFromPtr(buf_ptr), buf_len);
982}990}
983991
984pub fn mkdir(path: [*:0]const u8, mode: mode_t) usize {992pub fn mkdir(path: [*:0]const u8, mode: mode_t) usize {
985 if (@hasField(SYS, "mkdir")) {993 if (@hasField(SYS, "mkdir")) {
986 return syscall2(.mkdir, @intFromPtr(path), mode);994 return syscall2(.mkdir, @intFromPtr(path), mode);
987 } else {995 } 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);
989 }997 }
990}998}
991999
992pub fn mkdirat(dirfd: i32, path: [*:0]const u8, mode: mode_t) usize {1000pub fn mkdirat(dirfd: fd_t, path: [*:0]const u8, mode: mode_t) usize {
993 return syscall3(.mkdirat, @as(usize, @bitCast(@as(isize, dirfd))), @intFromPtr(path), mode);1001 return syscall3(.mkdirat, @as(u32, @bitCast(dirfd)), @intFromPtr(path), mode);
994}1002}
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 {
997 if (@hasField(SYS, "mknod")) {1005 if (@hasField(SYS, "mknod")) {
998 return syscall3(.mknod, @intFromPtr(path), mode, dev);1006 return syscall3(.mknod, @intFromPtr(path), mode, dev);
999 } else {1007 } else {
...@@ -1001,8 +1009,8 @@ pub fn mknod(path: [*:0]const u8, mode: u32, dev: u32) usize {...@@ -1001,8 +1009,8 @@ pub fn mknod(path: [*:0]const u8, mode: u32, dev: u32) usize {
1001 }1009 }
1002}1010}
10031011
1004pub fn mknodat(dirfd: i32, path: [*:0]const u8, mode: u32, dev: u32) usize {1012pub fn mknodat(dirfd: dev_t, path: [*:0]const u8, mode: mode_t, dev: dev_t) usize {
1005 return syscall4(.mknodat, @as(usize, @bitCast(@as(isize, dirfd))), @intFromPtr(path), mode, dev);1013 return syscall4(.mknodat, @as(u32, @bitCast(dirfd)), @intFromPtr(path), mode, dev);
1006}1014}
10071015
1008pub fn mount(special: ?[*:0]const u8, dir: [*:0]const u8, fstype: ?[*:0]const u8, flags: u32, data: usize) usize {1016pub 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) {...@@ -1038,7 +1046,14 @@ pub const MOVE_MOUNT = packed struct(u32) {
1038};1046};
10391047
1040pub 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 {1048pub 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 );
1042}1057}
10431058
1044pub const MOUNT_ATTR = packed struct(u32) {1059pub const MOUNT_ATTR = packed struct(u32) {
...@@ -1070,7 +1085,7 @@ pub const MOUNT_ATTR = packed struct(u32) {...@@ -1070,7 +1085,7 @@ pub const MOUNT_ATTR = packed struct(u32) {
1070};1085};
10711086
1072pub fn mount_setattr(dirfd: fd_t, path: [*:0]const u8, flags: MOUNT_ATTR) usize {1087pub 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)));
1074}1089}
10751090
1076pub const FSOPEN = packed struct(u32) {1091pub const FSOPEN = packed struct(u32) {
...@@ -1103,7 +1118,7 @@ pub const FSCONFIG_CMD = enum(u32) {...@@ -1103,7 +1118,7 @@ pub const FSCONFIG_CMD = enum(u32) {
1103};1118};
11041119
1105pub fn fsconfig(fd: fd_t, cmd: FSCONFIG_CMD, key: ?[*:0]const u8, value: ?[*:0]const u8, aux: u32) usize {1120pub 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);
1107}1122}
11081123
1109pub const FSMOUNT = packed struct(u32) {1124pub const FSMOUNT = packed struct(u32) {
...@@ -1113,7 +1128,7 @@ pub const FSMOUNT = packed struct(u32) {...@@ -1113,7 +1128,7 @@ pub const FSMOUNT = packed struct(u32) {
1113};1128};
11141129
1115pub fn fsmount(fsfd: fd_t, flags: FSMOUNT, attr_flags: MOUNT_ATTR) usize {1130pub 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)));
1117}1132}
11181133
1119pub const FSPICK = packed struct(u32) {1134pub const FSPICK = packed struct(u32) {
...@@ -1126,7 +1141,7 @@ pub const FSPICK = packed struct(u32) {...@@ -1126,7 +1141,7 @@ pub const FSPICK = packed struct(u32) {
1126};1141};
11271142
1128pub fn fspick(dirfd: fd_t, path: [*:0]const u8, flags: FSPICK) usize {1143pub 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)));
1130}1145}
11311146
1132pub fn pivot_root(new_root: [*:0]const u8, put_old: [*:0]const u8) usize {1147pub fn pivot_root(new_root: [*:0]const u8, put_old: [*:0]const u8) usize {
...@@ -1141,7 +1156,7 @@ fn mmap2Unit() u64 {...@@ -1141,7 +1156,7 @@ fn mmap2Unit() u64 {
1141 };1156 };
1142}1157}
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 {
1145 if (@hasField(SYS, "mmap2")) {1160 if (@hasField(SYS, "mmap2")) {
1146 return syscall6(1161 return syscall6(
1147 .mmap2,1162 .mmap2,
...@@ -1149,7 +1164,7 @@ pub fn mmap(address: ?[*]u8, length: usize, prot: PROT, flags: MAP, fd: i32, off...@@ -1149,7 +1164,7 @@ pub fn mmap(address: ?[*]u8, length: usize, prot: PROT, flags: MAP, fd: i32, off
1149 length,1164 length,
1150 @as(u32, @bitCast(prot)),1165 @as(u32, @bitCast(prot)),
1151 @as(u32, @bitCast(flags)),1166 @as(u32, @bitCast(flags)),
1152 @bitCast(@as(isize, fd)),1167 @as(u32, @bitCast(fd)),
1153 @truncate(@as(u64, @bitCast(offset)) / mmap2Unit()),1168 @truncate(@as(u64, @bitCast(offset)) / mmap2Unit()),
1154 );1169 );
1155 } else {1170 } else {
...@@ -1162,7 +1177,7 @@ pub fn mmap(address: ?[*]u8, length: usize, prot: PROT, flags: MAP, fd: i32, off...@@ -1162,7 +1177,7 @@ pub fn mmap(address: ?[*]u8, length: usize, prot: PROT, flags: MAP, fd: i32, off
1162 length,1177 length,
1163 @as(u32, @bitCast(prot)),1178 @as(u32, @bitCast(prot)),
1164 @as(u32, @bitCast(flags)),1179 @as(u32, @bitCast(flags)),
1165 @bitCast(@as(isize, fd)),1180 @as(u32, @bitCast(fd)),
1166 @as(u64, @bitCast(offset)),1181 @as(u64, @bitCast(offset)),
1167 }),1182 }),
1168 ) else syscall6(1183 ) else syscall6(
...@@ -1171,7 +1186,7 @@ pub fn mmap(address: ?[*]u8, length: usize, prot: PROT, flags: MAP, fd: i32, off...@@ -1171,7 +1186,7 @@ pub fn mmap(address: ?[*]u8, length: usize, prot: PROT, flags: MAP, fd: i32, off
1171 length,1186 length,
1172 @as(u32, @bitCast(prot)),1187 @as(u32, @bitCast(prot)),
1173 @as(u32, @bitCast(flags)),1188 @as(u32, @bitCast(flags)),
1174 @bitCast(@as(isize, fd)),1189 @as(u32, @bitCast(fd)),
1175 @as(u64, @bitCast(offset)),1190 @as(u64, @bitCast(offset)),
1176 );1191 );
1177 }1192 }
...@@ -1278,70 +1293,142 @@ pub fn ppoll(fds: [*]pollfd, n: nfds_t, timeout: ?*timespec, sigmask: ?*const si...@@ -1278,70 +1293,142 @@ pub fn ppoll(fds: [*]pollfd, n: nfds_t, timeout: ?*timespec, sigmask: ?*const si
1278 );1293 );
1279}1294}
12801295
1281pub fn read(fd: i32, buf: [*]u8, count: usize) usize {1296pub fn read(fd: fd_t, buf: [*]u8, count: usize) usize {
1282 return syscall3(.read, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(buf), count);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);
1283}1336}
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 {
1286 const offset_u: u64 = @bitCast(offset);1339 const offset_u: u64 = @bitCast(offset);
1287 return syscall5(1340 return syscall5(
1288 .preadv,1341 .preadv,
1289 @as(usize, @bitCast(@as(isize, fd))),1342 @as(u32, @bitCast(fd)),
1290 @intFromPtr(iov),1343 @intFromPtr(iov),
1291 count,1344 count,
1292 // Kernel expects the offset is split into largest natural word-size.1345 // Kernel expects the offset is split into largest natural word-size.
1293 // See following link for detail:1346 // See following link for detail:
1294 // https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=601cc11d054ae4b5e9b5babec3d8e4667a2cb9b51347 // https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=601cc11d054ae4b5e9b5babec3d8e4667a2cb9b5
1295 @as(usize, @truncate(offset_u)),1348 @truncate(offset_u),
1296 if (usize_bits < 64) @as(usize, @truncate(offset_u >> 32)) else 0,1349 if (@sizeOf(syscall_arg_t) < @sizeOf(u64)) @truncate(offset_u >> 32) else 0,
1297 );1350 );
1298}1351}
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 {
1301 const offset_u: u64 = @bitCast(offset);1354 const offset_u: u64 = @bitCast(offset);
1302 return syscall6(1355 return syscall6(
1303 .preadv2,1356 .preadv2,
1304 @as(usize, @bitCast(@as(isize, fd))),1357 @as(u32, @bitCast(fd)),
1305 @intFromPtr(iov),1358 @intFromPtr(iov),
1306 count,1359 count,
1307 // See comments in preadv1360 // See comments in preadv
1308 @as(usize, @truncate(offset_u)),1361 @truncate(offset_u),
1309 if (usize_bits < 64) @as(usize, @truncate(offset_u >> 32)) else 0,1362 if (@sizeOf(syscall_arg_t) < @sizeOf(u64)) @truncate(offset_u >> 32) else 0,
1310 flags,1363 flags,
1311 );1364 );
1312}1365}
13131366
1314pub fn readv(fd: i32, iov: [*]const iovec, count: usize) usize {1367pub fn write(fd: fd_t, buf: [*]const u8, count: usize) usize {
1315 return syscall3(.readv, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(iov), count);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 }
1316}1403}
13171404
1318pub fn writev(fd: i32, iov: [*]const iovec_const, count: usize) usize {1405pub fn writev(fd: fd_t, iov: [*]const iovec_const, count: usize) usize {
1319 return syscall3(.writev, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(iov), count);1406 return syscall3(.writev, @as(u32, @bitCast(fd)), @intFromPtr(iov), count);
1320}1407}
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 {
1323 const offset_u: u64 = @bitCast(offset);1410 const offset_u: u64 = @bitCast(offset);
1324 return syscall5(1411 return syscall5(
1325 .pwritev,1412 .pwritev,
1326 @as(usize, @bitCast(@as(isize, fd))),1413 @as(u32, @bitCast(fd)),
1327 @intFromPtr(iov),1414 @intFromPtr(iov),
1328 count,1415 count,
1329 // See comments in preadv1416 // See comments in preadv
1330 @as(usize, @truncate(offset_u)),1417 @truncate(offset_u),
1331 if (usize_bits < 64) @as(usize, @truncate(offset_u >> 32)) else 0,1418 if (@sizeOf(syscall_arg_t) < @sizeOf(u64)) @truncate(offset_u >> 32) else 0,
1332 );1419 );
1333}1420}
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 {
1336 const offset_u: u64 = @bitCast(offset);1423 const offset_u: u64 = @bitCast(offset);
1337 return syscall6(1424 return syscall6(
1338 .pwritev2,1425 .pwritev2,
1339 @as(usize, @bitCast(@as(isize, fd))),1426 @as(u32, @bitCast(fd)),
1340 @intFromPtr(iov),1427 @intFromPtr(iov),
1341 count,1428 count,
1342 // See comments in preadv1429 // See comments in preadv
1343 @as(usize, @truncate(offset_u)),1430 @truncate(offset_u),
1344 if (usize_bits < 64) @as(usize, @truncate(offset_u >> 32)) else 0,1431 if (@sizeOf(syscall_arg_t) < @sizeOf(u64)) @truncate(offset_u >> 32) else 0,
1345 flags,1432 flags,
1346 );1433 );
1347}1434}
...@@ -1350,7 +1437,7 @@ pub fn rmdir(path: [*:0]const u8) usize {...@@ -1350,7 +1437,7 @@ pub fn rmdir(path: [*:0]const u8) usize {
1350 if (@hasField(SYS, "rmdir")) {1437 if (@hasField(SYS, "rmdir")) {
1351 return syscall1(.rmdir, @intFromPtr(path));1438 return syscall1(.rmdir, @intFromPtr(path));
1352 } else {1439 } 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);
1354 }1441 }
1355}1442}
13561443
...@@ -1358,54 +1445,15 @@ pub fn symlink(existing: [*:0]const u8, new: [*:0]const u8) usize {...@@ -1358,54 +1445,15 @@ pub fn symlink(existing: [*:0]const u8, new: [*:0]const u8) usize {
1358 if (@hasField(SYS, "symlink")) {1445 if (@hasField(SYS, "symlink")) {
1359 return syscall2(.symlink, @intFromPtr(existing), @intFromPtr(new));1446 return syscall2(.symlink, @intFromPtr(existing), @intFromPtr(new));
1360 } else {1447 } 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));
1362 }1449 }
1363}1450}
13641451
1365pub fn symlinkat(existing: [*:0]const u8, newfd: i32, newpath: [*:0]const u8) usize {1452pub fn symlinkat(existing: [*:0]const u8, newfd: fd_t, newpath: [*:0]const u8) usize {
1366 return syscall3(.symlinkat, @intFromPtr(existing), @as(usize, @bitCast(@as(isize, newfd))), @intFromPtr(newpath));1453 return syscall3(.symlinkat, @intFromPtr(existing), @as(u32, @bitCast(newfd)), @intFromPtr(newpath));
1367}1454}
13681455
1369pub fn pread(fd: i32, buf: [*]u8, count: usize, offset: i64) usize {1456pub fn access(path: [*:0]const u8, mode: mode_t) 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 {
1409 if (@hasField(SYS, "access")) {1457 if (@hasField(SYS, "access")) {
1410 return syscall2(.access, @intFromPtr(path), mode);1458 return syscall2(.access, @intFromPtr(path), mode);
1411 } else {1459 } else {
...@@ -1413,19 +1461,19 @@ pub fn access(path: [*:0]const u8, mode: u32) usize {...@@ -1413,19 +1461,19 @@ pub fn access(path: [*:0]const u8, mode: u32) usize {
1413 }1461 }
1414}1462}
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 {
1417 if (flags == 0) {1465 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);
1419 }1467 }
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);
1421}1469}
14221470
1423pub fn acct(path: [*:0]const u8) usize {1471pub fn acct(path: [*:0]const u8) usize {
1424 return syscall1(.acct, @intFromPtr(path));1472 return syscall1(.acct, @intFromPtr(path));
1425}1473}
14261474
1427pub fn pipe(fd: *[2]i32) usize {1475pub fn pipe(fd: *[2]fd_t) usize {
1428 if (comptime (native_arch.isMIPS() or native_arch.isSPARC())) {1476 if (native_arch.isMIPS() or native_arch.isSPARC()) {
1429 return syscall_pipe(fd);1477 return syscall_pipe(fd);
1430 } else if (@hasField(SYS, "pipe")) {1478 } else if (@hasField(SYS, "pipe")) {
1431 return syscall1(.pipe, @intFromPtr(fd));1479 return syscall1(.pipe, @intFromPtr(fd));
...@@ -1434,21 +1482,17 @@ pub fn pipe(fd: *[2]i32) usize {...@@ -1434,21 +1482,17 @@ pub fn pipe(fd: *[2]i32) usize {
1434 }1482 }
1435}1483}
14361484
1437pub fn pipe2(fd: *[2]i32, flags: O) usize {1485pub fn pipe2(fd: *[2]fd_t, flags: O) usize {
1438 return syscall2(.pipe2, @intFromPtr(fd), @as(u32, @bitCast(flags)));1486 return syscall2(.pipe2, @intFromPtr(fd), @as(u32, @bitCast(flags)));
1439}1487}
14401488
1441pub fn write(fd: i32, buf: [*]const u8, count: usize) usize {1489pub fn ftruncate(fd: fd_t, length: off_t) usize {
1442 return syscall3(.write, @bitCast(@as(isize, fd)), @intFromPtr(buf), count);1490 if (@sizeOf(syscall_arg_t) < @sizeOf(u64)) {
1443}
1444
1445pub fn ftruncate(fd: i32, length: i64) usize {
1446 if (@hasField(SYS, "ftruncate64") and usize_bits < 64) {
1447 const length_halves = splitValue64(length);1491 const length_halves = splitValue64(length);
1448 if (require_aligned_register_pair) {1492 if (require_aligned_register_pair) {
1449 return syscall4(1493 return syscall4(
1450 .ftruncate64,1494 .ftruncate64,
1451 @as(usize, @bitCast(@as(isize, fd))),1495 @as(u32, @bitCast(fd)),
1452 0,1496 0,
1453 length_halves[0],1497 length_halves[0],
1454 length_halves[1],1498 length_halves[1],
...@@ -1456,7 +1500,7 @@ pub fn ftruncate(fd: i32, length: i64) usize {...@@ -1456,7 +1500,7 @@ pub fn ftruncate(fd: i32, length: i64) usize {
1456 } else {1500 } else {
1457 return syscall3(1501 return syscall3(
1458 .ftruncate64,1502 .ftruncate64,
1459 @as(usize, @bitCast(@as(isize, fd))),1503 @as(u32, @bitCast(fd)),
1460 length_halves[0],1504 length_halves[0],
1461 length_halves[1],1505 length_halves[1],
1462 );1506 );
...@@ -1464,48 +1508,8 @@ pub fn ftruncate(fd: i32, length: i64) usize {...@@ -1464,48 +1508,8 @@ pub fn ftruncate(fd: i32, length: i64) usize {
1464 } else {1508 } else {
1465 return syscall2(1509 return syscall2(
1466 .ftruncate,1510 .ftruncate,
1467 @as(usize, @bitCast(@as(isize, fd))),1511 @as(u32, @bitCast(fd)),
1468 @as(usize, @bitCast(length)),1512 @as(u64, @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)),
1509 );1513 );
1510 }1514 }
1511}1515}
...@@ -1516,50 +1520,50 @@ pub fn rename(old: [*:0]const u8, new: [*:0]const u8) usize {...@@ -1516,50 +1520,50 @@ pub fn rename(old: [*:0]const u8, new: [*:0]const u8) usize {
1516 } else if (@hasField(SYS, "renameat")) {1520 } else if (@hasField(SYS, "renameat")) {
1517 return syscall4(1521 return syscall4(
1518 .renameat,1522 .renameat,
1519 @as(usize, @bitCast(@as(isize, AT.FDCWD))),1523 @as(u32, @bitCast(@as(i32, AT.FDCWD))),
1520 @intFromPtr(old),1524 @intFromPtr(old),
1521 @as(usize, @bitCast(@as(isize, AT.FDCWD))),1525 @as(u32, @bitCast(@as(i32, AT.FDCWD))),
1522 @intFromPtr(new),1526 @intFromPtr(new),
1523 );1527 );
1524 } else {1528 } else {
1525 return syscall5(1529 return syscall5(
1526 .renameat2,1530 .renameat2,
1527 @as(usize, @bitCast(@as(isize, AT.FDCWD))),1531 @as(u32, @bitCast(@as(i32, AT.FDCWD))),
1528 @intFromPtr(old),1532 @intFromPtr(old),
1529 @as(usize, @bitCast(@as(isize, AT.FDCWD))),1533 @as(u32, @bitCast(@as(i32, AT.FDCWD))),
1530 @intFromPtr(new),1534 @intFromPtr(new),
1531 0,1535 0,
1532 );1536 );
1533 }1537 }
1534}1538}
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 {
1537 if (@hasField(SYS, "renameat")) {1541 if (@hasField(SYS, "renameat")) {
1538 return syscall4(1542 return syscall4(
1539 .renameat,1543 .renameat,
1540 @as(usize, @bitCast(@as(isize, oldfd))),1544 @as(u32, @bitCast(oldfd)),
1541 @intFromPtr(oldpath),1545 @intFromPtr(oldpath),
1542 @as(usize, @bitCast(@as(isize, newfd))),1546 @as(u32, @bitCast(newfd)),
1543 @intFromPtr(newpath),1547 @intFromPtr(newpath),
1544 );1548 );
1545 } else {1549 } else {
1546 return syscall5(1550 return syscall5(
1547 .renameat2,1551 .renameat2,
1548 @as(usize, @bitCast(@as(isize, oldfd))),1552 @as(u32, @bitCast(oldfd)),
1549 @intFromPtr(oldpath),1553 @intFromPtr(oldpath),
1550 @as(usize, @bitCast(@as(isize, newfd))),1554 @as(u32, @bitCast(newfd)),
1551 @intFromPtr(newpath),1555 @intFromPtr(newpath),
1552 0,1556 0,
1553 );1557 );
1554 }1558 }
1555}1559}
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 {
1558 return syscall5(1562 return syscall5(
1559 .renameat2,1563 .renameat2,
1560 @as(usize, @bitCast(@as(isize, oldfd))),1564 @as(u32, @bitCast(oldfd)),
1561 @intFromPtr(oldpath),1565 @intFromPtr(oldpath),
1562 @as(usize, @bitCast(@as(isize, newfd))),1566 @as(u32, @bitCast(newfd)),
1563 @intFromPtr(newpath),1567 @intFromPtr(newpath),
1564 @as(u32, @bitCast(flags)),1568 @as(u32, @bitCast(flags)),
1565 );1569 );
...@@ -1571,7 +1575,7 @@ pub fn open(path: [*:0]const u8, flags: O, perm: mode_t) usize {...@@ -1571,7 +1575,7 @@ pub fn open(path: [*:0]const u8, flags: O, perm: mode_t) usize {
1571 } else {1575 } else {
1572 return syscall4(1576 return syscall4(
1573 .openat,1577 .openat,
1574 @bitCast(@as(isize, AT.FDCWD)),1578 @as(u32, @bitCast(@as(i32, AT.FDCWD))),
1575 @intFromPtr(path),1579 @intFromPtr(path),
1576 @as(u32, @bitCast(flags)),1580 @as(u32, @bitCast(flags)),
1577 perm,1581 perm,
...@@ -1583,13 +1587,13 @@ pub fn create(path: [*:0]const u8, perm: mode_t) usize {...@@ -1583,13 +1587,13 @@ pub fn create(path: [*:0]const u8, perm: mode_t) usize {
1583 return syscall2(.creat, @intFromPtr(path), perm);1587 return syscall2(.creat, @intFromPtr(path), perm);
1584}1588}
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 {
1587 // dirfd could be negative, for example AT.FDCWD is -1001591 // 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);
1589}1593}
15901594
1591/// See also `clone` (from the arch-specific include)1595/// 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 {
1593 return syscall5(.clone, flags, child_stack_ptr, @intFromPtr(parent_tid), @intFromPtr(child_tid), newtls);1597 return syscall5(.clone, flags, child_stack_ptr, @intFromPtr(parent_tid), @intFromPtr(child_tid), newtls);
1594}1598}
15951599
...@@ -1604,7 +1608,7 @@ pub fn set_tid_address(tidptr: ?*pid_t) pid_t {...@@ -1604,7 +1608,7 @@ pub fn set_tid_address(tidptr: ?*pid_t) pid_t {
1604}1608}
16051609
1606pub fn close(fd: fd_t) usize {1610pub fn close(fd: fd_t) usize {
1607 return syscall1(.close, @as(usize, @bitCast(@as(isize, fd))));1611 return syscall1(.close, @as(u32, @bitCast(fd)));
1608}1612}
16091613
1610pub const CLOSE_RANGE = packed struct(u32) {1614pub const CLOSE_RANGE = packed struct(u32) {
...@@ -1616,11 +1620,11 @@ pub const CLOSE_RANGE = packed struct(u32) {...@@ -1616,11 +1620,11 @@ pub const CLOSE_RANGE = packed struct(u32) {
1616};1620};
16171621
1618pub fn close_range(first: fd_t, last: fd_t, flags: CLOSE_RANGE) usize {1622pub 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)));
1620}1624}
16211625
1622pub fn fchmod(fd: i32, mode: mode_t) usize {1626pub fn fchmod(fd: fd_t, mode: mode_t) usize {
1623 return syscall2(.fchmod, @as(usize, @bitCast(@as(isize, fd))), mode);1627 return syscall2(.fchmod, @as(u32, @bitCast(fd)), mode);
1624}1628}
16251629
1626pub fn chmod(path: [*:0]const u8, mode: mode_t) usize {1630pub 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 {...@@ -1631,16 +1635,16 @@ pub fn chmod(path: [*:0]const u8, mode: mode_t) usize {
1631 }1635 }
1632}1636}
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 {
1635 if (@hasField(SYS, "fchown32")) {1639 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);
1637 } else {1641 } else {
1638 return syscall3(.fchown, @as(usize, @bitCast(@as(isize, fd))), owner, group);1642 return syscall3(.fchown, @as(u32, @bitCast(fd)), owner, group);
1639 }1643 }
1640}1644}
16411645
1642pub fn fchownat(fd: i32, path: [*:0]const u8, owner: uid_t, group: gid_t, flags: u32) usize {1646pub fn fchownat(fd: fd_t, 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);1647 return syscall5(.fchownat, @as(u32, @bitCast(fd)), @intFromPtr(path), owner, group, flags);
1644}1648}
16451649
1646pub fn chown(path: [*:0]const u8, owner: uid_t, group: gid_t) usize {1650pub 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 {...@@ -1663,40 +1667,40 @@ pub fn lchown(path: [*:0]const u8, owner: uid_t, group: gid_t) usize {
1663 }1667 }
1664}1668}
16651669
1666pub fn fchmodat(fd: i32, path: [*:0]const u8, mode: mode_t) usize {1670pub fn fchmodat(fd: fd_t, path: [*:0]const u8, mode: mode_t) usize {
1667 return syscall3(.fchmodat, @bitCast(@as(isize, fd)), @intFromPtr(path), mode);1671 return syscall3(.fchmodat, @as(u32, @bitCast(fd)), @intFromPtr(path), mode);
1668}1672}
16691673
1670pub fn fchmodat2(fd: i32, path: [*:0]const u8, mode: mode_t, flags: u32) usize {1674pub fn fchmodat2(fd: fd_t, path: [*:0]const u8, mode: mode_t, flags: u32) usize {
1671 return syscall4(.fchmodat2, @bitCast(@as(isize, fd)), @intFromPtr(path), mode, flags);1675 return syscall4(.fchmodat2, @as(u32, @bitCast(fd)), @intFromPtr(path), mode, flags);
1672}1676}
16731677
1674/// Can only be called on 32 bit systems. For 64 bit see `lseek`.1678/// 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 {
1676 // NOTE: The offset parameter splitting is independent from the target1680 // NOTE: The offset parameter splitting is independent from the target
1677 // endianness.1681 // endianness.
1678 return syscall5(1682 return syscall5(
1679 .llseek,1683 .llseek,
1680 @as(usize, @bitCast(@as(isize, fd))),1684 @as(u32, @bitCast(fd)),
1681 @as(usize, @truncate(offset >> 32)),1685 @truncate(@as(u64, @bitCast(offset >> 32))),
1682 @as(usize, @truncate(offset)),1686 @truncate(@as(u64, @bitCast(offset))),
1683 @intFromPtr(result),1687 @intFromPtr(result),
1684 whence,1688 whence,
1685 );1689 );
1686}1690}
16871691
1688/// Can only be called on 64 bit systems. For 32 bit see `llseek`.1692/// Can only be called on 64 bit systems. For 32 bit see `llseek`.
1689pub fn lseek(fd: i32, offset: i64, whence: usize) usize {1693pub fn lseek(fd: fd_t, offset: off_t, whence: u32) usize {
1690 return syscall3(.lseek, @as(usize, @bitCast(@as(isize, fd))), @as(usize, @bitCast(offset)), whence);1694 return syscall3(.lseek, @as(u32, @bitCast(fd)), @as(u64, @bitCast(offset)), whence);
1691}1695}
16921696
1693pub fn exit(status: i32) noreturn {1697pub fn exit(status: i32) noreturn {
1694 _ = syscall1(.exit, @as(usize, @bitCast(@as(isize, status))));1698 _ = syscall1(.exit, @as(u32, @bitCast(status)));
1695 unreachable;1699 unreachable;
1696}1700}
16971701
1698pub fn exit_group(status: i32) noreturn {1702pub fn exit_group(status: i32) noreturn {
1699 _ = syscall1(.exit_group, @as(usize, @bitCast(@as(isize, status))));1703 _ = syscall1(.exit_group, @as(u32, @bitCast(status)));
1700 unreachable;1704 unreachable;
1701}1705}
17021706
...@@ -1762,15 +1766,15 @@ pub fn getrandom(buf: [*]u8, count: usize, flags: u32) usize {...@@ -1762,15 +1766,15 @@ pub fn getrandom(buf: [*]u8, count: usize, flags: u32) usize {
1762}1766}
17631767
1764pub fn kill(pid: pid_t, sig: SIG) usize {1768pub 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));
1766}1770}
17671771
1768pub fn tkill(tid: pid_t, sig: SIG) usize {1772pub 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));
1770}1774}
17711775
1772pub fn tgkill(tgid: pid_t, tid: pid_t, sig: SIG) usize {1776pub 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));
1774}1778}
17751779
1776pub fn link(oldpath: [*:0]const u8, newpath: [*:0]const u8) usize {1780pub 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 {...@@ -1783,9 +1787,9 @@ pub fn link(oldpath: [*:0]const u8, newpath: [*:0]const u8) usize {
1783 } else {1787 } else {
1784 return syscall5(1788 return syscall5(
1785 .linkat,1789 .linkat,
1786 @as(usize, @bitCast(@as(isize, AT.FDCWD))),1790 @as(u32, @bitCast(@as(i32, AT.FDCWD))),
1787 @intFromPtr(oldpath),1791 @intFromPtr(oldpath),
1788 @as(usize, @bitCast(@as(isize, AT.FDCWD))),1792 @as(u32, @bitCast(@as(i32, AT.FDCWD))),
1789 @intFromPtr(newpath),1793 @intFromPtr(newpath),
1790 0,1794 0,
1791 );1795 );
...@@ -1795,9 +1799,9 @@ pub fn link(oldpath: [*:0]const u8, newpath: [*:0]const u8) usize {...@@ -1795,9 +1799,9 @@ pub fn link(oldpath: [*:0]const u8, newpath: [*:0]const u8) usize {
1795pub fn linkat(oldfd: fd_t, oldpath: [*:0]const u8, newfd: fd_t, newpath: [*:0]const u8, flags: u32) usize {1799pub fn linkat(oldfd: fd_t, oldpath: [*:0]const u8, newfd: fd_t, newpath: [*:0]const u8, flags: u32) usize {
1796 return syscall5(1800 return syscall5(
1797 .linkat,1801 .linkat,
1798 @as(usize, @bitCast(@as(isize, oldfd))),1802 @as(u32, @bitCast(oldfd)),
1799 @intFromPtr(oldpath),1803 @intFromPtr(oldpath),
1800 @as(usize, @bitCast(@as(isize, newfd))),1804 @as(u32, @bitCast(newfd)),
1801 @intFromPtr(newpath),1805 @intFromPtr(newpath),
1802 flags,1806 flags,
1803 );1807 );
...@@ -1807,33 +1811,33 @@ pub fn unlink(path: [*:0]const u8) usize {...@@ -1807,33 +1811,33 @@ pub fn unlink(path: [*:0]const u8) usize {
1807 if (@hasField(SYS, "unlink")) {1811 if (@hasField(SYS, "unlink")) {
1808 return syscall1(.unlink, @intFromPtr(path));1812 return syscall1(.unlink, @intFromPtr(path));
1809 } else {1813 } 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);
1811 }1815 }
1812}1816}
18131817
1814pub fn unlinkat(dirfd: i32, path: [*:0]const u8, flags: u32) usize {1818pub fn unlinkat(dirfd: fd_t, path: [*:0]const u8, flags: u32) usize {
1815 return syscall3(.unlinkat, @as(usize, @bitCast(@as(isize, dirfd))), @intFromPtr(path), flags);1819 return syscall3(.unlinkat, @as(u32, @bitCast(dirfd)), @intFromPtr(path), flags);
1816}1820}
18171821
1818pub fn waitpid(pid: pid_t, status: *u32, flags: u32) usize {1822pub fn waitpid(pid: pid_t, status: *i32, flags: u32) usize {
1819 return syscall4(.wait4, @as(usize, @bitCast(@as(isize, pid))), @intFromPtr(status), flags, 0);1823 return syscall4(.wait4, @as(u32, @bitCast(pid)), @intFromPtr(status), flags, 0);
1820}1824}
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 {
1823 return syscall4(1827 return syscall4(
1824 .wait4,1828 .wait4,
1825 @as(usize, @bitCast(@as(isize, pid))),1829 @as(u32, @bitCast(pid)),
1826 @intFromPtr(status),1830 @intFromPtr(status),
1827 flags,1831 flags,
1828 @intFromPtr(usage),1832 @intFromPtr(usage),
1829 );1833 );
1830}1834}
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 {
1833 return syscall5(1837 return syscall5(
1834 .waitid,1838 .waitid,
1835 @intFromEnum(id_type),1839 @intFromEnum(id_type),
1836 @as(usize, @bitCast(@as(isize, id))),1840 @as(u32, @bitCast(id)),
1837 @intFromPtr(infop),1841 @intFromPtr(infop),
1838 flags,1842 flags,
1839 @intFromPtr(usage),1843 @intFromPtr(usage),
...@@ -1932,14 +1936,14 @@ pub const Flock = extern struct {...@@ -1932,14 +1936,14 @@ pub const Flock = extern struct {
19321936
1933pub fn fcntl(fd: fd_t, cmd: i32, arg: usize) usize {1937pub fn fcntl(fd: fd_t, cmd: i32, arg: usize) usize {
1934 if (@hasField(SYS, "fcntl64")) {1938 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);
1936 } else {1940 } 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);
1938 }1942 }
1939}1943}
19401944
1941pub fn flock(fd: fd_t, operation: i32) usize {1945pub 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)));
1943}1947}
19441948
1945pub const Elf_Symndx = if (native_arch == .s390x) u64 else u32;1949pub 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 {...@@ -1979,7 +1983,7 @@ fn init_vdso_clock_gettime(clk: clockid_t, ts: *timespec) callconv(.c) usize {
1979pub fn clock_getres(clk_id: clockid_t, tp: *timespec) usize {1983pub fn clock_getres(clk_id: clockid_t, tp: *timespec) usize {
1980 return syscall2(1984 return syscall2(
1981 if (@hasField(SYS, "clock_getres") and native_arch != .hexagon) .clock_getres else .clock_getres_time64,1985 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),
1983 @intFromPtr(tp),1987 @intFromPtr(tp),
1984 );1988 );
1985}1989}
...@@ -1987,7 +1991,7 @@ pub fn clock_getres(clk_id: clockid_t, tp: *timespec) usize {...@@ -1987,7 +1991,7 @@ pub fn clock_getres(clk_id: clockid_t, tp: *timespec) usize {
1987pub fn clock_settime(clk_id: clockid_t, tp: *const timespec) usize {1991pub fn clock_settime(clk_id: clockid_t, tp: *const timespec) usize {
1988 return syscall2(1992 return syscall2(
1989 if (@hasField(SYS, "clock_settime") and native_arch != .hexagon) .clock_settime else .clock_settime64,1993 if (@hasField(SYS, "clock_settime") and native_arch != .hexagon) .clock_settime else .clock_settime64,
1990 @as(usize, @intFromEnum(clk_id)),1994 @intFromEnum(clk_id),
1991 @intFromPtr(tp),1995 @intFromPtr(tp),
1992 );1996 );
1993}1997}
...@@ -2141,11 +2145,11 @@ pub fn setresgid(rgid: gid_t, egid: gid_t, sgid: gid_t) usize {...@@ -2141,11 +2145,11 @@ pub fn setresgid(rgid: gid_t, egid: gid_t, sgid: gid_t) usize {
2141}2145}
21422146
2143pub fn setpgid(pid: pid_t, pgid: pid_t) usize {2147pub 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)));
2145}2149}
21462150
2147pub fn getpgid(pid: pid_t) usize {2151pub fn getpgid(pid: pid_t) usize {
2148 return syscall1(.getpgid, @intCast(pid));2152 return syscall1(.getpgid, @as(u32, @bitCast(pid)));
2149}2153}
21502154
2151pub fn getgroups(size: usize, list: ?[*]gid_t) usize {2155pub fn getgroups(size: usize, list: ?[*]gid_t) usize {
...@@ -2169,7 +2173,7 @@ pub fn setsid() usize {...@@ -2169,7 +2173,7 @@ pub fn setsid() usize {
2169}2173}
21702174
2171pub fn getsid(pid: pid_t) usize {2175pub fn getsid(pid: pid_t) usize {
2172 return syscall1(.getsid, @intCast(pid));2176 return syscall1(.getsid, @as(u32, @bitCast(pid)));
2173}2177}
21742178
2175pub fn getpid() pid_t {2179pub fn getpid() pid_t {
...@@ -2240,8 +2244,6 @@ pub fn sigaction(sig: SIG, noalias act: ?*const Sigaction, noalias oact: ?*Sigac...@@ -2240,8 +2244,6 @@ pub fn sigaction(sig: SIG, noalias act: ?*const Sigaction, noalias oact: ?*Sigac
2240 return 0;2244 return 0;
2241}2245}
22422246
2243const usize_bits = @typeInfo(usize).int.bits;
2244
2245/// Defined as one greater than the largest defined signal number.2247/// Defined as one greater than the largest defined signal number.
2246pub const NSIG = if (is_mips) 128 else 65;2248pub const NSIG = if (is_mips) 128 else 65;
22472249
...@@ -2302,18 +2304,18 @@ pub fn sigismember(set: *const sigset_t, sig: SIG) bool {...@@ -2302,18 +2304,18 @@ pub fn sigismember(set: *const sigset_t, sig: SIG) bool {
2302 return ((set.*)[index.word] & index.mask) != 0;2304 return ((set.*)[index.word] & index.mask) != 0;
2303}2305}
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 {
2306 if (native_arch == .x86) {2308 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) });
2308 }2310 }
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));
2310}2312}
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 {
2313 if (native_arch == .x86) {2315 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) });
2315 }2317 }
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));
2317}2319}
23182320
2319pub fn socket(domain: u32, socket_type: u32, protocol: u32) usize {2321pub 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 {...@@ -2323,58 +2325,52 @@ pub fn socket(domain: u32, socket_type: u32, protocol: u32) usize {
2323 return syscall3(.socket, domain, socket_type, protocol);2325 return syscall3(.socket, domain, socket_type, protocol);
2324}2326}
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 {
2327 if (native_arch == .x86) {2329 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)) });
2329 }2331 }
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)));
2331}2333}
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 {
2334 if (native_arch == .x86) {2336 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) });
2336 }2338 }
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));
2338}2340}
23392341
2340pub fn sendmsg(fd: i32, msg: *const msghdr_const, flags: u32) usize {2342pub fn sendmsg(fd: fd_t, msg: *const msghdr_const, flags: u32) usize {
2341 const fd_usize = @as(usize, @bitCast(@as(isize, fd)));
2342 const msg_usize = @intFromPtr(msg);
2343 if (native_arch == .x86) {2343 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 });
2345 } else {2345 } else {
2346 return syscall3(.sendmsg, fd_usize, msg_usize, flags);2346 return syscall3(.sendmsg, @as(u32, @bitCast(fd)), @intFromPtr(msg), flags);
2347 }2347 }
2348}2348}
23492349
2350pub fn sendmmsg(fd: i32, msgvec: [*]mmsghdr, vlen: u32, flags: u32) usize {2350pub fn sendmmsg(fd: fd_t, msgvec: [*]mmsghdr, vlen: u32, flags: u32) usize {
2351 return syscall4(.sendmmsg, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(msgvec), vlen, flags);2351 return syscall4(.sendmmsg, @as(u32, @bitCast(fd)), @intFromPtr(msgvec), vlen, flags);
2352}2352}
23532353
2354pub fn connect(fd: i32, addr: *const anyopaque, len: socklen_t) usize {2354pub fn connect(fd: fd_t, addr: *const anyopaque, len: socklen_t) usize {
2355 const fd_usize = @as(usize, @bitCast(@as(isize, fd)));
2356 const addr_usize = @intFromPtr(addr);
2357 if (native_arch == .x86) {2355 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 });
2359 } else {2357 } else {
2360 return syscall3(.connect, fd_usize, addr_usize, len);2358 return syscall3(.connect, @as(u32, @bitCast(fd)), @intFromPtr(addr), len);
2361 }2359 }
2362}2360}
23632361
2364pub fn recvmsg(fd: i32, msg: *msghdr, flags: u32) usize {2362pub fn recvmsg(fd: fd_t, msg: *msghdr, flags: u32) usize {
2365 const fd_usize = @as(usize, @bitCast(@as(isize, fd)));
2366 const msg_usize = @intFromPtr(msg);
2367 if (native_arch == .x86) {2363 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 });
2369 } else {2365 } else {
2370 return syscall3(.recvmsg, fd_usize, msg_usize, flags);2366 return syscall3(.recvmsg, @as(u32, @bitCast(fd)), @intFromPtr(msg), flags);
2371 }2367 }
2372}2368}
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 {
2375 return syscall5(2371 return syscall5(
2376 if (@hasField(SYS, "recvmmsg") and native_arch != .hexagon) .recvmmsg else .recvmmsg_time64,2372 if (@hasField(SYS, "recvmmsg") and native_arch != .hexagon) .recvmmsg else .recvmmsg_time64,
2377 @as(usize, @bitCast(@as(isize, fd))),2373 @as(u32, @bitCast(fd)),
2378 @intFromPtr(msgvec),2374 @intFromPtr(msgvec),
2379 vlen,2375 vlen,
2380 flags,2376 flags,
...@@ -2383,43 +2379,39 @@ pub fn recvmmsg(fd: i32, msgvec: ?[*]mmsghdr, vlen: u32, flags: u32, timeout: ?*...@@ -2383,43 +2379,39 @@ pub fn recvmmsg(fd: i32, msgvec: ?[*]mmsghdr, vlen: u32, flags: u32, timeout: ?*
2383}2379}
23842380
2385pub fn recvfrom(2381pub fn recvfrom(
2386 fd: i32,2382 fd: fd_t,
2387 noalias buf: [*]u8,2383 noalias buf: [*]u8,
2388 len: usize,2384 len: usize,
2389 flags: u32,2385 flags: u32,
2390 noalias addr: ?*sockaddr,2386 noalias addr: ?*sockaddr,
2391 noalias alen: ?*socklen_t,2387 noalias alen: ?*socklen_t,
2392) usize {2388) 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);
2397 if (native_arch == .x86) {2389 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) });
2399 } else {2391 } 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));
2401 }2393 }
2402}2394}
24032395
2404pub fn shutdown(fd: i32, how: i32) usize {2396pub fn shutdown(fd: fd_t, how: i32) usize {
2405 if (native_arch == .x86) {2397 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)) });
2407 }2399 }
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)));
2409}2401}
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 {
2412 if (native_arch == .x86) {2404 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 });
2414 }2406 }
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);
2416}2408}
24172409
2418pub fn listen(fd: i32, backlog: u32) usize {2410pub fn listen(fd: fd_t, backlog: u32) usize {
2419 if (native_arch == .x86) {2411 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 });
2421 }2413 }
2422 return syscall2(.listen, @as(usize, @bitCast(@as(isize, fd))), backlog);2414 return syscall2(.listen, @as(u32, @bitCast(fd)), backlog);
2423}2415}
24242416
2425pub fn sendto(fd: i32, buf: [*]const u8, len: usize, flags: u32, addr: ?*const sockaddr, alen: socklen_t) usize {2417pub 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...@@ -2429,51 +2421,41 @@ pub fn sendto(fd: i32, buf: [*]const u8, len: usize, flags: u32, addr: ?*const s
2429 return syscall6(.sendto, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(buf), len, flags, @intFromPtr(addr), @as(usize, @intCast(alen)));2421 return syscall6(.sendto, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(buf), len, flags, @intFromPtr(addr), @as(usize, @intCast(alen)));
2430}2422}
24312423
2432pub fn sendfile(outfd: i32, infd: i32, offset: ?*i64, count: usize) usize {2424pub fn sendfile(outfd: fd_t, infd: fd_t, offset: ?*off_t, count: usize) usize {
2433 if (@hasField(SYS, "sendfile64")) {2425 return syscall4(
2434 return syscall4(2426 if (@hasField(SYS, "sendfile64")) .sendfile64 else .sendfile,
2435 .sendfile64,2427 @as(u32, @bitCast(outfd)),
2436 @as(usize, @bitCast(@as(isize, outfd))),2428 @as(u32, @bitCast(infd)),
2437 @as(usize, @bitCast(@as(isize, infd))),2429 @intFromPtr(offset),
2438 @intFromPtr(offset),2430 count,
2439 count,2431 );
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 }
2450}2432}
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 {
2453 if (native_arch == .x86) {2435 if (native_arch == .x86) {
2454 return socketcall(SC.socketpair, &[4]usize{ domain, socket_type, protocol, @intFromPtr(fd) });2436 return socketcall(SC.socketpair, &[4]usize{ domain, socket_type, protocol, @intFromPtr(fd) });
2455 }2437 }
2456 return syscall4(.socketpair, domain, socket_type, protocol, @intFromPtr(fd));2438 return syscall4(.socketpair, domain, socket_type, protocol, @intFromPtr(fd));
2457}2439}
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 {
2460 if (native_arch == .x86) {2442 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 });
2462 }2444 }
2463 return accept4(fd, addr, len, 0);2445 return accept4(fd, addr, len, 0);
2464}2446}
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 {
2467 if (native_arch == .x86) {2449 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 });
2469 }2451 }
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);
2471}2453}
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 {
2474 return syscall5(2456 return syscall5(
2475 .statx,2457 .statx,
2476 @as(usize, @bitCast(@as(isize, dirfd))),2458 @as(u32, @bitCast(dirfd)),
2477 @intFromPtr(path),2459 @intFromPtr(path),
2478 flags,2460 flags,
2479 @as(u32, @bitCast(mask)),2461 @as(u32, @bitCast(mask)),
...@@ -2490,7 +2472,7 @@ pub fn llistxattr(path: [*:0]const u8, list: [*]u8, size: usize) usize {...@@ -2490,7 +2472,7 @@ pub fn llistxattr(path: [*:0]const u8, list: [*]u8, size: usize) usize {
2490}2472}
24912473
2492pub fn flistxattr(fd: fd_t, list: [*]u8, size: usize) usize {2474pub 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);
2494}2476}
24952477
2496pub fn getxattr(path: [*:0]const u8, name: [*:0]const u8, value: [*]u8, size: usize) usize {2478pub 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...@@ -2502,7 +2484,7 @@ pub fn lgetxattr(path: [*:0]const u8, name: [*:0]const u8, value: [*]u8, size: u
2502}2484}
25032485
2504pub fn fgetxattr(fd: fd_t, name: [*:0]const u8, value: [*]u8, size: usize) usize {2486pub 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);
2506}2488}
25072489
2508pub fn setxattr(path: [*:0]const u8, name: [*:0]const u8, value: [*]const u8, size: usize, flags: usize) usize {2490pub 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...@@ -2514,7 +2496,7 @@ pub fn lsetxattr(path: [*:0]const u8, name: [*:0]const u8, value: [*]const u8, s
2514}2496}
25152497
2516pub fn fsetxattr(fd: fd_t, name: [*:0]const u8, value: [*]const u8, size: usize, flags: usize) usize {2498pub 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);
2518}2500}
25192501
2520pub fn removexattr(path: [*:0]const u8, name: [*:0]const u8) usize {2502pub 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 {...@@ -2525,8 +2507,8 @@ pub fn lremovexattr(path: [*:0]const u8, name: [*:0]const u8) usize {
2525 return syscall2(.lremovexattr, @intFromPtr(path), @intFromPtr(name));2507 return syscall2(.lremovexattr, @intFromPtr(path), @intFromPtr(name));
2526}2508}
25272509
2528pub fn fremovexattr(fd: usize, name: [*:0]const u8) usize {2510pub fn fremovexattr(fd: fd_t, name: [*:0]const u8) usize {
2529 return syscall2(.fremovexattr, fd, @intFromPtr(name));2511 return syscall2(.fremovexattr, @as(u32, @bitCast(fd)), @intFromPtr(name));
2530}2512}
25312513
2532pub const sched_param = extern struct {2514pub const sched_param = extern struct {
...@@ -2556,27 +2538,27 @@ pub const SCHED = packed struct(i32) {...@@ -2556,27 +2538,27 @@ pub const SCHED = packed struct(i32) {
2556};2538};
25572539
2558pub fn sched_setparam(pid: pid_t, param: *const sched_param) usize {2540pub 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));
2560}2542}
25612543
2562pub fn sched_getparam(pid: pid_t, param: *sched_param) usize {2544pub 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));
2564}2546}
25652547
2566pub fn sched_setscheduler(pid: pid_t, policy: SCHED, param: *const sched_param) usize {2548pub 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));
2568}2550}
25692551
2570pub fn sched_getscheduler(pid: pid_t) usize {2552pub 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)));
2572}2554}
25732555
2574pub fn sched_get_priority_max(policy: SCHED) usize {2556pub 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)));
2576}2558}
25772559
2578pub fn sched_get_priority_min(policy: SCHED) usize {2560pub 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)));
2580}2562}
25812563
2582pub fn getcpu(cpu: ?*usize, node: ?*usize) usize {2564pub fn getcpu(cpu: ?*usize, node: ?*usize) usize {
...@@ -2595,24 +2577,24 @@ pub const sched_attr = extern struct {...@@ -2595,24 +2577,24 @@ pub const sched_attr = extern struct {
2595 period: u64 = 0,2577 period: u64 = 0,
2596};2578};
25972579
2598pub fn sched_setattr(pid: pid_t, attr: *const sched_attr, flags: usize) usize {2580pub fn sched_setattr(pid: pid_t, attr: *const sched_attr, flags: u32) usize {
2599 return syscall3(.sched_setattr, @as(usize, @bitCast(@as(isize, pid))), @intFromPtr(attr), flags);2581 return syscall3(.sched_setattr, @as(u32, @bitCast(pid)), @intFromPtr(attr), flags);
2600}2582}
26012583
2602pub fn sched_getattr(pid: pid_t, attr: *sched_attr, size: usize, flags: usize) usize {2584pub fn sched_getattr(pid: pid_t, attr: *sched_attr, size: u32, flags: u32) usize {
2603 return syscall4(.sched_getattr, @as(usize, @bitCast(@as(isize, pid))), @intFromPtr(attr), size, flags);2585 return syscall4(.sched_getattr, @as(u32, @bitCast(pid)), @intFromPtr(attr), size, flags);
2604}2586}
26052587
2606pub fn sched_rr_get_interval(pid: pid_t, tp: *timespec) usize {2588pub 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));
2608}2590}
26092591
2610pub fn sched_yield() usize {2592pub fn sched_yield() usize {
2611 return syscall0(.sched_yield);2593 return syscall0(.sched_yield);
2612}2594}
26132595
2614pub fn sched_getaffinity(pid: pid_t, size: usize, set: *cpu_set_t) usize {2596pub fn sched_getaffinity(pid: pid_t, size: u32, set: *cpu_set_t) usize {
2615 const rc = syscall3(.sched_getaffinity, @as(usize, @bitCast(@as(isize, pid))), size, @intFromPtr(set));2597 const rc = syscall3(.sched_getaffinity, @as(u32, @bitCast(pid)), size, @intFromPtr(set));
2616 if (@as(isize, @bitCast(rc)) < 0) return rc;2598 if (@as(isize, @bitCast(rc)) < 0) return rc;
2617 if (rc < size) @memset(@as([*]u8, @ptrCast(set))[rc..size], 0);2599 if (rc < size) @memset(@as([*]u8, @ptrCast(set))[rc..size], 0);
2618 return 0;2600 return 0;
...@@ -2620,7 +2602,7 @@ pub fn sched_getaffinity(pid: pid_t, size: usize, set: *cpu_set_t) usize {...@@ -2620,7 +2602,7 @@ pub fn sched_getaffinity(pid: pid_t, size: usize, set: *cpu_set_t) usize {
26202602
2621pub fn sched_setaffinity(pid: pid_t, set: *const cpu_set_t) !void {2603pub fn sched_setaffinity(pid: pid_t, set: *const cpu_set_t) !void {
2622 const size = @sizeOf(cpu_set_t);2604 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
2625 switch (errno(rc)) {2607 switch (errno(rc)) {
2626 .SUCCESS => return,2608 .SUCCESS => return,
...@@ -2632,25 +2614,25 @@ pub fn epoll_create() usize {...@@ -2632,25 +2614,25 @@ pub fn epoll_create() usize {
2632 return epoll_create1(0);2614 return epoll_create1(0);
2633}2615}
26342616
2635pub fn epoll_create1(flags: usize) usize {2617pub fn epoll_create1(flags: u32) usize {
2636 return syscall1(.epoll_create1, flags);2618 return syscall1(.epoll_create1, flags);
2637}2619}
26382620
2639pub fn epoll_ctl(epoll_fd: i32, op: u32, fd: i32, ev: ?*epoll_event) usize {2621pub fn epoll_ctl(epoll_fd: fd_t, op: u32, fd: fd_t, 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));2622 return syscall4(.epoll_ctl, @as(u32, @bitCast(epoll_fd)), op, @as(u32, @bitCast(fd)), @intFromPtr(ev));
2641}2623}
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 {
2644 return epoll_pwait(epoll_fd, events, maxevents, timeout, null);2626 return epoll_pwait(epoll_fd, events, maxevents, timeout, null);
2645}2627}
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 {
2648 return syscall6(2630 return syscall6(
2649 .epoll_pwait,2631 .epoll_pwait,
2650 @as(usize, @bitCast(@as(isize, epoll_fd))),2632 @as(u32, @bitCast(epoll_fd)),
2651 @intFromPtr(events),2633 @intFromPtr(events),
2652 @as(usize, @intCast(maxevents)),2634 maxevents,
2653 @as(usize, @bitCast(@as(isize, timeout))),2635 @as(u32, @bitCast(timeout)),
2654 @intFromPtr(sigmask),2636 @intFromPtr(sigmask),
2655 NSIG / 8,2637 NSIG / 8,
2656 );2638 );
...@@ -2673,18 +2655,18 @@ pub const itimerspec = extern struct {...@@ -2673,18 +2655,18 @@ pub const itimerspec = extern struct {
2673 it_value: timespec,2655 it_value: timespec,
2674};2656};
26752657
2676pub fn timerfd_gettime(fd: i32, curr_value: *itimerspec) usize {2658pub fn timerfd_gettime(fd: fd_t, curr_value: *itimerspec) usize {
2677 return syscall2(2659 return syscall2(
2678 if (@hasField(SYS, "timerfd_gettime") and native_arch != .hexagon) .timerfd_gettime else .timerfd_gettime64,2660 if (@hasField(SYS, "timerfd_gettime") and native_arch != .hexagon) .timerfd_gettime else .timerfd_gettime64,
2679 @bitCast(@as(isize, fd)),2661 @as(u32, @bitCast(fd)),
2680 @intFromPtr(curr_value),2662 @intFromPtr(curr_value),
2681 );2663 );
2682}2664}
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 {
2685 return syscall4(2667 return syscall4(
2686 if (@hasField(SYS, "timerfd_settime") and native_arch != .hexagon) .timerfd_settime else .timerfd_settime64,2668 if (@hasField(SYS, "timerfd_settime") and native_arch != .hexagon) .timerfd_settime else .timerfd_settime64,
2687 @bitCast(@as(isize, fd)),2669 @as(u32, @bitCast(fd)),
2688 @as(u32, @bitCast(flags)),2670 @as(u32, @bitCast(flags)),
2689 @intFromPtr(new_value),2671 @intFromPtr(new_value),
2690 @intFromPtr(old_value),2672 @intFromPtr(old_value),
...@@ -2699,11 +2681,11 @@ pub const ITIMER = enum(i32) {...@@ -2699,11 +2681,11 @@ pub const ITIMER = enum(i32) {
2699};2681};
27002682
2701pub fn getitimer(which: i32, curr_value: *itimerspec) usize {2683pub 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));
2703}2685}
27042686
2705pub fn setitimer(which: i32, new_value: *const itimerspec, old_value: ?*itimerspec) usize {2687pub 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));
2707}2689}
27082690
2709pub fn unshare(flags: usize) usize {2691pub fn unshare(flags: usize) usize {
...@@ -2711,7 +2693,7 @@ pub fn unshare(flags: usize) usize {...@@ -2711,7 +2693,7 @@ pub fn unshare(flags: usize) usize {
2711}2693}
27122694
2713pub fn setns(fd: fd_t, flags: u32) usize {2695pub 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);
2715}2697}
27162698
2717pub fn capget(hdrp: *cap_user_header_t, datap: *cap_user_data_t) usize {2699pub 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 {...@@ -2734,12 +2716,12 @@ pub fn io_uring_setup(entries: u32, p: *io_uring_params) usize {
2734 return syscall2(.io_uring_setup, entries, @intFromPtr(p));2716 return syscall2(.io_uring_setup, entries, @intFromPtr(p));
2735}2717}
27362718
2737pub fn io_uring_enter(fd: i32, to_submit: u32, min_complete: u32, flags: u32, sig: ?*sigset_t) usize {2719pub fn io_uring_enter(fd: fd_t, 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);2720 return syscall6(.io_uring_enter, @as(u32, @bitCast(fd)), to_submit, min_complete, flags, @intFromPtr(sig), NSIG / 8);
2739}2721}
27402722
2741pub fn io_uring_register(fd: i32, opcode: IORING_REGISTER, arg: ?*const anyopaque, nr_args: u32) usize {2723pub fn io_uring_register(fd: fd_t, 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);2724 return syscall4(.io_uring_register, @as(u32, @bitCast(fd)), @intFromEnum(opcode), @intFromPtr(arg), nr_args);
2743}2725}
27442726
2745pub fn memfd_create(name: [*:0]const u8, flags: u32) usize {2727pub 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 {...@@ -2747,43 +2729,43 @@ pub fn memfd_create(name: [*:0]const u8, flags: u32) usize {
2747}2729}
27482730
2749pub fn getrusage(who: i32, usage: *rusage) usize {2731pub 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));
2751}2733}
27522734
2753pub fn tcgetattr(fd: fd_t, termios_p: *termios) usize {2735pub 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));
2755}2737}
27562738
2757pub fn tcsetattr(fd: fd_t, optional_action: TCSA, termios_p: *const termios) usize {2739pub 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));
2759}2741}
27602742
2761pub fn tcgetpgrp(fd: fd_t, pgrp: *pid_t) usize {2743pub 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));
2763}2745}
27642746
2765pub fn tcsetpgrp(fd: fd_t, pgrp: *const pid_t) usize {2747pub 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));
2767}2749}
27682750
2769pub fn tcdrain(fd: fd_t) usize {2751pub 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);
2771}2753}
27722754
2773pub fn ioctl(fd: fd_t, request: u32, arg: usize) usize {2755pub 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);
2775}2757}
27762758
2777pub fn signalfd(fd: fd_t, mask: *const sigset_t, flags: u32) usize {2759pub 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);
2779}2761}
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 {
2782 return syscall6(2764 return syscall6(
2783 .copy_file_range,2765 .copy_file_range,
2784 @as(usize, @bitCast(@as(isize, fd_in))),2766 @as(u32, @bitCast(fd_in)),
2785 @intFromPtr(off_in),2767 @intFromPtr(off_in),
2786 @as(usize, @bitCast(@as(isize, fd_out))),2768 @as(u32, @bitCast(fd_out)),
2787 @intFromPtr(off_out),2769 @intFromPtr(off_out),
2788 len,2770 len,
2789 flags,2771 flags,
...@@ -2799,19 +2781,19 @@ pub fn sync() void {...@@ -2799,19 +2781,19 @@ pub fn sync() void {
2799}2781}
28002782
2801pub fn syncfs(fd: fd_t) usize {2783pub fn syncfs(fd: fd_t) usize {
2802 return syscall1(.syncfs, @as(usize, @bitCast(@as(isize, fd))));2784 return syscall1(.syncfs, @as(u32, @bitCast(fd)));
2803}2785}
28042786
2805pub fn fsync(fd: fd_t) usize {2787pub fn fsync(fd: fd_t) usize {
2806 return syscall1(.fsync, @as(usize, @bitCast(@as(isize, fd))));2788 return syscall1(.fsync, @as(u32, @bitCast(fd)));
2807}2789}
28082790
2809pub fn fdatasync(fd: fd_t) usize {2791pub fn fdatasync(fd: fd_t) usize {
2810 return syscall1(.fdatasync, @as(usize, @bitCast(@as(isize, fd))));2792 return syscall1(.fdatasync, @as(u32, @bitCast(fd)));
2811}2793}
28122794
2813pub fn prctl(option: i32, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {2795pub 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);
2815}2797}
28162798
2817pub fn getrlimit(resource: rlimit_resource, rlim: *rlimit) usize {2799pub fn getrlimit(resource: rlimit_resource, rlim: *rlimit) usize {
...@@ -2827,8 +2809,8 @@ pub fn setrlimit(resource: rlimit_resource, rlim: *const rlimit) usize {...@@ -2827,8 +2809,8 @@ pub fn setrlimit(resource: rlimit_resource, rlim: *const rlimit) usize {
2827pub fn prlimit(pid: pid_t, resource: rlimit_resource, new_limit: ?*const rlimit, old_limit: ?*rlimit) usize {2809pub fn prlimit(pid: pid_t, resource: rlimit_resource, new_limit: ?*const rlimit, old_limit: ?*rlimit) usize {
2828 return syscall4(2810 return syscall4(
2829 .prlimit64,2811 .prlimit64,
2830 @as(usize, @bitCast(@as(isize, pid))),2812 @as(u32, @bitCast(pid)),
2831 @as(usize, @bitCast(@as(isize, @intFromEnum(resource)))),2813 @as(u32, @bitCast(@as(i32, @intFromEnum(resource)))),
2832 @intFromPtr(new_limit),2814 @intFromPtr(new_limit),
2833 @intFromPtr(old_limit),2815 @intFromPtr(old_limit),
2834 );2816 );
...@@ -2843,14 +2825,14 @@ pub fn madvise(address: [*]u8, len: usize, advice: u32) usize {...@@ -2843,14 +2825,14 @@ pub fn madvise(address: [*]u8, len: usize, advice: u32) usize {
2843}2825}
28442826
2845pub fn pidfd_open(pid: pid_t, flags: u32) usize {2827pub 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);
2847}2829}
28482830
2849pub fn pidfd_getfd(pidfd: fd_t, targetfd: fd_t, flags: u32) usize {2831pub fn pidfd_getfd(pidfd: fd_t, targetfd: fd_t, flags: u32) usize {
2850 return syscall3(2832 return syscall3(
2851 .pidfd_getfd,2833 .pidfd_getfd,
2852 @as(usize, @bitCast(@as(isize, pidfd))),2834 @as(u32, @bitCast(pidfd)),
2853 @as(usize, @bitCast(@as(isize, targetfd))),2835 @as(u32, @bitCast(targetfd)),
2854 flags,2836 flags,
2855 );2837 );
2856}2838}
...@@ -2858,7 +2840,7 @@ pub fn pidfd_getfd(pidfd: fd_t, targetfd: fd_t, flags: u32) usize {...@@ -2858,7 +2840,7 @@ pub fn pidfd_getfd(pidfd: fd_t, targetfd: fd_t, flags: u32) usize {
2858pub fn pidfd_send_signal(pidfd: fd_t, sig: SIG, info: ?*siginfo_t, flags: u32) usize {2840pub fn pidfd_send_signal(pidfd: fd_t, sig: SIG, info: ?*siginfo_t, flags: u32) usize {
2859 return syscall4(2841 return syscall4(
2860 .pidfd_send_signal,2842 .pidfd_send_signal,
2861 @as(usize, @bitCast(@as(isize, pidfd))),2843 @as(u32, @bitCast(pidfd)),
2862 @intFromEnum(sig),2844 @intFromEnum(sig),
2863 @intFromPtr(info),2845 @intFromPtr(info),
2864 flags,2846 flags,
...@@ -2868,7 +2850,7 @@ pub fn pidfd_send_signal(pidfd: fd_t, sig: SIG, info: ?*siginfo_t, flags: u32) u...@@ -2868,7 +2850,7 @@ pub fn pidfd_send_signal(pidfd: fd_t, sig: SIG, info: ?*siginfo_t, flags: u32) u
2868pub fn process_vm_readv(pid: pid_t, local: []const iovec, remote: []const iovec_const, flags: usize) usize {2850pub fn process_vm_readv(pid: pid_t, local: []const iovec, remote: []const iovec_const, flags: usize) usize {
2869 return syscall6(2851 return syscall6(
2870 .process_vm_readv,2852 .process_vm_readv,
2871 @as(usize, @bitCast(@as(isize, pid))),2853 @as(u32, @bitCast(pid)),
2872 @intFromPtr(local.ptr),2854 @intFromPtr(local.ptr),
2873 local.len,2855 local.len,
2874 @intFromPtr(remote.ptr),2856 @intFromPtr(remote.ptr),
...@@ -2880,7 +2862,7 @@ pub fn process_vm_readv(pid: pid_t, local: []const iovec, remote: []const iovec_...@@ -2880,7 +2862,7 @@ pub fn process_vm_readv(pid: pid_t, local: []const iovec, remote: []const iovec_
2880pub fn process_vm_writev(pid: pid_t, local: []const iovec_const, remote: []const iovec_const, flags: usize) usize {2862pub fn process_vm_writev(pid: pid_t, local: []const iovec_const, remote: []const iovec_const, flags: usize) usize {
2881 return syscall6(2863 return syscall6(
2882 .process_vm_writev,2864 .process_vm_writev,
2883 @as(usize, @bitCast(@as(isize, pid))),2865 @as(u32, @bitCast(pid)),
2884 @intFromPtr(local.ptr),2866 @intFromPtr(local.ptr),
2885 local.len,2867 local.len,
2886 @intFromPtr(remote.ptr),2868 @intFromPtr(remote.ptr),
...@@ -2890,50 +2872,43 @@ pub fn process_vm_writev(pid: pid_t, local: []const iovec_const, remote: []const...@@ -2890,50 +2872,43 @@ pub fn process_vm_writev(pid: pid_t, local: []const iovec_const, remote: []const
2890}2872}
28912873
2892pub fn fadvise(fd: fd_t, offset: i64, len: i64, advice: usize) usize {2874pub 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()) {2875 if (native_arch.isMIPS32()) {
2894 // These architectures reorder the arguments so that a register is not skipped to align the2876 // MIPS O32 weirdly differs from the other architectures that require
2895 // register number that `offset` is passed in.2877 // aligned register pairs for this specific syscall.
28962878
2897 const offset_halves = splitValue64(offset);2879 const offset_halves = splitValue64(offset);
2898 const length_halves = splitValue64(len);2880 const length_halves = splitValue64(len);
28992881
2900 return syscall6(2882 return syscall7(
2901 .fadvise64_64,2883 .fadvise64,
2902 @as(usize, @bitCast(@as(isize, fd))),2884 @as(u32, @bitCast(fd)),
2903 advice,2885 0,
2904 offset_halves[0],2886 offset_halves[0],
2905 offset_halves[1],2887 offset_halves[1],
2906 length_halves[0],2888 length_halves[0],
2907 length_halves[1],2889 length_halves[1],
2890 advice,
2908 );2891 );
2909 } else if (native_arch.isMIPS32()) {2892 } else if (require_aligned_register_pair) {
2910 // MIPS O32 does not deal with the register alignment issue, so pass a dummy value.
2911
2912 const offset_halves = splitValue64(offset);2893 const offset_halves = splitValue64(offset);
2913 const length_halves = splitValue64(len);2894 const length_halves = splitValue64(len);
29142895
2915 return syscall7(2896 return syscall6(
2916 .fadvise64,2897 .fadvise64_64,
2917 @as(usize, @bitCast(@as(isize, fd))),2898 @as(u32, @bitCast(fd)),
2918 0,2899 advice,
2919 offset_halves[0],2900 offset_halves[0],
2920 offset_halves[1],2901 offset_halves[1],
2921 length_halves[0],2902 length_halves[0],
2922 length_halves[1],2903 length_halves[1],
2923 advice,
2924 );2904 );
2925 } else if (comptime usize_bits < 64) {2905 } else if (@sizeOf(syscall_arg_t) < @sizeOf(u64)) {
2926 // Other 32-bit architectures do not require register alignment.
2927
2928 const offset_halves = splitValue64(offset);2906 const offset_halves = splitValue64(offset);
2929 const length_halves = splitValue64(len);2907 const length_halves = splitValue64(len);
29302908
2931 return syscall6(2909 return syscall6(
2932 switch (builtin.abi) {2910 .fadvise64_64,
2933 .gnuabin32, .gnux32, .muslabin32, .muslx32 => .fadvise64,2911 @as(u32, @bitCast(fd)),
2934 else => .fadvise64_64,
2935 },
2936 @as(usize, @bitCast(@as(isize, fd))),
2937 offset_halves[0],2912 offset_halves[0],
2938 offset_halves[1],2913 offset_halves[1],
2939 length_halves[0],2914 length_halves[0],
...@@ -2941,14 +2916,11 @@ pub fn fadvise(fd: fd_t, offset: i64, len: i64, advice: usize) usize {...@@ -2941,14 +2916,11 @@ pub fn fadvise(fd: fd_t, offset: i64, len: i64, advice: usize) usize {
2941 advice,2916 advice,
2942 );2917 );
2943 } else {2918 } 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.
2947 return syscall4(2919 return syscall4(
2948 if (@hasField(SYS, "fadvise64_64")) .fadvise64_64 else .fadvise64,2920 .fadvise64,
2949 @as(usize, @bitCast(@as(isize, fd))),2921 @as(u32, @bitCast(fd)),
2950 @as(usize, @bitCast(offset)),2922 @as(u64, @bitCast(offset)),
2951 @as(usize, @bitCast(len)),2923 @as(u64, @bitCast(len)),
2952 advice,2924 advice,
2953 );2925 );
2954 }2926 }
...@@ -2964,9 +2936,9 @@ pub fn perf_event_open(...@@ -2964,9 +2936,9 @@ pub fn perf_event_open(
2964 return syscall5(2936 return syscall5(
2965 .perf_event_open,2937 .perf_event_open,
2966 @intFromPtr(attr),2938 @intFromPtr(attr),
2967 @as(usize, @bitCast(@as(isize, pid))),2939 @as(u32, @bitCast(pid)),
2968 @as(usize, @bitCast(@as(isize, cpu))),2940 @as(u32, @bitCast(cpu)),
2969 @as(usize, @bitCast(@as(isize, group_fd))),2941 @as(u32, @bitCast(group_fd)),
2970 flags,2942 flags,
2971 );2943 );
2972}2944}
...@@ -2985,7 +2957,7 @@ pub fn ptrace(...@@ -2985,7 +2957,7 @@ pub fn ptrace(
2985 return syscall5(2957 return syscall5(
2986 .ptrace,2958 .ptrace,
2987 req,2959 req,
2988 @as(usize, @bitCast(@as(isize, pid))),2960 @as(u32, @bitCast(pid)),
2989 addr,2961 addr,
2990 data,2962 data,
2991 addr2,2963 addr2,
...@@ -3007,14 +2979,14 @@ pub fn cachestat(...@@ -3007,14 +2979,14 @@ pub fn cachestat(
3007) usize {2979) usize {
3008 return syscall4(2980 return syscall4(
3009 .cachestat,2981 .cachestat,
3010 @as(usize, @bitCast(@as(isize, fd))),2982 @as(u32, @bitCast(fd)),
3011 @intFromPtr(cstat_range),2983 @intFromPtr(cstat_range),
3012 @intFromPtr(cstat),2984 @intFromPtr(cstat),
3013 flags,2985 flags,
3014 );2986 );
3015}2987}
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 {
3018 return syscall3(.map_shadow_stack, addr, size, flags);2990 return syscall3(.map_shadow_stack, addr, size, flags);
3019}2991}
30202992
...@@ -3678,13 +3650,6 @@ pub const E = switch (native_arch) {...@@ -3678,13 +3650,6 @@ pub const E = switch (native_arch) {
3678 },3650 },
3679};3651};
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
3688pub const NAME_MAX = 255;3653pub const NAME_MAX = 255;
3689pub const PATH_MAX = 4096;3654pub const PATH_MAX = 4096;
3690pub const IOV_MAX = 1024;3655pub const IOV_MAX = 1024;
...@@ -10176,7 +10141,3 @@ pub const cmsghdr = extern struct {...@@ -10176,7 +10141,3 @@ pub const cmsghdr = extern struct {
10176 level: i32,10141 level: i32,
10177 type: i32,10142 type: i32,
10178};10143};
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");...@@ -2,14 +2,21 @@ const builtin = @import("builtin");
2const std = @import("../../std.zig");2const std = @import("../../std.zig");
3const SYS = std.os.linux.SYS;3const 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 {
6 return asm volatile ("svc #0"10 return asm volatile ("svc #0"
7 : [ret] "={x0}" (-> u64),11 : [ret] "={x0}" (-> u64),
8 : [number] "{x8}" (@intFromEnum(number)),12 : [number] "{x8}" (@intFromEnum(number)),
9 : .{ .memory = true });13 : .{ .memory = true });
10}14}
1115
12pub fn syscall1(number: SYS, arg1: u64) u64 {16pub fn syscall1(
17 number: SYS,
18 arg1: syscall_arg_t,
19) u64 {
13 return asm volatile ("svc #0"20 return asm volatile ("svc #0"
14 : [ret] "={x0}" (-> u64),21 : [ret] "={x0}" (-> u64),
15 : [number] "{x8}" (@intFromEnum(number)),22 : [number] "{x8}" (@intFromEnum(number)),
...@@ -17,7 +24,11 @@ pub fn syscall1(number: SYS, arg1: u64) u64 {...@@ -17,7 +24,11 @@ pub fn syscall1(number: SYS, arg1: u64) u64 {
17 : .{ .memory = true });24 : .{ .memory = true });
18}25}
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 {
21 return asm volatile ("svc #0"32 return asm volatile ("svc #0"
22 : [ret] "={x0}" (-> u64),33 : [ret] "={x0}" (-> u64),
23 : [number] "{x8}" (@intFromEnum(number)),34 : [number] "{x8}" (@intFromEnum(number)),
...@@ -26,7 +37,12 @@ pub fn syscall2(number: SYS, arg1: u64, arg2: u64) u64 {...@@ -26,7 +37,12 @@ pub fn syscall2(number: SYS, arg1: u64, arg2: u64) u64 {
26 : .{ .memory = true });37 : .{ .memory = true });
27}38}
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 {
30 return asm volatile ("svc #0"46 return asm volatile ("svc #0"
31 : [ret] "={x0}" (-> u64),47 : [ret] "={x0}" (-> u64),
32 : [number] "{x8}" (@intFromEnum(number)),48 : [number] "{x8}" (@intFromEnum(number)),
...@@ -36,7 +52,13 @@ pub fn syscall3(number: SYS, arg1: u64, arg2: u64, arg3: u64) u64 {...@@ -36,7 +52,13 @@ pub fn syscall3(number: SYS, arg1: u64, arg2: u64, arg3: u64) u64 {
36 : .{ .memory = true });52 : .{ .memory = true });
37}53}
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 {
40 return asm volatile ("svc #0"62 return asm volatile ("svc #0"
41 : [ret] "={x0}" (-> u64),63 : [ret] "={x0}" (-> u64),
42 : [number] "{x8}" (@intFromEnum(number)),64 : [number] "{x8}" (@intFromEnum(number)),
...@@ -47,7 +69,14 @@ pub fn syscall4(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64) u64 {...@@ -47,7 +69,14 @@ pub fn syscall4(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64) u64 {
47 : .{ .memory = true });69 : .{ .memory = true });
48}70}
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 {
51 return asm volatile ("svc #0"80 return asm volatile ("svc #0"
52 : [ret] "={x0}" (-> u64),81 : [ret] "={x0}" (-> u64),
53 : [number] "{x8}" (@intFromEnum(number)),82 : [number] "{x8}" (@intFromEnum(number)),
...@@ -61,12 +90,12 @@ pub fn syscall5(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64, arg5: u...@@ -61,12 +90,12 @@ pub fn syscall5(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64, arg5: u
6190
62pub fn syscall6(91pub fn syscall6(
63 number: SYS,92 number: SYS,
64 arg1: u64,93 arg1: syscall_arg_t,
65 arg2: u64,94 arg2: syscall_arg_t,
66 arg3: u64,95 arg3: syscall_arg_t,
67 arg4: u64,96 arg4: syscall_arg_t,
68 arg5: u64,97 arg5: syscall_arg_t,
69 arg6: u64,98 arg6: syscall_arg_t,
70) u64 {99) u64 {
71 return asm volatile ("svc #0"100 return asm volatile ("svc #0"
72 : [ret] "={x0}" (-> u64),101 : [ret] "={x0}" (-> u64),
lib/std/os/linux/arc.zig+41-12
...@@ -2,14 +2,21 @@ const builtin = @import("builtin");...@@ -2,14 +2,21 @@ const builtin = @import("builtin");
2const std = @import("../../std.zig");2const std = @import("../../std.zig");
3const SYS = std.os.linux.SYS;3const 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 {
6 return asm volatile ("trap_s 0"10 return asm volatile ("trap_s 0"
7 : [ret] "={r0}" (-> u32),11 : [ret] "={r0}" (-> u32),
8 : [number] "{r8}" (@intFromEnum(number)),12 : [number] "{r8}" (@intFromEnum(number)),
9 : .{ .memory = true });13 : .{ .memory = true });
10}14}
1115
12pub fn syscall1(number: SYS, arg1: u32) u32 {16pub fn syscall1(
17 number: SYS,
18 arg1: syscall_arg_t,
19) u32 {
13 return asm volatile ("trap_s 0"20 return asm volatile ("trap_s 0"
14 : [ret] "={r0}" (-> u32),21 : [ret] "={r0}" (-> u32),
15 : [number] "{r8}" (@intFromEnum(number)),22 : [number] "{r8}" (@intFromEnum(number)),
...@@ -17,7 +24,11 @@ pub fn syscall1(number: SYS, arg1: u32) u32 {...@@ -17,7 +24,11 @@ pub fn syscall1(number: SYS, arg1: u32) u32 {
17 : .{ .memory = true });24 : .{ .memory = true });
18}25}
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 {
21 return asm volatile ("trap_s 0"32 return asm volatile ("trap_s 0"
22 : [ret] "={r0}" (-> u32),33 : [ret] "={r0}" (-> u32),
23 : [number] "{r8}" (@intFromEnum(number)),34 : [number] "{r8}" (@intFromEnum(number)),
...@@ -26,7 +37,12 @@ pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {...@@ -26,7 +37,12 @@ pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {
26 : .{ .memory = true });37 : .{ .memory = true });
27}38}
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 {
30 return asm volatile ("trap_s 0"46 return asm volatile ("trap_s 0"
31 : [ret] "={r0}" (-> u32),47 : [ret] "={r0}" (-> u32),
32 : [number] "{r8}" (@intFromEnum(number)),48 : [number] "{r8}" (@intFromEnum(number)),
...@@ -36,7 +52,13 @@ pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {...@@ -36,7 +52,13 @@ pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {
36 : .{ .memory = true });52 : .{ .memory = true });
37}53}
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 {
40 return asm volatile ("trap_s 0"62 return asm volatile ("trap_s 0"
41 : [ret] "={r0}" (-> u32),63 : [ret] "={r0}" (-> u32),
42 : [number] "{r8}" (@intFromEnum(number)),64 : [number] "{r8}" (@intFromEnum(number)),
...@@ -47,7 +69,14 @@ pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {...@@ -47,7 +69,14 @@ pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {
47 : .{ .memory = true });69 : .{ .memory = true });
48}70}
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 {
51 return asm volatile ("trap_s 0"80 return asm volatile ("trap_s 0"
52 : [ret] "={r0}" (-> u32),81 : [ret] "={r0}" (-> u32),
53 : [number] "{r8}" (@intFromEnum(number)),82 : [number] "{r8}" (@intFromEnum(number)),
...@@ -61,12 +90,12 @@ pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u...@@ -61,12 +90,12 @@ pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u
6190
62pub fn syscall6(91pub fn syscall6(
63 number: SYS,92 number: SYS,
64 arg1: u32,93 arg1: syscall_arg_t,
65 arg2: u32,94 arg2: syscall_arg_t,
66 arg3: u32,95 arg3: syscall_arg_t,
67 arg4: u32,96 arg4: syscall_arg_t,
68 arg5: u32,97 arg5: syscall_arg_t,
69 arg6: u32,98 arg6: syscall_arg_t,
70) u32 {99) u32 {
71 return asm volatile ("trap_s 0"100 return asm volatile ("trap_s 0"
72 : [ret] "={r0}" (-> u32),101 : [ret] "={r0}" (-> u32),
lib/std/os/linux/arm.zig+41-12
...@@ -2,14 +2,21 @@ const builtin = @import("builtin");...@@ -2,14 +2,21 @@ const builtin = @import("builtin");
2const std = @import("../../std.zig");2const std = @import("../../std.zig");
3const SYS = std.os.linux.SYS;3const 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 {
6 return asm volatile ("svc #0"10 return asm volatile ("svc #0"
7 : [ret] "={r0}" (-> u32),11 : [ret] "={r0}" (-> u32),
8 : [number] "{r7}" (@intFromEnum(number)),12 : [number] "{r7}" (@intFromEnum(number)),
9 : .{ .memory = true });13 : .{ .memory = true });
10}14}
1115
12pub fn syscall1(number: SYS, arg1: u32) u32 {16pub fn syscall1(
17 number: SYS,
18 arg1: syscall_arg_t,
19) u32 {
13 return asm volatile ("svc #0"20 return asm volatile ("svc #0"
14 : [ret] "={r0}" (-> u32),21 : [ret] "={r0}" (-> u32),
15 : [number] "{r7}" (@intFromEnum(number)),22 : [number] "{r7}" (@intFromEnum(number)),
...@@ -17,7 +24,11 @@ pub fn syscall1(number: SYS, arg1: u32) u32 {...@@ -17,7 +24,11 @@ pub fn syscall1(number: SYS, arg1: u32) u32 {
17 : .{ .memory = true });24 : .{ .memory = true });
18}25}
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 {
21 return asm volatile ("svc #0"32 return asm volatile ("svc #0"
22 : [ret] "={r0}" (-> u32),33 : [ret] "={r0}" (-> u32),
23 : [number] "{r7}" (@intFromEnum(number)),34 : [number] "{r7}" (@intFromEnum(number)),
...@@ -26,7 +37,12 @@ pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {...@@ -26,7 +37,12 @@ pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {
26 : .{ .memory = true });37 : .{ .memory = true });
27}38}
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 {
30 return asm volatile ("svc #0"46 return asm volatile ("svc #0"
31 : [ret] "={r0}" (-> u32),47 : [ret] "={r0}" (-> u32),
32 : [number] "{r7}" (@intFromEnum(number)),48 : [number] "{r7}" (@intFromEnum(number)),
...@@ -36,7 +52,13 @@ pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {...@@ -36,7 +52,13 @@ pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {
36 : .{ .memory = true });52 : .{ .memory = true });
37}53}
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 {
40 return asm volatile ("svc #0"62 return asm volatile ("svc #0"
41 : [ret] "={r0}" (-> u32),63 : [ret] "={r0}" (-> u32),
42 : [number] "{r7}" (@intFromEnum(number)),64 : [number] "{r7}" (@intFromEnum(number)),
...@@ -47,7 +69,14 @@ pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {...@@ -47,7 +69,14 @@ pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {
47 : .{ .memory = true });69 : .{ .memory = true });
48}70}
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 {
51 return asm volatile ("svc #0"80 return asm volatile ("svc #0"
52 : [ret] "={r0}" (-> u32),81 : [ret] "={r0}" (-> u32),
53 : [number] "{r7}" (@intFromEnum(number)),82 : [number] "{r7}" (@intFromEnum(number)),
...@@ -61,12 +90,12 @@ pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u...@@ -61,12 +90,12 @@ pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u
6190
62pub fn syscall6(91pub fn syscall6(
63 number: SYS,92 number: SYS,
64 arg1: u32,93 arg1: syscall_arg_t,
65 arg2: u32,94 arg2: syscall_arg_t,
66 arg3: u32,95 arg3: syscall_arg_t,
67 arg4: u32,96 arg4: syscall_arg_t,
68 arg5: u32,97 arg5: syscall_arg_t,
69 arg6: u32,98 arg6: syscall_arg_t,
70) u32 {99) u32 {
71 return asm volatile ("svc #0"100 return asm volatile ("svc #0"
72 : [ret] "={r0}" (-> u32),101 : [ret] "={r0}" (-> u32),
lib/std/os/linux/hexagon.zig+33-11
...@@ -2,14 +2,21 @@ const builtin = @import("builtin");...@@ -2,14 +2,21 @@ const builtin = @import("builtin");
2const std = @import("../../std.zig");2const std = @import("../../std.zig");
3const SYS = std.os.linux.SYS;3const 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 {
6 return asm volatile ("trap0(#1)"10 return asm volatile ("trap0(#1)"
7 : [ret] "={r0}" (-> u32),11 : [ret] "={r0}" (-> u32),
8 : [number] "{r6}" (@intFromEnum(number)),12 : [number] "{r6}" (@intFromEnum(number)),
9 : .{ .memory = true });13 : .{ .memory = true });
10}14}
1115
12pub fn syscall1(number: SYS, arg1: u32) u32 {16pub fn syscall1(
17 number: SYS,
18 arg1: syscall_arg_t,
19) u32 {
13 return asm volatile ("trap0(#1)"20 return asm volatile ("trap0(#1)"
14 : [ret] "={r0}" (-> u32),21 : [ret] "={r0}" (-> u32),
15 : [number] "{r6}" (@intFromEnum(number)),22 : [number] "{r6}" (@intFromEnum(number)),
...@@ -17,7 +24,11 @@ pub fn syscall1(number: SYS, arg1: u32) u32 {...@@ -17,7 +24,11 @@ pub fn syscall1(number: SYS, arg1: u32) u32 {
17 : .{ .memory = true });24 : .{ .memory = true });
18}25}
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 {
21 return asm volatile ("trap0(#1)"32 return asm volatile ("trap0(#1)"
22 : [ret] "={r0}" (-> u32),33 : [ret] "={r0}" (-> u32),
23 : [number] "{r6}" (@intFromEnum(number)),34 : [number] "{r6}" (@intFromEnum(number)),
...@@ -26,7 +37,12 @@ pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {...@@ -26,7 +37,12 @@ pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {
26 : .{ .memory = true });37 : .{ .memory = true });
27}38}
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 {
30 return asm volatile ("trap0(#1)"46 return asm volatile ("trap0(#1)"
31 : [ret] "={r0}" (-> u32),47 : [ret] "={r0}" (-> u32),
32 : [number] "{r6}" (@intFromEnum(number)),48 : [number] "{r6}" (@intFromEnum(number)),
...@@ -36,7 +52,13 @@ pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {...@@ -36,7 +52,13 @@ pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {
36 : .{ .memory = true });52 : .{ .memory = true });
37}53}
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 {
40 return asm volatile ("trap0(#1)"62 return asm volatile ("trap0(#1)"
41 : [ret] "={r0}" (-> u32),63 : [ret] "={r0}" (-> u32),
42 : [number] "{r6}" (@intFromEnum(number)),64 : [number] "{r6}" (@intFromEnum(number)),
...@@ -61,12 +83,12 @@ pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u...@@ -61,12 +83,12 @@ pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u
6183
62pub fn syscall6(84pub fn syscall6(
63 number: SYS,85 number: SYS,
64 arg1: u32,86 arg1: syscall_arg_t,
65 arg2: u32,87 arg2: syscall_arg_t,
66 arg3: u32,88 arg3: syscall_arg_t,
67 arg4: u32,89 arg4: syscall_arg_t,
68 arg5: u32,90 arg5: syscall_arg_t,
69 arg6: u32,91 arg6: syscall_arg_t,
70) u32 {92) u32 {
71 return asm volatile ("trap0(#1)"93 return asm volatile ("trap0(#1)"
72 : [ret] "={r0}" (-> u32),94 : [ret] "={r0}" (-> u32),
lib/std/os/linux/loongarch32.zig+41-12
...@@ -2,7 +2,11 @@ const builtin = @import("builtin");...@@ -2,7 +2,11 @@ const builtin = @import("builtin");
2const std = @import("../../std.zig");2const std = @import("../../std.zig");
3const SYS = std.os.linux.SYS;3const 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 {
6 return asm volatile (10 return asm volatile (
7 \\ syscall 011 \\ syscall 0
8 : [ret] "={$r4}" (-> u32),12 : [ret] "={$r4}" (-> u32),
...@@ -10,7 +14,10 @@ pub fn syscall0(number: SYS) u32 {...@@ -10,7 +14,10 @@ pub fn syscall0(number: SYS) u32 {
10 : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });14 : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
11}15}
1216
13pub fn syscall1(number: SYS, arg1: u32) u32 {17pub fn syscall1(
18 number: SYS,
19 arg1: syscall_arg_t,
20) u32 {
14 return asm volatile (21 return asm volatile (
15 \\ syscall 022 \\ syscall 0
16 : [ret] "={$r4}" (-> u32),23 : [ret] "={$r4}" (-> u32),
...@@ -19,7 +26,11 @@ pub fn syscall1(number: SYS, arg1: u32) u32 {...@@ -19,7 +26,11 @@ pub fn syscall1(number: SYS, arg1: u32) u32 {
19 : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });26 : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
20}27}
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 {
23 return asm volatile (34 return asm volatile (
24 \\ syscall 035 \\ syscall 0
25 : [ret] "={$r4}" (-> u32),36 : [ret] "={$r4}" (-> u32),
...@@ -29,7 +40,12 @@ pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {...@@ -29,7 +40,12 @@ pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {
29 : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });40 : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
30}41}
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 {
33 return asm volatile (49 return asm volatile (
34 \\ syscall 050 \\ syscall 0
35 : [ret] "={$r4}" (-> u32),51 : [ret] "={$r4}" (-> u32),
...@@ -40,7 +56,13 @@ pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {...@@ -40,7 +56,13 @@ pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {
40 : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });56 : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
41}57}
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 {
44 return asm volatile (66 return asm volatile (
45 \\ syscall 067 \\ syscall 0
46 : [ret] "={$r4}" (-> u32),68 : [ret] "={$r4}" (-> u32),
...@@ -52,7 +74,14 @@ pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {...@@ -52,7 +74,14 @@ pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {
52 : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });74 : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
53}75}
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 {
56 return asm volatile (85 return asm volatile (
57 \\ syscall 086 \\ syscall 0
58 : [ret] "={$r4}" (-> u32),87 : [ret] "={$r4}" (-> u32),
...@@ -67,12 +96,12 @@ pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u...@@ -67,12 +96,12 @@ pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u
6796
68pub fn syscall6(97pub fn syscall6(
69 number: SYS,98 number: SYS,
70 arg1: u32,99 arg1: syscall_arg_t,
71 arg2: u32,100 arg2: syscall_arg_t,
72 arg3: u32,101 arg3: syscall_arg_t,
73 arg4: u32,102 arg4: syscall_arg_t,
74 arg5: u32,103 arg5: syscall_arg_t,
75 arg6: u32,104 arg6: syscall_arg_t,
76) u32 {105) u32 {
77 return asm volatile (106 return asm volatile (
78 \\ syscall 0107 \\ syscall 0
lib/std/os/linux/loongarch64.zig+41-12
...@@ -2,7 +2,11 @@ const builtin = @import("builtin");...@@ -2,7 +2,11 @@ const builtin = @import("builtin");
2const std = @import("../../std.zig");2const std = @import("../../std.zig");
3const SYS = std.os.linux.SYS;3const 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 {
6 return asm volatile (10 return asm volatile (
7 \\ syscall 011 \\ syscall 0
8 : [ret] "={$r4}" (-> u64),12 : [ret] "={$r4}" (-> u64),
...@@ -10,7 +14,10 @@ pub fn syscall0(number: SYS) u64 {...@@ -10,7 +14,10 @@ pub fn syscall0(number: SYS) u64 {
10 : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });14 : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
11}15}
1216
13pub fn syscall1(number: SYS, arg1: u64) u64 {17pub fn syscall1(
18 number: SYS,
19 arg1: syscall_arg_t,
20) u64 {
14 return asm volatile (21 return asm volatile (
15 \\ syscall 022 \\ syscall 0
16 : [ret] "={$r4}" (-> u64),23 : [ret] "={$r4}" (-> u64),
...@@ -19,7 +26,11 @@ pub fn syscall1(number: SYS, arg1: u64) u64 {...@@ -19,7 +26,11 @@ pub fn syscall1(number: SYS, arg1: u64) u64 {
19 : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });26 : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
20}27}
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 {
23 return asm volatile (34 return asm volatile (
24 \\ syscall 035 \\ syscall 0
25 : [ret] "={$r4}" (-> u64),36 : [ret] "={$r4}" (-> u64),
...@@ -29,7 +40,12 @@ pub fn syscall2(number: SYS, arg1: u64, arg2: u64) u64 {...@@ -29,7 +40,12 @@ pub fn syscall2(number: SYS, arg1: u64, arg2: u64) u64 {
29 : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });40 : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
30}41}
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 {
33 return asm volatile (49 return asm volatile (
34 \\ syscall 050 \\ syscall 0
35 : [ret] "={$r4}" (-> u64),51 : [ret] "={$r4}" (-> u64),
...@@ -40,7 +56,13 @@ pub fn syscall3(number: SYS, arg1: u64, arg2: u64, arg3: u64) u64 {...@@ -40,7 +56,13 @@ pub fn syscall3(number: SYS, arg1: u64, arg2: u64, arg3: u64) u64 {
40 : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });56 : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
41}57}
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 {
44 return asm volatile (66 return asm volatile (
45 \\ syscall 067 \\ syscall 0
46 : [ret] "={$r4}" (-> u64),68 : [ret] "={$r4}" (-> u64),
...@@ -52,7 +74,14 @@ pub fn syscall4(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64) u64 {...@@ -52,7 +74,14 @@ pub fn syscall4(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64) u64 {
52 : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });74 : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
53}75}
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 {
56 return asm volatile (85 return asm volatile (
57 \\ syscall 086 \\ syscall 0
58 : [ret] "={$r4}" (-> u64),87 : [ret] "={$r4}" (-> u64),
...@@ -67,12 +96,12 @@ pub fn syscall5(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64, arg5: u...@@ -67,12 +96,12 @@ pub fn syscall5(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64, arg5: u
6796
68pub fn syscall6(97pub fn syscall6(
69 number: SYS,98 number: SYS,
70 arg1: u64,99 arg1: syscall_arg_t,
71 arg2: u64,100 arg2: syscall_arg_t,
72 arg3: u64,101 arg3: syscall_arg_t,
73 arg4: u64,102 arg4: syscall_arg_t,
74 arg5: u64,103 arg5: syscall_arg_t,
75 arg6: u64,104 arg6: syscall_arg_t,
76) u64 {105) u64 {
77 return asm volatile (106 return asm volatile (
78 \\ syscall 0107 \\ syscall 0
lib/std/os/linux/m68k.zig+41-13
...@@ -2,14 +2,21 @@ const builtin = @import("builtin");...@@ -2,14 +2,21 @@ const builtin = @import("builtin");
2const std = @import("../../std.zig");2const std = @import("../../std.zig");
3const SYS = std.os.linux.SYS;3const 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 {
6 return asm volatile ("trap #0"10 return asm volatile ("trap #0"
7 : [ret] "={d0}" (-> u32),11 : [ret] "={d0}" (-> u32),
8 : [number] "{d0}" (@intFromEnum(number)),12 : [number] "{d0}" (@intFromEnum(number)),
9 : .{ .memory = true });13 : .{ .memory = true });
10}14}
1115
12pub fn syscall1(number: SYS, arg1: u32) u32 {16pub fn syscall1(
17 number: SYS,
18 arg1: syscall_arg_t,
19) u32 {
13 return asm volatile ("trap #0"20 return asm volatile ("trap #0"
14 : [ret] "={d0}" (-> u32),21 : [ret] "={d0}" (-> u32),
15 : [number] "{d0}" (@intFromEnum(number)),22 : [number] "{d0}" (@intFromEnum(number)),
...@@ -17,7 +24,11 @@ pub fn syscall1(number: SYS, arg1: u32) u32 {...@@ -17,7 +24,11 @@ pub fn syscall1(number: SYS, arg1: u32) u32 {
17 : .{ .memory = true });24 : .{ .memory = true });
18}25}
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 {
21 return asm volatile ("trap #0"32 return asm volatile ("trap #0"
22 : [ret] "={d0}" (-> u32),33 : [ret] "={d0}" (-> u32),
23 : [number] "{d0}" (@intFromEnum(number)),34 : [number] "{d0}" (@intFromEnum(number)),
...@@ -26,7 +37,12 @@ pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {...@@ -26,7 +37,12 @@ pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {
26 : .{ .memory = true });37 : .{ .memory = true });
27}38}
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 {
30 return asm volatile ("trap #0"46 return asm volatile ("trap #0"
31 : [ret] "={d0}" (-> u32),47 : [ret] "={d0}" (-> u32),
32 : [number] "{d0}" (@intFromEnum(number)),48 : [number] "{d0}" (@intFromEnum(number)),
...@@ -36,7 +52,13 @@ pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {...@@ -36,7 +52,13 @@ pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {
36 : .{ .memory = true });52 : .{ .memory = true });
37}53}
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 {
40 return asm volatile ("trap #0"62 return asm volatile ("trap #0"
41 : [ret] "={d0}" (-> u32),63 : [ret] "={d0}" (-> u32),
42 : [number] "{d0}" (@intFromEnum(number)),64 : [number] "{d0}" (@intFromEnum(number)),
...@@ -47,7 +69,14 @@ pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {...@@ -47,7 +69,14 @@ pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {
47 : .{ .memory = true });69 : .{ .memory = true });
48}70}
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 {
51 return asm volatile ("trap #0"80 return asm volatile ("trap #0"
52 : [ret] "={d0}" (-> u32),81 : [ret] "={d0}" (-> u32),
53 : [number] "{d0}" (@intFromEnum(number)),82 : [number] "{d0}" (@intFromEnum(number)),
...@@ -61,12 +90,12 @@ pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u...@@ -61,12 +90,12 @@ pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u
6190
62pub fn syscall6(91pub fn syscall6(
63 number: SYS,92 number: SYS,
64 arg1: u32,93 arg1: syscall_arg_t,
65 arg2: u32,94 arg2: syscall_arg_t,
66 arg3: u32,95 arg3: syscall_arg_t,
67 arg4: u32,96 arg4: syscall_arg_t,
68 arg5: u32,97 arg5: syscall_arg_t,
69 arg6: u32,98 arg6: syscall_arg_t,
70) u32 {99) u32 {
71 return asm volatile ("trap #0"100 return asm volatile ("trap #0"
72 : [ret] "={d0}" (-> u32),101 : [ret] "={d0}" (-> u32),
...@@ -144,5 +173,4 @@ pub fn restore_rt() callconv(.naked) noreturn {...@@ -144,5 +173,4 @@ pub fn restore_rt() callconv(.naked) noreturn {
144173
145pub const time_t = i32;174pub const time_t = i32;
146175
147// No VDSO used as of glibc 112a0ae18b831bf31f44d81b82666980312511d6.
148pub const VDSO = void;176pub const VDSO = void;
lib/std/os/linux/mips.zig+67-36
...@@ -2,7 +2,11 @@ const builtin = @import("builtin");...@@ -2,7 +2,11 @@ const builtin = @import("builtin");
2const std = @import("../../std.zig");2const std = @import("../../std.zig");
3const SYS = std.os.linux.SYS;3const 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 {
6 return asm volatile (10 return asm volatile (
7 \\ syscall11 \\ syscall
8 \\ beq $a3, $zero, 1f12 \\ beq $a3, $zero, 1f
...@@ -14,24 +18,10 @@ pub fn syscall0(number: SYS) u32 {...@@ -14,24 +18,10 @@ pub fn syscall0(number: SYS) u32 {
14 : .{ .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 });18 : .{ .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 });
15}19}
1620
17pub fn syscall_pipe(fd: *[2]i32) u32 {21pub fn syscall1(
18 return asm volatile (22 number: SYS,
19 \\ syscall23 arg1: syscall_arg_t,
20 \\ beq $a3, $zero, 1f24) u32 {
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 {
35 return asm volatile (25 return asm volatile (
36 \\ syscall26 \\ syscall
37 \\ beq $a3, $zero, 1f27 \\ beq $a3, $zero, 1f
...@@ -44,7 +34,11 @@ pub fn syscall1(number: SYS, arg1: u32) u32 {...@@ -44,7 +34,11 @@ pub fn syscall1(number: SYS, arg1: u32) u32 {
44 : .{ .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 });34 : .{ .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 });
45}35}
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 {
48 return asm volatile (42 return asm volatile (
49 \\ syscall43 \\ syscall
50 \\ beq $a3, $zero, 1f44 \\ beq $a3, $zero, 1f
...@@ -58,7 +52,12 @@ pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {...@@ -58,7 +52,12 @@ pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {
58 : .{ .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 });52 : .{ .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 });
59}53}
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 {
62 return asm volatile (61 return asm volatile (
63 \\ syscall62 \\ syscall
64 \\ beq $a3, $zero, 1f63 \\ beq $a3, $zero, 1f
...@@ -73,7 +72,13 @@ pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {...@@ -73,7 +72,13 @@ pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {
73 : .{ .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 });72 : .{ .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 });
74}73}
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 {
77 return asm volatile (82 return asm volatile (
78 \\ syscall83 \\ syscall
79 \\ beq $a3, $zero, 1f84 \\ beq $a3, $zero, 1f
...@@ -92,7 +97,14 @@ pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {...@@ -92,7 +97,14 @@ pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {
92// NOTE: The o32 calling convention requires the callee to reserve 16 bytes for97// NOTE: The o32 calling convention requires the callee to reserve 16 bytes for
93// the first four arguments even though they're passed in $a0-$a3.98// 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 {
96 return asm volatile (108 return asm volatile (
97 \\ subu $sp, $sp, 24109 \\ subu $sp, $sp, 24
98 \\ sw %[arg5], 16($sp)110 \\ sw %[arg5], 16($sp)
...@@ -114,12 +126,12 @@ pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u...@@ -114,12 +126,12 @@ pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u
114126
115pub fn syscall6(127pub fn syscall6(
116 number: SYS,128 number: SYS,
117 arg1: u32,129 arg1: syscall_arg_t,
118 arg2: u32,130 arg2: syscall_arg_t,
119 arg3: u32,131 arg3: syscall_arg_t,
120 arg4: u32,132 arg4: syscall_arg_t,
121 arg5: u32,133 arg5: syscall_arg_t,
122 arg6: u32,134 arg6: syscall_arg_t,
123) u32 {135) u32 {
124 return asm volatile (136 return asm volatile (
125 \\ subu $sp, $sp, 24137 \\ subu $sp, $sp, 24
...@@ -144,13 +156,13 @@ pub fn syscall6(...@@ -144,13 +156,13 @@ pub fn syscall6(
144156
145pub fn syscall7(157pub fn syscall7(
146 number: SYS,158 number: SYS,
147 arg1: u32,159 arg1: syscall_arg_t,
148 arg2: u32,160 arg2: syscall_arg_t,
149 arg3: u32,161 arg3: syscall_arg_t,
150 arg4: u32,162 arg4: syscall_arg_t,
151 arg5: u32,163 arg5: syscall_arg_t,
152 arg6: u32,164 arg6: syscall_arg_t,
153 arg7: u32,165 arg7: syscall_arg_t,
154) u32 {166) u32 {
155 return asm volatile (167 return asm volatile (
156 \\ subu $sp, $sp, 32168 \\ subu $sp, $sp, 32
...@@ -175,6 +187,25 @@ pub fn syscall7(...@@ -175,6 +187,25 @@ pub fn syscall7(
175 : .{ .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 });187 : .{ .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 });
176}188}
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
178pub fn clone() callconv(.naked) u32 {209pub fn clone() callconv(.naked) u32 {
179 // __clone(func, stack, flags, arg, ptid, tls, ctid)210 // __clone(func, stack, flags, arg, ptid, tls, ctid)
180 // a0, a1, a2, a3, +0, +4, +8211 // a0, a1, a2, a3, +0, +4, +8
lib/std/os/linux/mips64.zig+60-29
...@@ -2,7 +2,11 @@ const builtin = @import("builtin");...@@ -2,7 +2,11 @@ const builtin = @import("builtin");
2const std = @import("../../std.zig");2const std = @import("../../std.zig");
3const SYS = std.os.linux.SYS;3const 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 {
6 return asm volatile (10 return asm volatile (
7 \\ syscall11 \\ syscall
8 \\ beq $a3, $zero, 1f12 \\ beq $a3, $zero, 1f
...@@ -14,24 +18,10 @@ pub fn syscall0(number: SYS) u64 {...@@ -14,24 +18,10 @@ pub fn syscall0(number: SYS) u64 {
14 : .{ .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 });18 : .{ .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 });
15}19}
1620
17pub fn syscall_pipe(fd: *[2]i32) u64 {21pub fn syscall1(
18 return asm volatile (22 number: SYS,
19 \\ syscall23 arg1: syscall_arg_t,
20 \\ beq $a3, $zero, 1f24) u64 {
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 {
35 return asm volatile (25 return asm volatile (
36 \\ syscall26 \\ syscall
37 \\ beq $a3, $zero, 1f27 \\ beq $a3, $zero, 1f
...@@ -44,7 +34,11 @@ pub fn syscall1(number: SYS, arg1: u64) u64 {...@@ -44,7 +34,11 @@ pub fn syscall1(number: SYS, arg1: u64) u64 {
44 : .{ .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 });34 : .{ .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 });
45}35}
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 {
48 return asm volatile (42 return asm volatile (
49 \\ syscall43 \\ syscall
50 \\ beq $a3, $zero, 1f44 \\ beq $a3, $zero, 1f
...@@ -58,7 +52,12 @@ pub fn syscall2(number: SYS, arg1: u64, arg2: u64) u64 {...@@ -58,7 +52,12 @@ pub fn syscall2(number: SYS, arg1: u64, arg2: u64) u64 {
58 : .{ .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 });52 : .{ .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 });
59}53}
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 {
62 return asm volatile (61 return asm volatile (
63 \\ syscall62 \\ syscall
64 \\ beq $a3, $zero, 1f63 \\ beq $a3, $zero, 1f
...@@ -73,7 +72,13 @@ pub fn syscall3(number: SYS, arg1: u64, arg2: u64, arg3: u64) u64 {...@@ -73,7 +72,13 @@ pub fn syscall3(number: SYS, arg1: u64, arg2: u64, arg3: u64) u64 {
73 : .{ .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 });72 : .{ .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 });
74}73}
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 {
77 return asm volatile (82 return asm volatile (
78 \\ syscall83 \\ syscall
79 \\ beq $a3, $zero, 1f84 \\ beq $a3, $zero, 1f
...@@ -89,7 +94,14 @@ pub fn syscall4(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64) u64 {...@@ -89,7 +94,14 @@ pub fn syscall4(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64) u64 {
89 : .{ .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 });94 : .{ .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 });
90}95}
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 {
93 return asm volatile (105 return asm volatile (
94 \\ syscall106 \\ syscall
95 \\ beq $a3, $zero, 1f107 \\ beq $a3, $zero, 1f
...@@ -108,12 +120,12 @@ pub fn syscall5(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64, arg5: u...@@ -108,12 +120,12 @@ pub fn syscall5(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64, arg5: u
108120
109pub fn syscall6(121pub fn syscall6(
110 number: SYS,122 number: SYS,
111 arg1: u64,123 arg1: syscall_arg_t,
112 arg2: u64,124 arg2: syscall_arg_t,
113 arg3: u64,125 arg3: syscall_arg_t,
114 arg4: u64,126 arg4: syscall_arg_t,
115 arg5: u64,127 arg5: syscall_arg_t,
116 arg6: u64,128 arg6: syscall_arg_t,
117) u64 {129) u64 {
118 return asm volatile (130 return asm volatile (
119 \\ syscall131 \\ syscall
...@@ -132,6 +144,25 @@ pub fn syscall6(...@@ -132,6 +144,25 @@ pub fn syscall6(
132 : .{ .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 });144 : .{ .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 });
133}145}
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
135pub fn clone() callconv(.naked) u64 {166pub fn clone() callconv(.naked) u64 {
136 // __clone(func, stack, flags, arg, ptid, tls, ctid)167 // __clone(func, stack, flags, arg, ptid, tls, ctid)
137 // a0, a1, a2, a3, a4, a5, a6168 // a0, a1, a2, a3, a4, a5, a6
lib/std/os/linux/mipsn32.zig+60-29
...@@ -2,7 +2,11 @@ const builtin = @import("builtin");...@@ -2,7 +2,11 @@ const builtin = @import("builtin");
2const std = @import("../../std.zig");2const std = @import("../../std.zig");
3const SYS = std.os.linux.SYS;3const 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 {
6 return asm volatile (10 return asm volatile (
7 \\ syscall11 \\ syscall
8 \\ beq $a3, $zero, 1f12 \\ beq $a3, $zero, 1f
...@@ -14,24 +18,10 @@ pub fn syscall0(number: SYS) u32 {...@@ -14,24 +18,10 @@ pub fn syscall0(number: SYS) u32 {
14 : .{ .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 });18 : .{ .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 });
15}19}
1620
17pub fn syscall_pipe(fd: *[2]i32) u32 {21pub fn syscall1(
18 return asm volatile (22 number: SYS,
19 \\ syscall23 arg1: syscall_arg_t,
20 \\ beq $a3, $zero, 1f24) u32 {
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 {
35 return asm volatile (25 return asm volatile (
36 \\ syscall26 \\ syscall
37 \\ beq $a3, $zero, 1f27 \\ beq $a3, $zero, 1f
...@@ -44,7 +34,11 @@ pub fn syscall1(number: SYS, arg1: u32) u32 {...@@ -44,7 +34,11 @@ pub fn syscall1(number: SYS, arg1: u32) u32 {
44 : .{ .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 });34 : .{ .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 });
45}35}
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 {
48 return asm volatile (42 return asm volatile (
49 \\ syscall43 \\ syscall
50 \\ beq $a3, $zero, 1f44 \\ beq $a3, $zero, 1f
...@@ -58,7 +52,12 @@ pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {...@@ -58,7 +52,12 @@ pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {
58 : .{ .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 });52 : .{ .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 });
59}53}
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 {
62 return asm volatile (61 return asm volatile (
63 \\ syscall62 \\ syscall
64 \\ beq $a3, $zero, 1f63 \\ beq $a3, $zero, 1f
...@@ -73,7 +72,13 @@ pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {...@@ -73,7 +72,13 @@ pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {
73 : .{ .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 });72 : .{ .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 });
74}73}
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 {
77 return asm volatile (82 return asm volatile (
78 \\ syscall83 \\ syscall
79 \\ beq $a3, $zero, 1f84 \\ beq $a3, $zero, 1f
...@@ -89,7 +94,14 @@ pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {...@@ -89,7 +94,14 @@ pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {
89 : .{ .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 });94 : .{ .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 });
90}95}
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 {
93 return asm volatile (105 return asm volatile (
94 \\ syscall106 \\ syscall
95 \\ beq $a3, $zero, 1f107 \\ beq $a3, $zero, 1f
...@@ -108,12 +120,12 @@ pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u...@@ -108,12 +120,12 @@ pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u
108120
109pub fn syscall6(121pub fn syscall6(
110 number: SYS,122 number: SYS,
111 arg1: u32,123 arg1: syscall_arg_t,
112 arg2: u32,124 arg2: syscall_arg_t,
113 arg3: u32,125 arg3: syscall_arg_t,
114 arg4: u32,126 arg4: syscall_arg_t,
115 arg5: u32,127 arg5: syscall_arg_t,
116 arg6: u32,128 arg6: syscall_arg_t,
117) u32 {129) u32 {
118 return asm volatile (130 return asm volatile (
119 \\ syscall131 \\ syscall
...@@ -132,6 +144,25 @@ pub fn syscall6(...@@ -132,6 +144,25 @@ pub fn syscall6(
132 : .{ .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 });144 : .{ .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 });
133}145}
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
135pub fn clone() callconv(.naked) u32 {166pub fn clone() callconv(.naked) u32 {
136 // __clone(func, stack, flags, arg, ptid, tls, ctid)167 // __clone(func, stack, flags, arg, ptid, tls, ctid)
137 // a0, a1, a2, a3, a4, a5, a6168 // a0, a1, a2, a3, a4, a5, a6
lib/std/os/linux/or1k.zig+41-12
...@@ -2,7 +2,11 @@ const builtin = @import("builtin");...@@ -2,7 +2,11 @@ const builtin = @import("builtin");
2const std = @import("../../std.zig");2const std = @import("../../std.zig");
3const SYS = std.os.linux.SYS;3const 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 {
6 return asm volatile (10 return asm volatile (
7 \\ l.sys 111 \\ l.sys 1
8 : [ret] "={r11}" (-> u32),12 : [ret] "={r11}" (-> u32),
...@@ -10,7 +14,10 @@ pub fn syscall0(number: SYS) u32 {...@@ -10,7 +14,10 @@ pub fn syscall0(number: SYS) u32 {
10 : .{ .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 });14 : .{ .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 });
11}15}
1216
13pub fn syscall1(number: SYS, arg1: u32) u32 {17pub fn syscall1(
18 number: SYS,
19 arg1: syscall_arg_t,
20) u32 {
14 return asm volatile (21 return asm volatile (
15 \\ l.sys 122 \\ l.sys 1
16 : [ret] "={r11}" (-> u32),23 : [ret] "={r11}" (-> u32),
...@@ -19,7 +26,11 @@ pub fn syscall1(number: SYS, arg1: u32) u32 {...@@ -19,7 +26,11 @@ pub fn syscall1(number: SYS, arg1: u32) u32 {
19 : .{ .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 });26 : .{ .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 });
20}27}
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 {
23 return asm volatile (34 return asm volatile (
24 \\ l.sys 135 \\ l.sys 1
25 : [ret] "={r11}" (-> u32),36 : [ret] "={r11}" (-> u32),
...@@ -29,7 +40,12 @@ pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {...@@ -29,7 +40,12 @@ pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {
29 : .{ .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 });40 : .{ .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 });
30}41}
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 {
33 return asm volatile (49 return asm volatile (
34 \\ l.sys 150 \\ l.sys 1
35 : [ret] "={r11}" (-> u32),51 : [ret] "={r11}" (-> u32),
...@@ -40,7 +56,13 @@ pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {...@@ -40,7 +56,13 @@ pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {
40 : .{ .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 });56 : .{ .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 });
41}57}
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 {
44 return asm volatile (66 return asm volatile (
45 \\ l.sys 167 \\ l.sys 1
46 : [ret] "={r11}" (-> u32),68 : [ret] "={r11}" (-> u32),
...@@ -52,7 +74,14 @@ pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {...@@ -52,7 +74,14 @@ pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {
52 : .{ .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 });74 : .{ .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 });
53}75}
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 {
56 return asm volatile (85 return asm volatile (
57 \\ l.sys 186 \\ l.sys 1
58 : [ret] "={r11}" (-> u32),87 : [ret] "={r11}" (-> u32),
...@@ -67,12 +96,12 @@ pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u...@@ -67,12 +96,12 @@ pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u
6796
68pub fn syscall6(97pub fn syscall6(
69 number: SYS,98 number: SYS,
70 arg1: u32,99 arg1: syscall_arg_t,
71 arg2: u32,100 arg2: syscall_arg_t,
72 arg3: u32,101 arg3: syscall_arg_t,
73 arg4: u32,102 arg4: syscall_arg_t,
74 arg5: u32,103 arg5: syscall_arg_t,
75 arg6: u32,104 arg6: syscall_arg_t,
76) u32 {105) u32 {
77 return asm volatile (106 return asm volatile (
78 \\ l.sys 1107 \\ l.sys 1
lib/std/os/linux/powerpc.zig+41-12
...@@ -2,7 +2,11 @@ const builtin = @import("builtin");...@@ -2,7 +2,11 @@ const builtin = @import("builtin");
2const std = @import("../../std.zig");2const std = @import("../../std.zig");
3const SYS = std.os.linux.SYS;3const 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 {
6 // r0 is both an input register and a clobber. musl and glibc achieve this with10 // r0 is both an input register and a clobber. musl and glibc achieve this with
7 // a "+" constraint, which isn't supported in Zig, so instead we separately list11 // a "+" constraint, which isn't supported in Zig, so instead we separately list
8 // r0 as both an input and an output. (Listing it as an input and a clobber would12 // 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 {...@@ -19,7 +23,10 @@ pub fn syscall0(number: SYS) u32 {
19 : .{ .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 });23 : .{ .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 });
20}24}
2125
22pub fn syscall1(number: SYS, arg1: u32) u32 {26pub fn syscall1(
27 number: SYS,
28 arg1: syscall_arg_t,
29) u32 {
23 // r0 is both an input and a clobber.30 // r0 is both an input and a clobber.
24 var r0_out: u32 = undefined;31 var r0_out: u32 = undefined;
25 return asm volatile (32 return asm volatile (
...@@ -34,7 +41,11 @@ pub fn syscall1(number: SYS, arg1: u32) u32 {...@@ -34,7 +41,11 @@ pub fn syscall1(number: SYS, arg1: u32) u32 {
34 : .{ .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 });41 : .{ .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 });
35}42}
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 {
38 // These registers are both inputs and clobbers.49 // These registers are both inputs and clobbers.
39 var r0_out: u32 = undefined;50 var r0_out: u32 = undefined;
40 var r4_out: u32 = undefined;51 var r4_out: u32 = undefined;
...@@ -52,7 +63,12 @@ pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {...@@ -52,7 +63,12 @@ pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {
52 : .{ .memory = true, .cr0 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .ctr = true, .xer = true });63 : .{ .memory = true, .cr0 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .ctr = true, .xer = true });
53}64}
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 {
56 // These registers are both inputs and clobbers.72 // These registers are both inputs and clobbers.
57 var r0_out: u32 = undefined;73 var r0_out: u32 = undefined;
58 var r4_out: u32 = undefined;74 var r4_out: u32 = undefined;
...@@ -73,7 +89,13 @@ pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {...@@ -73,7 +89,13 @@ pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {
73 : .{ .memory = true, .cr0 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .ctr = true, .xer = true });89 : .{ .memory = true, .cr0 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .ctr = true, .xer = true });
74}90}
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 {
77 // These registers are both inputs and clobbers.99 // These registers are both inputs and clobbers.
78 var r0_out: u32 = undefined;100 var r0_out: u32 = undefined;
79 var r4_out: u32 = undefined;101 var r4_out: u32 = undefined;
...@@ -97,7 +119,14 @@ pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {...@@ -97,7 +119,14 @@ pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {
97 : .{ .memory = true, .cr0 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .ctr = true, .xer = true });119 : .{ .memory = true, .cr0 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .ctr = true, .xer = true });
98}120}
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 {
101 // These registers are both inputs and clobbers.130 // These registers are both inputs and clobbers.
102 var r0_out: u32 = undefined;131 var r0_out: u32 = undefined;
103 var r4_out: u32 = undefined;132 var r4_out: u32 = undefined;
...@@ -126,12 +155,12 @@ pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u...@@ -126,12 +155,12 @@ pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u
126155
127pub fn syscall6(156pub fn syscall6(
128 number: SYS,157 number: SYS,
129 arg1: u32,158 arg1: syscall_arg_t,
130 arg2: u32,159 arg2: syscall_arg_t,
131 arg3: u32,160 arg3: syscall_arg_t,
132 arg4: u32,161 arg4: syscall_arg_t,
133 arg5: u32,162 arg5: syscall_arg_t,
134 arg6: u32,163 arg6: syscall_arg_t,
135) u32 {164) u32 {
136 // These registers are both inputs and clobbers.165 // These registers are both inputs and clobbers.
137 var r0_out: u32 = undefined;166 var r0_out: u32 = undefined;
lib/std/os/linux/powerpc64.zig+41-12
...@@ -2,7 +2,11 @@ const builtin = @import("builtin");...@@ -2,7 +2,11 @@ const builtin = @import("builtin");
2const std = @import("../../std.zig");2const std = @import("../../std.zig");
3const SYS = std.os.linux.SYS;3const 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 {
6 // r0 is both an input register and a clobber. musl and glibc achieve this with10 // r0 is both an input register and a clobber. musl and glibc achieve this with
7 // a "+" constraint, which isn't supported in Zig, so instead we separately list11 // a "+" constraint, which isn't supported in Zig, so instead we separately list
8 // r0 as both an input and an output. (Listing it as an input and a clobber would12 // 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 {...@@ -19,7 +23,10 @@ pub fn syscall0(number: SYS) u64 {
19 : .{ .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 });23 : .{ .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 });
20}24}
2125
22pub fn syscall1(number: SYS, arg1: u64) u64 {26pub fn syscall1(
27 number: SYS,
28 arg1: syscall_arg_t,
29) u64 {
23 // r0 is both an input and a clobber.30 // r0 is both an input and a clobber.
24 var r0_out: u64 = undefined;31 var r0_out: u64 = undefined;
25 return asm volatile (32 return asm volatile (
...@@ -34,7 +41,11 @@ pub fn syscall1(number: SYS, arg1: u64) u64 {...@@ -34,7 +41,11 @@ pub fn syscall1(number: SYS, arg1: u64) u64 {
34 : .{ .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 });41 : .{ .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 });
35}42}
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 {
38 // These registers are both inputs and clobbers.49 // These registers are both inputs and clobbers.
39 var r0_out: u64 = undefined;50 var r0_out: u64 = undefined;
40 var r4_out: u64 = undefined;51 var r4_out: u64 = undefined;
...@@ -52,7 +63,12 @@ pub fn syscall2(number: SYS, arg1: u64, arg2: u64) u64 {...@@ -52,7 +63,12 @@ pub fn syscall2(number: SYS, arg1: u64, arg2: u64) u64 {
52 : .{ .memory = true, .cr0 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .ctr = true, .xer = true });63 : .{ .memory = true, .cr0 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .ctr = true, .xer = true });
53}64}
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 {
56 // These registers are both inputs and clobbers.72 // These registers are both inputs and clobbers.
57 var r0_out: u64 = undefined;73 var r0_out: u64 = undefined;
58 var r4_out: u64 = undefined;74 var r4_out: u64 = undefined;
...@@ -73,7 +89,13 @@ pub fn syscall3(number: SYS, arg1: u64, arg2: u64, arg3: u64) u64 {...@@ -73,7 +89,13 @@ pub fn syscall3(number: SYS, arg1: u64, arg2: u64, arg3: u64) u64 {
73 : .{ .memory = true, .cr0 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .ctr = true, .xer = true });89 : .{ .memory = true, .cr0 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .ctr = true, .xer = true });
74}90}
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 {
77 // These registers are both inputs and clobbers.99 // These registers are both inputs and clobbers.
78 var r0_out: u64 = undefined;100 var r0_out: u64 = undefined;
79 var r4_out: u64 = undefined;101 var r4_out: u64 = undefined;
...@@ -97,7 +119,14 @@ pub fn syscall4(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64) u64 {...@@ -97,7 +119,14 @@ pub fn syscall4(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64) u64 {
97 : .{ .memory = true, .cr0 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .ctr = true, .xer = true });119 : .{ .memory = true, .cr0 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .ctr = true, .xer = true });
98}120}
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 {
101 // These registers are both inputs and clobbers.130 // These registers are both inputs and clobbers.
102 var r0_out: u64 = undefined;131 var r0_out: u64 = undefined;
103 var r4_out: u64 = undefined;132 var r4_out: u64 = undefined;
...@@ -126,12 +155,12 @@ pub fn syscall5(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64, arg5: u...@@ -126,12 +155,12 @@ pub fn syscall5(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64, arg5: u
126155
127pub fn syscall6(156pub fn syscall6(
128 number: SYS,157 number: SYS,
129 arg1: u64,158 arg1: syscall_arg_t,
130 arg2: u64,159 arg2: syscall_arg_t,
131 arg3: u64,160 arg3: syscall_arg_t,
132 arg4: u64,161 arg4: syscall_arg_t,
133 arg5: u64,162 arg5: syscall_arg_t,
134 arg6: u64,163 arg6: syscall_arg_t,
135) u64 {164) u64 {
136 // These registers are both inputs and clobbers.165 // These registers are both inputs and clobbers.
137 var r0_out: u64 = undefined;166 var r0_out: u64 = undefined;
lib/std/os/linux/riscv32.zig+41-12
...@@ -2,14 +2,21 @@ const builtin = @import("builtin");...@@ -2,14 +2,21 @@ const builtin = @import("builtin");
2const std = @import("../../std.zig");2const std = @import("../../std.zig");
3const SYS = std.os.linux.SYS;3const 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 {
6 return asm volatile ("ecall"10 return asm volatile ("ecall"
7 : [ret] "={x10}" (-> u32),11 : [ret] "={x10}" (-> u32),
8 : [number] "{x17}" (@intFromEnum(number)),12 : [number] "{x17}" (@intFromEnum(number)),
9 : .{ .memory = true });13 : .{ .memory = true });
10}14}
1115
12pub fn syscall1(number: SYS, arg1: u32) u32 {16pub fn syscall1(
17 number: SYS,
18 arg1: syscall_arg_t,
19) u32 {
13 return asm volatile ("ecall"20 return asm volatile ("ecall"
14 : [ret] "={x10}" (-> u32),21 : [ret] "={x10}" (-> u32),
15 : [number] "{x17}" (@intFromEnum(number)),22 : [number] "{x17}" (@intFromEnum(number)),
...@@ -17,7 +24,11 @@ pub fn syscall1(number: SYS, arg1: u32) u32 {...@@ -17,7 +24,11 @@ pub fn syscall1(number: SYS, arg1: u32) u32 {
17 : .{ .memory = true });24 : .{ .memory = true });
18}25}
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 {
21 return asm volatile ("ecall"32 return asm volatile ("ecall"
22 : [ret] "={x10}" (-> u32),33 : [ret] "={x10}" (-> u32),
23 : [number] "{x17}" (@intFromEnum(number)),34 : [number] "{x17}" (@intFromEnum(number)),
...@@ -26,7 +37,12 @@ pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {...@@ -26,7 +37,12 @@ pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {
26 : .{ .memory = true });37 : .{ .memory = true });
27}38}
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 {
30 return asm volatile ("ecall"46 return asm volatile ("ecall"
31 : [ret] "={x10}" (-> u32),47 : [ret] "={x10}" (-> u32),
32 : [number] "{x17}" (@intFromEnum(number)),48 : [number] "{x17}" (@intFromEnum(number)),
...@@ -36,7 +52,13 @@ pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {...@@ -36,7 +52,13 @@ pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {
36 : .{ .memory = true });52 : .{ .memory = true });
37}53}
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 {
40 return asm volatile ("ecall"62 return asm volatile ("ecall"
41 : [ret] "={x10}" (-> u32),63 : [ret] "={x10}" (-> u32),
42 : [number] "{x17}" (@intFromEnum(number)),64 : [number] "{x17}" (@intFromEnum(number)),
...@@ -47,7 +69,14 @@ pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {...@@ -47,7 +69,14 @@ pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {
47 : .{ .memory = true });69 : .{ .memory = true });
48}70}
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 {
51 return asm volatile ("ecall"80 return asm volatile ("ecall"
52 : [ret] "={x10}" (-> u32),81 : [ret] "={x10}" (-> u32),
53 : [number] "{x17}" (@intFromEnum(number)),82 : [number] "{x17}" (@intFromEnum(number)),
...@@ -61,12 +90,12 @@ pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u...@@ -61,12 +90,12 @@ pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u
6190
62pub fn syscall6(91pub fn syscall6(
63 number: SYS,92 number: SYS,
64 arg1: u32,93 arg1: syscall_arg_t,
65 arg2: u32,94 arg2: syscall_arg_t,
66 arg3: u32,95 arg3: syscall_arg_t,
67 arg4: u32,96 arg4: syscall_arg_t,
68 arg5: u32,97 arg5: syscall_arg_t,
69 arg6: u32,98 arg6: syscall_arg_t,
70) u32 {99) u32 {
71 return asm volatile ("ecall"100 return asm volatile ("ecall"
72 : [ret] "={x10}" (-> u32),101 : [ret] "={x10}" (-> u32),
lib/std/os/linux/riscv64.zig+41-12
...@@ -2,14 +2,21 @@ const builtin = @import("builtin");...@@ -2,14 +2,21 @@ const builtin = @import("builtin");
2const std = @import("../../std.zig");2const std = @import("../../std.zig");
3const SYS = std.os.linux.SYS;3const 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 {
6 return asm volatile ("ecall"10 return asm volatile ("ecall"
7 : [ret] "={x10}" (-> u64),11 : [ret] "={x10}" (-> u64),
8 : [number] "{x17}" (@intFromEnum(number)),12 : [number] "{x17}" (@intFromEnum(number)),
9 : .{ .memory = true });13 : .{ .memory = true });
10}14}
1115
12pub fn syscall1(number: SYS, arg1: u64) u64 {16pub fn syscall1(
17 number: SYS,
18 arg1: syscall_arg_t,
19) u64 {
13 return asm volatile ("ecall"20 return asm volatile ("ecall"
14 : [ret] "={x10}" (-> u64),21 : [ret] "={x10}" (-> u64),
15 : [number] "{x17}" (@intFromEnum(number)),22 : [number] "{x17}" (@intFromEnum(number)),
...@@ -17,7 +24,11 @@ pub fn syscall1(number: SYS, arg1: u64) u64 {...@@ -17,7 +24,11 @@ pub fn syscall1(number: SYS, arg1: u64) u64 {
17 : .{ .memory = true });24 : .{ .memory = true });
18}25}
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 {
21 return asm volatile ("ecall"32 return asm volatile ("ecall"
22 : [ret] "={x10}" (-> u64),33 : [ret] "={x10}" (-> u64),
23 : [number] "{x17}" (@intFromEnum(number)),34 : [number] "{x17}" (@intFromEnum(number)),
...@@ -26,7 +37,12 @@ pub fn syscall2(number: SYS, arg1: u64, arg2: u64) u64 {...@@ -26,7 +37,12 @@ pub fn syscall2(number: SYS, arg1: u64, arg2: u64) u64 {
26 : .{ .memory = true });37 : .{ .memory = true });
27}38}
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 {
30 return asm volatile ("ecall"46 return asm volatile ("ecall"
31 : [ret] "={x10}" (-> u64),47 : [ret] "={x10}" (-> u64),
32 : [number] "{x17}" (@intFromEnum(number)),48 : [number] "{x17}" (@intFromEnum(number)),
...@@ -36,7 +52,13 @@ pub fn syscall3(number: SYS, arg1: u64, arg2: u64, arg3: u64) u64 {...@@ -36,7 +52,13 @@ pub fn syscall3(number: SYS, arg1: u64, arg2: u64, arg3: u64) u64 {
36 : .{ .memory = true });52 : .{ .memory = true });
37}53}
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 {
40 return asm volatile ("ecall"62 return asm volatile ("ecall"
41 : [ret] "={x10}" (-> u64),63 : [ret] "={x10}" (-> u64),
42 : [number] "{x17}" (@intFromEnum(number)),64 : [number] "{x17}" (@intFromEnum(number)),
...@@ -47,7 +69,14 @@ pub fn syscall4(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64) u64 {...@@ -47,7 +69,14 @@ pub fn syscall4(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64) u64 {
47 : .{ .memory = true });69 : .{ .memory = true });
48}70}
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 {
51 return asm volatile ("ecall"80 return asm volatile ("ecall"
52 : [ret] "={x10}" (-> u64),81 : [ret] "={x10}" (-> u64),
53 : [number] "{x17}" (@intFromEnum(number)),82 : [number] "{x17}" (@intFromEnum(number)),
...@@ -61,12 +90,12 @@ pub fn syscall5(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64, arg5: u...@@ -61,12 +90,12 @@ pub fn syscall5(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64, arg5: u
6190
62pub fn syscall6(91pub fn syscall6(
63 number: SYS,92 number: SYS,
64 arg1: u64,93 arg1: syscall_arg_t,
65 arg2: u64,94 arg2: syscall_arg_t,
66 arg3: u64,95 arg3: syscall_arg_t,
67 arg4: u64,96 arg4: syscall_arg_t,
68 arg5: u64,97 arg5: syscall_arg_t,
69 arg6: u64,98 arg6: syscall_arg_t,
70) u64 {99) u64 {
71 return asm volatile ("ecall"100 return asm volatile ("ecall"
72 : [ret] "={x10}" (-> u64),101 : [ret] "={x10}" (-> u64),
lib/std/os/linux/s390x.zig+44-7
...@@ -2,14 +2,21 @@ const builtin = @import("builtin");...@@ -2,14 +2,21 @@ const builtin = @import("builtin");
2const std = @import("../../std.zig");2const std = @import("../../std.zig");
3const SYS = std.os.linux.SYS;3const 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 {
6 return asm volatile ("svc 0"10 return asm volatile ("svc 0"
7 : [ret] "={r2}" (-> u64),11 : [ret] "={r2}" (-> u64),
8 : [number] "{r1}" (@intFromEnum(number)),12 : [number] "{r1}" (@intFromEnum(number)),
9 : .{ .memory = true });13 : .{ .memory = true });
10}14}
1115
12pub fn syscall1(number: SYS, arg1: u64) u64 {16pub fn syscall1(
17 number: SYS,
18 arg1: syscall_arg_t,
19) u64 {
13 return asm volatile ("svc 0"20 return asm volatile ("svc 0"
14 : [ret] "={r2}" (-> u64),21 : [ret] "={r2}" (-> u64),
15 : [number] "{r1}" (@intFromEnum(number)),22 : [number] "{r1}" (@intFromEnum(number)),
...@@ -17,7 +24,11 @@ pub fn syscall1(number: SYS, arg1: u64) u64 {...@@ -17,7 +24,11 @@ pub fn syscall1(number: SYS, arg1: u64) u64 {
17 : .{ .memory = true });24 : .{ .memory = true });
18}25}
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 {
21 return asm volatile ("svc 0"32 return asm volatile ("svc 0"
22 : [ret] "={r2}" (-> u64),33 : [ret] "={r2}" (-> u64),
23 : [number] "{r1}" (@intFromEnum(number)),34 : [number] "{r1}" (@intFromEnum(number)),
...@@ -26,7 +37,12 @@ pub fn syscall2(number: SYS, arg1: u64, arg2: u64) u64 {...@@ -26,7 +37,12 @@ pub fn syscall2(number: SYS, arg1: u64, arg2: u64) u64 {
26 : .{ .memory = true });37 : .{ .memory = true });
27}38}
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 {
30 return asm volatile ("svc 0"46 return asm volatile ("svc 0"
31 : [ret] "={r2}" (-> u64),47 : [ret] "={r2}" (-> u64),
32 : [number] "{r1}" (@intFromEnum(number)),48 : [number] "{r1}" (@intFromEnum(number)),
...@@ -36,7 +52,13 @@ pub fn syscall3(number: SYS, arg1: u64, arg2: u64, arg3: u64) u64 {...@@ -36,7 +52,13 @@ pub fn syscall3(number: SYS, arg1: u64, arg2: u64, arg3: u64) u64 {
36 : .{ .memory = true });52 : .{ .memory = true });
37}53}
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 {
40 return asm volatile ("svc 0"62 return asm volatile ("svc 0"
41 : [ret] "={r2}" (-> u64),63 : [ret] "={r2}" (-> u64),
42 : [number] "{r1}" (@intFromEnum(number)),64 : [number] "{r1}" (@intFromEnum(number)),
...@@ -47,7 +69,14 @@ pub fn syscall4(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64) u64 {...@@ -47,7 +69,14 @@ pub fn syscall4(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64) u64 {
47 : .{ .memory = true });69 : .{ .memory = true });
48}70}
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 {
51 return asm volatile ("svc 0"80 return asm volatile ("svc 0"
52 : [ret] "={r2}" (-> u64),81 : [ret] "={r2}" (-> u64),
53 : [number] "{r1}" (@intFromEnum(number)),82 : [number] "{r1}" (@intFromEnum(number)),
...@@ -59,7 +88,15 @@ pub fn syscall5(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64, arg5: u...@@ -59,7 +88,15 @@ pub fn syscall5(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64, arg5: u
59 : .{ .memory = true });88 : .{ .memory = true });
60}89}
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 {
63 return asm volatile ("svc 0"100 return asm volatile ("svc 0"
64 : [ret] "={r2}" (-> u64),101 : [ret] "={r2}" (-> u64),
65 : [number] "{r1}" (@intFromEnum(number)),102 : [number] "{r1}" (@intFromEnum(number)),
lib/std/os/linux/sparc64.zig+83-52
...@@ -2,49 +2,26 @@ const builtin = @import("builtin");...@@ -2,49 +2,26 @@ const builtin = @import("builtin");
2const std = @import("../../std.zig");2const std = @import("../../std.zig");
3const SYS = std.os.linux.SYS;3const SYS = std.os.linux.SYS;
44
5pub fn syscall_pipe(fd: *[2]i32) u64 {5pub const syscall_arg_t = 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}
246
25pub fn syscall_fork() u64 {7pub fn syscall0(
26 // Linux/sparc64 fork() returns two values in %o0 and %o1:8 number: SYS,
27 // - On the parent's side, %o0 is the child's PID and %o1 is 0.9) u64 {
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.
31 return asm volatile (10 return asm volatile (
32 \\ t 0x6d11 \\ t 0x6d
33 \\ bcc,pt %%xcc, 1f12 \\ bcc,pt %%xcc, 1f
34 \\ nop13 \\ nop
35 \\ ba 2f
36 \\ neg %%o014 \\ neg %%o0
37 \\ 1:15 \\ 1:
38 \\ # Clear the child's %%o0
39 \\ dec %%o1
40 \\ and %%o1, %%o0, %%o0
41 \\ 2:
42 : [ret] "={o0}" (-> u64),16 : [ret] "={o0}" (-> u64),
43 : [number] "{g1}" (@intFromEnum(SYS.fork)),17 : [number] "{g1}" (@intFromEnum(number)),
44 : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });18 : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
45}19}
4620
47pub fn syscall0(number: SYS) u64 {21pub fn syscall1(
22 number: SYS,
23 arg1: syscall_arg_t,
24) u64 {
48 return asm volatile (25 return asm volatile (
49 \\ t 0x6d26 \\ t 0x6d
50 \\ bcc,pt %%xcc, 1f27 \\ bcc,pt %%xcc, 1f
...@@ -53,10 +30,15 @@ pub fn syscall0(number: SYS) u64 {...@@ -53,10 +30,15 @@ pub fn syscall0(number: SYS) u64 {
53 \\ 1:30 \\ 1:
54 : [ret] "={o0}" (-> u64),31 : [ret] "={o0}" (-> u64),
55 : [number] "{g1}" (@intFromEnum(number)),32 : [number] "{g1}" (@intFromEnum(number)),
33 [arg1] "{o0}" (arg1),
56 : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });34 : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
57}35}
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 {
60 return asm volatile (42 return asm volatile (
61 \\ t 0x6d43 \\ t 0x6d
62 \\ bcc,pt %%xcc, 1f44 \\ bcc,pt %%xcc, 1f
...@@ -66,10 +48,16 @@ pub fn syscall1(number: SYS, arg1: u64) u64 {...@@ -66,10 +48,16 @@ pub fn syscall1(number: SYS, arg1: u64) u64 {
66 : [ret] "={o0}" (-> u64),48 : [ret] "={o0}" (-> u64),
67 : [number] "{g1}" (@intFromEnum(number)),49 : [number] "{g1}" (@intFromEnum(number)),
68 [arg1] "{o0}" (arg1),50 [arg1] "{o0}" (arg1),
51 [arg2] "{o1}" (arg2),
69 : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });52 : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
70}53}
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 {
73 return asm volatile (61 return asm volatile (
74 \\ t 0x6d62 \\ t 0x6d
75 \\ bcc,pt %%xcc, 1f63 \\ bcc,pt %%xcc, 1f
...@@ -80,10 +68,17 @@ pub fn syscall2(number: SYS, arg1: u64, arg2: u64) u64 {...@@ -80,10 +68,17 @@ pub fn syscall2(number: SYS, arg1: u64, arg2: u64) u64 {
80 : [number] "{g1}" (@intFromEnum(number)),68 : [number] "{g1}" (@intFromEnum(number)),
81 [arg1] "{o0}" (arg1),69 [arg1] "{o0}" (arg1),
82 [arg2] "{o1}" (arg2),70 [arg2] "{o1}" (arg2),
71 [arg3] "{o2}" (arg3),
83 : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });72 : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
84}73}
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 {
87 return asm volatile (82 return asm volatile (
88 \\ t 0x6d83 \\ t 0x6d
89 \\ bcc,pt %%xcc, 1f84 \\ bcc,pt %%xcc, 1f
...@@ -95,10 +90,18 @@ pub fn syscall3(number: SYS, arg1: u64, arg2: u64, arg3: u64) u64 {...@@ -95,10 +90,18 @@ pub fn syscall3(number: SYS, arg1: u64, arg2: u64, arg3: u64) u64 {
95 [arg1] "{o0}" (arg1),90 [arg1] "{o0}" (arg1),
96 [arg2] "{o1}" (arg2),91 [arg2] "{o1}" (arg2),
97 [arg3] "{o2}" (arg3),92 [arg3] "{o2}" (arg3),
93 [arg4] "{o3}" (arg4),
98 : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });94 : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
99}95}
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 {
102 return asm volatile (105 return asm volatile (
103 \\ t 0x6d106 \\ t 0x6d
104 \\ bcc,pt %%xcc, 1f107 \\ bcc,pt %%xcc, 1f
...@@ -111,10 +114,19 @@ pub fn syscall4(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64) u64 {...@@ -111,10 +114,19 @@ pub fn syscall4(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64) u64 {
111 [arg2] "{o1}" (arg2),114 [arg2] "{o1}" (arg2),
112 [arg3] "{o2}" (arg3),115 [arg3] "{o2}" (arg3),
113 [arg4] "{o3}" (arg4),116 [arg4] "{o3}" (arg4),
117 [arg5] "{o4}" (arg5),
114 : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });118 : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
115}119}
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 {
118 return asm volatile (130 return asm volatile (
119 \\ t 0x6d131 \\ t 0x6d
120 \\ bcc,pt %%xcc, 1f132 \\ bcc,pt %%xcc, 1f
...@@ -128,32 +140,51 @@ pub fn syscall5(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64, arg5: u...@@ -128,32 +140,51 @@ pub fn syscall5(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64, arg5: u
128 [arg3] "{o2}" (arg3),140 [arg3] "{o2}" (arg3),
129 [arg4] "{o3}" (arg4),141 [arg4] "{o3}" (arg4),
130 [arg5] "{o4}" (arg5),142 [arg5] "{o4}" (arg5),
143 [arg6] "{o5}" (arg6),
131 : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });144 : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
132}145}
133146
134pub fn syscall6(147pub fn syscall_pipe(
135 number: SYS,148 fd: *[2]std.os.linux.fd_t,
136 arg1: u64,
137 arg2: u64,
138 arg3: u64,
139 arg4: u64,
140 arg5: u64,
141 arg6: u64,
142) u64 {149) 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.
143 return asm volatile (175 return asm volatile (
144 \\ t 0x6d176 \\ t 0x6d
145 \\ bcc,pt %%xcc, 1f177 \\ bcc,pt %%xcc, 1f
146 \\ nop178 \\ nop
179 \\ ba 2f
147 \\ neg %%o0180 \\ neg %%o0
148 \\ 1:181 \\ 1:
182 \\ # Clear the child's %%o0
183 \\ dec %%o1
184 \\ and %%o1, %%o0, %%o0
185 \\ 2:
149 : [ret] "={o0}" (-> u64),186 : [ret] "={o0}" (-> u64),
150 : [number] "{g1}" (@intFromEnum(number)),187 : [number] "{g1}" (@intFromEnum(SYS.fork)),
151 [arg1] "{o0}" (arg1),
152 [arg2] "{o1}" (arg2),
153 [arg3] "{o2}" (arg3),
154 [arg4] "{o3}" (arg4),
155 [arg5] "{o4}" (arg5),
156 [arg6] "{o5}" (arg6),
157 : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });188 : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
158}189}
159190
lib/std/os/linux/thumb.zig+52-36
...@@ -5,9 +5,14 @@...@@ -5,9 +5,14 @@
5//! to break the frame chain.5//! to break the frame chain.
6const std = @import("../../std.zig");6const std = @import("../../std.zig");
7const SYS = std.os.linux.SYS;7const SYS = std.os.linux.SYS;
8const arm = @import("arm.zig");
89
9pub fn syscall0(number: SYS) u32 {10pub const syscall_arg_t = arm.syscall_arg_t;
10 var buf: [2]u32 = .{ @intFromEnum(number), undefined };11
12pub fn syscall0(
13 number: SYS,
14) u32 {
15 var buf: [2]syscall_arg_t = .{ @intFromEnum(number), undefined };
11 return asm volatile (16 return asm volatile (
12 \\ str r7, [%[tmp], #4]17 \\ str r7, [%[tmp], #4]
13 \\ ldr r7, [%[tmp]]18 \\ ldr r7, [%[tmp]]
...@@ -18,8 +23,11 @@ pub fn syscall0(number: SYS) u32 {...@@ -18,8 +23,11 @@ pub fn syscall0(number: SYS) u32 {
18 : .{ .memory = true });23 : .{ .memory = true });
19}24}
2025
21pub fn syscall1(number: SYS, arg1: u32) u32 {26pub fn syscall1(
22 var buf: [2]u32 = .{ @intFromEnum(number), undefined };27 number: SYS,
28 arg1: syscall_arg_t,
29) u32 {
30 var buf: [2]syscall_arg_t = .{ @intFromEnum(number), undefined };
23 return asm volatile (31 return asm volatile (
24 \\ str r7, [%[tmp], #4]32 \\ str r7, [%[tmp], #4]
25 \\ ldr r7, [%[tmp]]33 \\ ldr r7, [%[tmp]]
...@@ -31,8 +39,12 @@ pub fn syscall1(number: SYS, arg1: u32) u32 {...@@ -31,8 +39,12 @@ pub fn syscall1(number: SYS, arg1: u32) u32 {
31 : .{ .memory = true });39 : .{ .memory = true });
32}40}
3341
34pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {42pub fn syscall2(
35 var buf: [2]u32 = .{ @intFromEnum(number), undefined };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 };
36 return asm volatile (48 return asm volatile (
37 \\ str r7, [%[tmp], #4]49 \\ str r7, [%[tmp], #4]
38 \\ ldr r7, [%[tmp]]50 \\ ldr r7, [%[tmp]]
...@@ -45,8 +57,13 @@ pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {...@@ -45,8 +57,13 @@ pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {
45 : .{ .memory = true });57 : .{ .memory = true });
46}58}
4759
48pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {60pub fn syscall3(
49 var buf: [2]u32 = .{ @intFromEnum(number), undefined };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 };
50 return asm volatile (67 return asm volatile (
51 \\ str r7, [%[tmp], #4]68 \\ str r7, [%[tmp], #4]
52 \\ ldr r7, [%[tmp]]69 \\ ldr r7, [%[tmp]]
...@@ -60,8 +77,14 @@ pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {...@@ -60,8 +77,14 @@ pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {
60 : .{ .memory = true });77 : .{ .memory = true });
61}78}
6279
63pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {80pub fn syscall4(
64 var buf: [2]u32 = .{ @intFromEnum(number), undefined };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 };
65 return asm volatile (88 return asm volatile (
66 \\ str r7, [%[tmp], #4]89 \\ str r7, [%[tmp], #4]
67 \\ ldr r7, [%[tmp]]90 \\ ldr r7, [%[tmp]]
...@@ -76,8 +99,15 @@ pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {...@@ -76,8 +99,15 @@ pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {
76 : .{ .memory = true });99 : .{ .memory = true });
77}100}
78101
79pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u32) u32 {102pub fn syscall5(
80 var buf: [2]u32 = .{ @intFromEnum(number), undefined };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 };
81 return asm volatile (111 return asm volatile (
82 \\ str r7, [%[tmp], #4]112 \\ str r7, [%[tmp], #4]
83 \\ ldr r7, [%[tmp]]113 \\ ldr r7, [%[tmp]]
...@@ -95,14 +125,14 @@ pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u...@@ -95,14 +125,14 @@ pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u
95125
96pub fn syscall6(126pub fn syscall6(
97 number: SYS,127 number: SYS,
98 arg1: u32,128 arg1: syscall_arg_t,
99 arg2: u32,129 arg2: syscall_arg_t,
100 arg3: u32,130 arg3: syscall_arg_t,
101 arg4: u32,131 arg4: syscall_arg_t,
102 arg5: u32,132 arg5: syscall_arg_t,
103 arg6: u32,133 arg6: syscall_arg_t,
104) u32 {134) u32 {
105 var buf: [2]u32 = .{ @intFromEnum(number), undefined };135 var buf: [2]syscall_arg_t = .{ @intFromEnum(number), undefined };
106 return asm volatile (136 return asm volatile (
107 \\ str r7, [%[tmp], #4]137 \\ str r7, [%[tmp], #4]
108 \\ ldr r7, [%[tmp]]138 \\ ldr r7, [%[tmp]]
...@@ -119,22 +149,8 @@ pub fn syscall6(...@@ -119,22 +149,8 @@ pub fn syscall6(
119 : .{ .memory = true });149 : .{ .memory = true });
120}150}
121151
122pub const clone = @import("arm.zig").clone;152pub const clone = arm.clone;
123153
124pub fn restore() callconv(.naked) noreturn {154pub const restore = arm.restore;
125 asm volatile (
126 \\ mov r7, %[number]
127 \\ svc #0
128 :
129 : [number] "I" (@intFromEnum(SYS.sigreturn)),
130 );
131}
132155
133pub fn restore_rt() callconv(.naked) noreturn {156pub const restore_rt = arm.restore_rt;
134 asm volatile (
135 \\ mov r7, %[number]
136 \\ svc #0
137 :
138 : [number] "I" (@intFromEnum(SYS.rt_sigreturn)),
139 );
140}
lib/std/os/linux/x32.zig+41-12
...@@ -2,14 +2,21 @@ const builtin = @import("builtin");...@@ -2,14 +2,21 @@ const builtin = @import("builtin");
2const std = @import("../../std.zig");2const std = @import("../../std.zig");
3const SYS = std.os.linux.SYS;3const 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 {
6 return asm volatile ("syscall"10 return asm volatile ("syscall"
7 : [ret] "={rax}" (-> u32),11 : [ret] "={rax}" (-> u32),
8 : [number] "{rax}" (@intFromEnum(number)),12 : [number] "{rax}" (@intFromEnum(number)),
9 : .{ .rcx = true, .r11 = true, .memory = true });13 : .{ .rcx = true, .r11 = true, .memory = true });
10}14}
1115
12pub fn syscall1(number: SYS, arg1: u32) u32 {16pub fn syscall1(
17 number: SYS,
18 arg1: syscall_arg_t,
19) u32 {
13 return asm volatile ("syscall"20 return asm volatile ("syscall"
14 : [ret] "={rax}" (-> u32),21 : [ret] "={rax}" (-> u32),
15 : [number] "{rax}" (@intFromEnum(number)),22 : [number] "{rax}" (@intFromEnum(number)),
...@@ -17,7 +24,11 @@ pub fn syscall1(number: SYS, arg1: u32) u32 {...@@ -17,7 +24,11 @@ pub fn syscall1(number: SYS, arg1: u32) u32 {
17 : .{ .rcx = true, .r11 = true, .memory = true });24 : .{ .rcx = true, .r11 = true, .memory = true });
18}25}
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 {
21 return asm volatile ("syscall"32 return asm volatile ("syscall"
22 : [ret] "={rax}" (-> u32),33 : [ret] "={rax}" (-> u32),
23 : [number] "{rax}" (@intFromEnum(number)),34 : [number] "{rax}" (@intFromEnum(number)),
...@@ -26,7 +37,12 @@ pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {...@@ -26,7 +37,12 @@ pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {
26 : .{ .rcx = true, .r11 = true, .memory = true });37 : .{ .rcx = true, .r11 = true, .memory = true });
27}38}
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 {
30 return asm volatile ("syscall"46 return asm volatile ("syscall"
31 : [ret] "={rax}" (-> u32),47 : [ret] "={rax}" (-> u32),
32 : [number] "{rax}" (@intFromEnum(number)),48 : [number] "{rax}" (@intFromEnum(number)),
...@@ -36,7 +52,13 @@ pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {...@@ -36,7 +52,13 @@ pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {
36 : .{ .rcx = true, .r11 = true, .memory = true });52 : .{ .rcx = true, .r11 = true, .memory = true });
37}53}
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 {
40 return asm volatile ("syscall"62 return asm volatile ("syscall"
41 : [ret] "={rax}" (-> u32),63 : [ret] "={rax}" (-> u32),
42 : [number] "{rax}" (@intFromEnum(number)),64 : [number] "{rax}" (@intFromEnum(number)),
...@@ -47,7 +69,14 @@ pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {...@@ -47,7 +69,14 @@ pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {
47 : .{ .rcx = true, .r11 = true, .memory = true });69 : .{ .rcx = true, .r11 = true, .memory = true });
48}70}
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 {
51 return asm volatile ("syscall"80 return asm volatile ("syscall"
52 : [ret] "={rax}" (-> u32),81 : [ret] "={rax}" (-> u32),
53 : [number] "{rax}" (@intFromEnum(number)),82 : [number] "{rax}" (@intFromEnum(number)),
...@@ -61,12 +90,12 @@ pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u...@@ -61,12 +90,12 @@ pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u
6190
62pub fn syscall6(91pub fn syscall6(
63 number: SYS,92 number: SYS,
64 arg1: u32,93 arg1: syscall_arg_t,
65 arg2: u32,94 arg2: syscall_arg_t,
66 arg3: u32,95 arg3: syscall_arg_t,
67 arg4: u32,96 arg4: syscall_arg_t,
68 arg5: u32,97 arg5: syscall_arg_t,
69 arg6: u32,98 arg6: syscall_arg_t,
70) u32 {99) u32 {
71 return asm volatile ("syscall"100 return asm volatile ("syscall"
72 : [ret] "={rax}" (-> u32),101 : [ret] "={rax}" (-> u32),
lib/std/os/linux/x86.zig+42-13
...@@ -2,14 +2,21 @@ const builtin = @import("builtin");...@@ -2,14 +2,21 @@ const builtin = @import("builtin");
2const std = @import("../../std.zig");2const std = @import("../../std.zig");
3const SYS = std.os.linux.SYS;3const 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 {
6 return asm volatile ("int $0x80"10 return asm volatile ("int $0x80"
7 : [ret] "={eax}" (-> u32),11 : [ret] "={eax}" (-> u32),
8 : [number] "{eax}" (@intFromEnum(number)),12 : [number] "{eax}" (@intFromEnum(number)),
9 : .{ .memory = true });13 : .{ .memory = true });
10}14}
1115
12pub fn syscall1(number: SYS, arg1: u32) u32 {16pub fn syscall1(
17 number: SYS,
18 arg1: syscall_arg_t,
19) u32 {
13 return asm volatile ("int $0x80"20 return asm volatile ("int $0x80"
14 : [ret] "={eax}" (-> u32),21 : [ret] "={eax}" (-> u32),
15 : [number] "{eax}" (@intFromEnum(number)),22 : [number] "{eax}" (@intFromEnum(number)),
...@@ -17,7 +24,11 @@ pub fn syscall1(number: SYS, arg1: u32) u32 {...@@ -17,7 +24,11 @@ pub fn syscall1(number: SYS, arg1: u32) u32 {
17 : .{ .memory = true });24 : .{ .memory = true });
18}25}
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 {
21 return asm volatile ("int $0x80"32 return asm volatile ("int $0x80"
22 : [ret] "={eax}" (-> u32),33 : [ret] "={eax}" (-> u32),
23 : [number] "{eax}" (@intFromEnum(number)),34 : [number] "{eax}" (@intFromEnum(number)),
...@@ -26,7 +37,12 @@ pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {...@@ -26,7 +37,12 @@ pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {
26 : .{ .memory = true });37 : .{ .memory = true });
27}38}
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 {
30 return asm volatile ("int $0x80"46 return asm volatile ("int $0x80"
31 : [ret] "={eax}" (-> u32),47 : [ret] "={eax}" (-> u32),
32 : [number] "{eax}" (@intFromEnum(number)),48 : [number] "{eax}" (@intFromEnum(number)),
...@@ -36,7 +52,13 @@ pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {...@@ -36,7 +52,13 @@ pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {
36 : .{ .memory = true });52 : .{ .memory = true });
37}53}
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 {
40 return asm volatile ("int $0x80"62 return asm volatile ("int $0x80"
41 : [ret] "={eax}" (-> u32),63 : [ret] "={eax}" (-> u32),
42 : [number] "{eax}" (@intFromEnum(number)),64 : [number] "{eax}" (@intFromEnum(number)),
...@@ -47,7 +69,14 @@ pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {...@@ -47,7 +69,14 @@ pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {
47 : .{ .memory = true });69 : .{ .memory = true });
48}70}
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 {
51 return asm volatile ("int $0x80"80 return asm volatile ("int $0x80"
52 : [ret] "={eax}" (-> u32),81 : [ret] "={eax}" (-> u32),
53 : [number] "{eax}" (@intFromEnum(number)),82 : [number] "{eax}" (@intFromEnum(number)),
...@@ -61,12 +90,12 @@ pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u...@@ -61,12 +90,12 @@ pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u
6190
62pub fn syscall6(91pub fn syscall6(
63 number: SYS,92 number: SYS,
64 arg1: u32,93 arg1: syscall_arg_t,
65 arg2: u32,94 arg2: syscall_arg_t,
66 arg3: u32,95 arg3: syscall_arg_t,
67 arg4: u32,96 arg4: syscall_arg_t,
68 arg5: u32,97 arg5: syscall_arg_t,
69 arg6: u32,98 arg6: syscall_arg_t,
70) u32 {99) u32 {
71 // arg6 can't be passed to asm in a register because ebp might be reserved as the frame pointer100 // arg6 can't be passed to asm in a register because ebp might be reserved as the frame pointer
72 // and there are no more GPRs available; so we'll need a memory operand for it. Adding that101 // 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(...@@ -74,7 +103,7 @@ pub fn syscall6(
74 // *its* own GPR, so we need to pass another arg in memory too! This is surprisingly hard to get103 // *its* own GPR, so we need to pass another arg in memory too! This is surprisingly hard to get
75 // right, because we can't touch esp or ebp until we're done with the memory input (as that104 // right, because we can't touch esp or ebp until we're done with the memory input (as that
76 // input could be relative to esp or ebp).105 // input could be relative to esp or ebp).
77 const args56: [2]u32 = .{ arg5, arg6 };106 const args56: [2]syscall_arg_t = .{ arg5, arg6 };
78 return asm volatile (107 return asm volatile (
79 \\ push %[args56]108 \\ push %[args56]
80 \\ push %%ebp109 \\ push %%ebp
lib/std/os/linux/x86_64.zig+41-12
...@@ -2,14 +2,21 @@ const builtin = @import("builtin");...@@ -2,14 +2,21 @@ const builtin = @import("builtin");
2const std = @import("../../std.zig");2const std = @import("../../std.zig");
3const SYS = std.os.linux.SYS;3const 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 {
6 return asm volatile ("syscall"10 return asm volatile ("syscall"
7 : [ret] "={rax}" (-> u64),11 : [ret] "={rax}" (-> u64),
8 : [number] "{rax}" (@intFromEnum(number)),12 : [number] "{rax}" (@intFromEnum(number)),
9 : .{ .rcx = true, .r11 = true, .memory = true });13 : .{ .rcx = true, .r11 = true, .memory = true });
10}14}
1115
12pub fn syscall1(number: SYS, arg1: u64) u64 {16pub fn syscall1(
17 number: SYS,
18 arg1: syscall_arg_t,
19) u64 {
13 return asm volatile ("syscall"20 return asm volatile ("syscall"
14 : [ret] "={rax}" (-> u64),21 : [ret] "={rax}" (-> u64),
15 : [number] "{rax}" (@intFromEnum(number)),22 : [number] "{rax}" (@intFromEnum(number)),
...@@ -17,7 +24,11 @@ pub fn syscall1(number: SYS, arg1: u64) u64 {...@@ -17,7 +24,11 @@ pub fn syscall1(number: SYS, arg1: u64) u64 {
17 : .{ .rcx = true, .r11 = true, .memory = true });24 : .{ .rcx = true, .r11 = true, .memory = true });
18}25}
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 {
21 return asm volatile ("syscall"32 return asm volatile ("syscall"
22 : [ret] "={rax}" (-> u64),33 : [ret] "={rax}" (-> u64),
23 : [number] "{rax}" (@intFromEnum(number)),34 : [number] "{rax}" (@intFromEnum(number)),
...@@ -26,7 +37,12 @@ pub fn syscall2(number: SYS, arg1: u64, arg2: u64) u64 {...@@ -26,7 +37,12 @@ pub fn syscall2(number: SYS, arg1: u64, arg2: u64) u64 {
26 : .{ .rcx = true, .r11 = true, .memory = true });37 : .{ .rcx = true, .r11 = true, .memory = true });
27}38}
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 {
30 return asm volatile ("syscall"46 return asm volatile ("syscall"
31 : [ret] "={rax}" (-> u64),47 : [ret] "={rax}" (-> u64),
32 : [number] "{rax}" (@intFromEnum(number)),48 : [number] "{rax}" (@intFromEnum(number)),
...@@ -36,7 +52,13 @@ pub fn syscall3(number: SYS, arg1: u64, arg2: u64, arg3: u64) u64 {...@@ -36,7 +52,13 @@ pub fn syscall3(number: SYS, arg1: u64, arg2: u64, arg3: u64) u64 {
36 : .{ .rcx = true, .r11 = true, .memory = true });52 : .{ .rcx = true, .r11 = true, .memory = true });
37}53}
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 {
40 return asm volatile ("syscall"62 return asm volatile ("syscall"
41 : [ret] "={rax}" (-> u64),63 : [ret] "={rax}" (-> u64),
42 : [number] "{rax}" (@intFromEnum(number)),64 : [number] "{rax}" (@intFromEnum(number)),
...@@ -47,7 +69,14 @@ pub fn syscall4(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64) u64 {...@@ -47,7 +69,14 @@ pub fn syscall4(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64) u64 {
47 : .{ .rcx = true, .r11 = true, .memory = true });69 : .{ .rcx = true, .r11 = true, .memory = true });
48}70}
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 {
51 return asm volatile ("syscall"80 return asm volatile ("syscall"
52 : [ret] "={rax}" (-> u64),81 : [ret] "={rax}" (-> u64),
53 : [number] "{rax}" (@intFromEnum(number)),82 : [number] "{rax}" (@intFromEnum(number)),
...@@ -61,12 +90,12 @@ pub fn syscall5(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64, arg5: u...@@ -61,12 +90,12 @@ pub fn syscall5(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64, arg5: u
6190
62pub fn syscall6(91pub fn syscall6(
63 number: SYS,92 number: SYS,
64 arg1: u64,93 arg1: syscall_arg_t,
65 arg2: u64,94 arg2: syscall_arg_t,
66 arg3: u64,95 arg3: syscall_arg_t,
67 arg4: u64,96 arg4: syscall_arg_t,
68 arg5: u64,97 arg5: syscall_arg_t,
69 arg6: u64,98 arg6: syscall_arg_t,
70) u64 {99) u64 {
71 return asm volatile ("syscall"100 return asm volatile ("syscall"
72 : [ret] "={rax}" (-> u64),101 : [ret] "={rax}" (-> u64),