authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-04-16 16:08:04+02:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-04-16 16:08:04+02:00
logcfa0ada9e191237340a8293d89b92c8e59fc01c3
tree1ca11347e4b9025466314c774956428b691006b9
parentd0226ac301140cb552dfc3da24cea7693d29c64f
parent6315c1a19061c4efaa45b32f54aef0994e48c3b8

Merge pull request '`std.os.linux`: fix syscall argument width for mipsn32 and x32' (#31894) from alexrp/zig:mipsn32-x32-fixes into master

Reviewed-on: https://codeberg.org/ziglang/zig/pulls/31894

25 files changed, 1404 insertions(+), 844 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/libc/musl/arch/mipsn32/syscall_arch.h+35-32
...@@ -1,6 +1,9 @@...@@ -1,6 +1,9 @@
1#define __SYSCALL_LL_E(x) (x)1#define __SYSCALL_LL_E(x) (x)
2#define __SYSCALL_LL_O(x) (x)2#define __SYSCALL_LL_O(x) (x)
33
4#define __scc(X) sizeof(1?(X):0ULL) < 8 ? (unsigned long) (X) : (long long) (X)
5typedef long long syscall_arg_t;
6
4#define SYSCALL_RLIM_INFINITY (-1UL/2)7#define SYSCALL_RLIM_INFINITY (-1UL/2)
58
6#if __mips_isa_rev >= 69#if __mips_isa_rev >= 6
...@@ -13,9 +16,9 @@...@@ -13,9 +16,9 @@
13 "$14", "$15", "$24", "$25", "hi", "lo", "memory"16 "$14", "$15", "$24", "$25", "hi", "lo", "memory"
14#endif17#endif
1518
16static inline long __syscall0(long n)19static inline long __syscall0(long long n)
17{20{
18 register long r7 __asm__("$7");21 register long long r7 __asm__("$7");
19 register long r2 __asm__("$2");22 register long r2 __asm__("$2");
20 __asm__ __volatile__ (23 __asm__ __volatile__ (
21 "daddu $2,$0,%2 ; syscall"24 "daddu $2,$0,%2 ; syscall"
...@@ -25,10 +28,10 @@ static inline long __syscall0(long n)...@@ -25,10 +28,10 @@ static inline long __syscall0(long n)
25 return r7 && r2>0 ? -r2 : r2;28 return r7 && r2>0 ? -r2 : r2;
26}29}
2730
28static inline long __syscall1(long n, long a)31static inline long __syscall1(long long n, long long a)
29{32{
30 register long r4 __asm__("$4") = a;33 register long long r4 __asm__("$4") = a;
31 register long r7 __asm__("$7");34 register long long r7 __asm__("$7");
32 register long r2 __asm__("$2");35 register long r2 __asm__("$2");
33 __asm__ __volatile__ (36 __asm__ __volatile__ (
34 "daddu $2,$0,%2 ; syscall"37 "daddu $2,$0,%2 ; syscall"
...@@ -38,11 +41,11 @@ static inline long __syscall1(long n, long a)...@@ -38,11 +41,11 @@ static inline long __syscall1(long n, long a)
38 return r7 && r2>0 ? -r2 : r2;41 return r7 && r2>0 ? -r2 : r2;
39}42}
4043
41static inline long __syscall2(long n, long a, long b)44static inline long __syscall2(long long n, long long a, long long b)
42{45{
43 register long r4 __asm__("$4") = a;46 register long long r4 __asm__("$4") = a;
44 register long r5 __asm__("$5") = b;47 register long long r5 __asm__("$5") = b;
45 register long r7 __asm__("$7");48 register long long r7 __asm__("$7");
46 register long r2 __asm__("$2");49 register long r2 __asm__("$2");
4750
48 __asm__ __volatile__ (51 __asm__ __volatile__ (
...@@ -53,12 +56,12 @@ static inline long __syscall2(long n, long a, long b)...@@ -53,12 +56,12 @@ static inline long __syscall2(long n, long a, long b)
53 return r7 && r2>0 ? -r2 : r2;56 return r7 && r2>0 ? -r2 : r2;
54}57}
5558
56static inline long __syscall3(long n, long a, long b, long c)59static inline long __syscall3(long long n, long long a, long long b, long long c)
57{60{
58 register long r4 __asm__("$4") = a;61 register long long r4 __asm__("$4") = a;
59 register long r5 __asm__("$5") = b;62 register long long r5 __asm__("$5") = b;
60 register long r6 __asm__("$6") = c;63 register long long r6 __asm__("$6") = c;
61 register long r7 __asm__("$7");64 register long long r7 __asm__("$7");
62 register long r2 __asm__("$2");65 register long r2 __asm__("$2");
6366
64 __asm__ __volatile__ (67 __asm__ __volatile__ (
...@@ -69,12 +72,12 @@ static inline long __syscall3(long n, long a, long b, long c)...@@ -69,12 +72,12 @@ static inline long __syscall3(long n, long a, long b, long c)
69 return r7 && r2>0 ? -r2 : r2;72 return r7 && r2>0 ? -r2 : r2;
70}73}
7174
72static inline long __syscall4(long n, long a, long b, long c, long d)75static inline long __syscall4(long long n, long long a, long long b, long long c, long long d)
73{76{
74 register long r4 __asm__("$4") = a;77 register long long r4 __asm__("$4") = a;
75 register long r5 __asm__("$5") = b;78 register long long r5 __asm__("$5") = b;
76 register long r6 __asm__("$6") = c;79 register long long r6 __asm__("$6") = c;
77 register long r7 __asm__("$7") = d;80 register long long r7 __asm__("$7") = d;
78 register long r2 __asm__("$2");81 register long r2 __asm__("$2");
7982
80 __asm__ __volatile__ (83 __asm__ __volatile__ (
...@@ -85,13 +88,13 @@ static inline long __syscall4(long n, long a, long b, long c, long d)...@@ -85,13 +88,13 @@ static inline long __syscall4(long n, long a, long b, long c, long d)
85 return r7 && r2>0 ? -r2 : r2;88 return r7 && r2>0 ? -r2 : r2;
86}89}
8790
88static inline long __syscall5(long n, long a, long b, long c, long d, long e)91static inline long __syscall5(long long n, long long a, long long b, long long c, long long d, long long e)
89{92{
90 register long r4 __asm__("$4") = a;93 register long long r4 __asm__("$4") = a;
91 register long r5 __asm__("$5") = b;94 register long long r5 __asm__("$5") = b;
92 register long r6 __asm__("$6") = c;95 register long long r6 __asm__("$6") = c;
93 register long r7 __asm__("$7") = d;96 register long long r7 __asm__("$7") = d;
94 register long r8 __asm__("$8") = e;97 register long long r8 __asm__("$8") = e;
95 register long r2 __asm__("$2");98 register long r2 __asm__("$2");
9699
97 __asm__ __volatile__ (100 __asm__ __volatile__ (
...@@ -102,14 +105,14 @@ static inline long __syscall5(long n, long a, long b, long c, long d, long e)...@@ -102,14 +105,14 @@ static inline long __syscall5(long n, long a, long b, long c, long d, long e)
102 return r7 && r2>0 ? -r2 : r2;105 return r7 && r2>0 ? -r2 : r2;
103}106}
104107
105static inline long __syscall6(long n, long a, long b, long c, long d, long e, long f)108static inline long __syscall6(long long n, long long a, long long b, long long c, long long d, long long e, long long f)
106{109{
107 register long r4 __asm__("$4") = a;110 register long long r4 __asm__("$4") = a;
108 register long r5 __asm__("$5") = b;111 register long long r5 __asm__("$5") = b;
109 register long r6 __asm__("$6") = c;112 register long long r6 __asm__("$6") = c;
110 register long r7 __asm__("$7") = d;113 register long long r7 __asm__("$7") = d;
111 register long r8 __asm__("$8") = e;114 register long long r8 __asm__("$8") = e;
112 register long r9 __asm__("$9") = f;115 register long long r9 __asm__("$9") = f;
113 register long r2 __asm__("$2");116 register long r2 __asm__("$2");
114117
115 __asm__ __volatile__ (118 __asm__ __volatile__ (
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+386-432
...@@ -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");
...@@ -566,9 +574,11 @@ fn getauxvalImpl(index: usize) callconv(.c) usize {...@@ -566,9 +574,11 @@ fn getauxvalImpl(index: usize) callconv(.c) usize {
566// in a even-aligned register pair.574// in a even-aligned register pair.
567const require_aligned_register_pair =575const require_aligned_register_pair =
568 builtin.cpu.arch.isArm() or576 builtin.cpu.arch.isArm() or
577 builtin.cpu.arch == .csky or
569 builtin.cpu.arch == .hexagon or578 builtin.cpu.arch == .hexagon or
570 builtin.cpu.arch.isMIPS32() or579 builtin.cpu.arch.isMIPS32() or
571 builtin.cpu.arch.isPowerPC32();580 builtin.cpu.arch.isPowerPC32() or
581 builtin.cpu.arch.isXtensa();
572582
573// Split a 64bit value into a {LSB,MSB} pair.583// Split a 64bit value into a {LSB,MSB} pair.
574// The LE/BE variants specify the endianness to assume.584// The LE/BE variants specify the endianness to assume.
...@@ -611,13 +621,13 @@ pub fn brk(addr: usize) usize {...@@ -611,13 +621,13 @@ pub fn brk(addr: usize) usize {
611 return syscall1(.brk, addr);621 return syscall1(.brk, addr);
612}622}
613623
614pub fn dup(old: i32) usize {624pub fn dup(old: fd_t) usize {
615 return syscall1(.dup, @as(usize, @bitCast(@as(isize, old))));625 return syscall1(.dup, @as(u32, @bitCast(old)));
616}626}
617627
618pub fn dup2(old: i32, new: i32) usize {628pub fn dup2(old: fd_t, new: fd_t) usize {
619 if (@hasField(SYS, "dup2")) {629 if (@hasField(SYS, "dup2")) {
620 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)));
621 } else {631 } else {
622 if (old == new) {632 if (old == new) {
623 if (std.debug.runtime_safety) {633 if (std.debug.runtime_safety) {
...@@ -626,13 +636,13 @@ pub fn dup2(old: i32, new: i32) usize {...@@ -626,13 +636,13 @@ pub fn dup2(old: i32, new: i32) usize {
626 }636 }
627 return @as(usize, @intCast(old));637 return @as(usize, @intCast(old));
628 } else {638 } else {
629 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);
630 }640 }
631 }641 }
632}642}
633643
634pub fn dup3(old: i32, new: i32, flags: u32) usize {644pub fn dup3(old: fd_t, new: fd_t, flags: u32) usize {
635 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);
636}646}
637647
638pub fn chdir(path: [*:0]const u8) usize {648pub fn chdir(path: [*:0]const u8) usize {
...@@ -640,7 +650,7 @@ pub fn chdir(path: [*:0]const u8) usize {...@@ -640,7 +650,7 @@ pub fn chdir(path: [*:0]const u8) usize {
640}650}
641651
642pub fn fchdir(fd: fd_t) usize {652pub fn fchdir(fd: fd_t) usize {
643 return syscall1(.fchdir, @as(usize, @bitCast(@as(isize, fd))));653 return syscall1(.fchdir, @as(u32, @bitCast(fd)));
644}654}
645655
646pub fn chroot(path: [*:0]const u8) usize {656pub fn chroot(path: [*:0]const u8) usize {
...@@ -662,7 +672,7 @@ pub const EXECVEAT = packed struct(u32) {...@@ -662,7 +672,7 @@ pub const EXECVEAT = packed struct(u32) {
662};672};
663673
664pub 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 {
665 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)));
666}676}
667677
668pub fn fork() usize {678pub fn fork() usize {
...@@ -675,37 +685,28 @@ pub fn fork() usize {...@@ -675,37 +685,28 @@ pub fn fork() usize {
675 }685 }
676}686}
677687
678/// This must be inline, and inline call the syscall function, because if the688pub fn futimens(fd: fd_t, times: ?*const [2]timespec) usize {
679/// child does a return it will clobber the parent's stack.
680/// It is advised to avoid this function and use clone instead, because
681/// the compiler is not aware of how vfork affects control flow and you may
682/// see different results in optimized builds.
683pub inline fn vfork() usize {
684 return @call(.always_inline, syscall0, .{.vfork});
685}
686
687pub fn futimens(fd: i32, times: ?*const [2]timespec) usize {
688 return utimensat(fd, null, times, 0);689 return utimensat(fd, null, times, 0);
689}690}
690691
691pub fn utimensat(dirfd: i32, path: ?[*:0]const u8, times: ?*const [2]timespec, flags: u32) usize {692pub fn utimensat(dirfd: fd_t, path: ?[*:0]const u8, times: ?*const [2]timespec, flags: u32) usize {
692 return syscall4(693 return syscall4(
693 if (@hasField(SYS, "utimensat") and native_arch != .hexagon) .utimensat else .utimensat_time64,694 if (@hasField(SYS, "utimensat") and native_arch != .hexagon) .utimensat else .utimensat_time64,
694 @as(usize, @bitCast(@as(isize, dirfd))),695 @as(u32, @bitCast(dirfd)),
695 @intFromPtr(path),696 @intFromPtr(path),
696 @intFromPtr(times),697 @intFromPtr(times),
697 flags,698 flags,
698 );699 );
699}700}
700701
701pub fn fallocate(fd: i32, mode: i32, offset: i64, length: i64) usize {702pub fn fallocate(fd: fd_t, mode: mode_t, offset: off_t, length: off_t) usize {
702 if (usize_bits < 64) {703 if (@sizeOf(syscall_arg_t) < @sizeOf(u64)) {
703 const offset_halves = splitValue64(offset);704 const offset_halves = splitValue64(offset);
704 const length_halves = splitValue64(length);705 const length_halves = splitValue64(length);
705 return syscall6(706 return syscall6(
706 .fallocate,707 .fallocate,
707 @as(usize, @bitCast(@as(isize, fd))),708 @as(u32, @bitCast(fd)),
708 @as(usize, @bitCast(@as(isize, mode))),709 mode,
709 offset_halves[0],710 offset_halves[0],
710 offset_halves[1],711 offset_halves[1],
711 length_halves[0],712 length_halves[0],
...@@ -714,8 +715,8 @@ pub fn fallocate(fd: i32, mode: i32, offset: i64, length: i64) usize {...@@ -714,8 +715,8 @@ pub fn fallocate(fd: i32, mode: i32, offset: i64, length: i64) usize {
714 } else {715 } else {
715 return syscall4(716 return syscall4(
716 .fallocate,717 .fallocate,
717 @as(usize, @bitCast(@as(isize, fd))),718 @as(u32, @bitCast(fd)),
718 @as(usize, @bitCast(@as(isize, mode))),719 mode,
719 @as(u64, @bitCast(offset)),720 @as(u64, @bitCast(offset)),
720 @as(u64, @bitCast(length)),721 @as(u64, @bitCast(length)),
721 );722 );
...@@ -886,19 +887,19 @@ pub fn getcwd(buf: [*]u8, size: usize) usize {...@@ -886,19 +887,19 @@ pub fn getcwd(buf: [*]u8, size: usize) usize {
886 return syscall2(.getcwd, @intFromPtr(buf), size);887 return syscall2(.getcwd, @intFromPtr(buf), size);
887}888}
888889
889pub fn getdents(fd: i32, dirp: [*]u8, len: usize) usize {890pub fn getdents(fd: fd_t, dirp: [*]u8, len: usize) usize {
890 return syscall3(891 return syscall3(
891 .getdents,892 .getdents,
892 @as(usize, @bitCast(@as(isize, fd))),893 @as(u32, @bitCast(fd)),
893 @intFromPtr(dirp),894 @intFromPtr(dirp),
894 @min(len, maxInt(c_int)),895 @min(len, maxInt(c_int)),
895 );896 );
896}897}
897898
898pub fn getdents64(fd: i32, dirp: [*]u8, len: usize) usize {899pub fn getdents64(fd: fd_t, dirp: [*]u8, len: usize) usize {
899 return syscall3(900 return syscall3(
900 .getdents64,901 .getdents64,
901 @as(usize, @bitCast(@as(isize, fd))),902 @as(u32, @bitCast(fd)),
902 @intFromPtr(dirp),903 @intFromPtr(dirp),
903 @min(len, maxInt(c_int)),904 @min(len, maxInt(c_int)),
904 );905 );
...@@ -908,12 +909,12 @@ pub fn inotify_init1(flags: u32) usize {...@@ -908,12 +909,12 @@ pub fn inotify_init1(flags: u32) usize {
908 return syscall1(.inotify_init1, flags);909 return syscall1(.inotify_init1, flags);
909}910}
910911
911pub fn inotify_add_watch(fd: i32, pathname: [*:0]const u8, mask: u32) usize {912pub fn inotify_add_watch(fd: fd_t, pathname: [*:0]const u8, mask: u32) usize {
912 return syscall3(.inotify_add_watch, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(pathname), mask);913 return syscall3(.inotify_add_watch, @as(u32, @bitCast(fd)), @intFromPtr(pathname), mask);
913}914}
914915
915pub fn inotify_rm_watch(fd: i32, wd: i32) usize {916pub fn inotify_rm_watch(fd: fd_t, wd: fd_t) usize {
916 return syscall2(.inotify_rm_watch, @as(usize, @bitCast(@as(isize, fd))), @as(usize, @bitCast(@as(isize, wd))));917 return syscall2(.inotify_rm_watch, @as(u32, @bitCast(fd)), @as(u32, @bitCast(wd)));
917}918}
918919
919pub fn fanotify_init(flags: fanotify.InitFlags, event_f_flags: u32) usize {920pub fn fanotify_init(flags: fanotify.InitFlags, event_f_flags: u32) usize {
...@@ -927,24 +928,24 @@ pub fn fanotify_mark(...@@ -927,24 +928,24 @@ pub fn fanotify_mark(
927 dirfd: fd_t,928 dirfd: fd_t,
928 pathname: ?[*:0]const u8,929 pathname: ?[*:0]const u8,
929) usize {930) usize {
930 if (usize_bits < 64) {931 if (@sizeOf(syscall_arg_t) < @sizeOf(u64)) {
931 const mask_halves = splitValue64(@bitCast(mask));932 const mask_halves = splitValue64(@bitCast(mask));
932 return syscall6(933 return syscall6(
933 .fanotify_mark,934 .fanotify_mark,
934 @bitCast(@as(isize, fd)),935 @as(u32, @bitCast(fd)),
935 @as(u32, @bitCast(flags)),936 @as(u32, @bitCast(flags)),
936 mask_halves[0],937 mask_halves[0],
937 mask_halves[1],938 mask_halves[1],
938 @bitCast(@as(isize, dirfd)),939 @as(u32, @bitCast(dirfd)),
939 @intFromPtr(pathname),940 @intFromPtr(pathname),
940 );941 );
941 } else {942 } else {
942 return syscall5(943 return syscall5(
943 .fanotify_mark,944 .fanotify_mark,
944 @bitCast(@as(isize, fd)),945 @as(u32, @bitCast(fd)),
945 @as(u32, @bitCast(flags)),946 @as(u32, @bitCast(flags)),
946 @bitCast(mask),947 @as(u64, @bitCast(mask)),
947 @bitCast(@as(isize, dirfd)),948 @as(u32, @bitCast(dirfd)),
948 @intFromPtr(pathname),949 @intFromPtr(pathname),
949 );950 );
950 }951 }
...@@ -953,7 +954,7 @@ pub fn fanotify_mark(...@@ -953,7 +954,7 @@ pub fn fanotify_mark(
953pub fn name_to_handle_at(954pub fn name_to_handle_at(
954 dirfd: fd_t,955 dirfd: fd_t,
955 pathname: [*:0]const u8,956 pathname: [*:0]const u8,
956 handle: *std.os.linux.file_handle,957 handle: *file_handle,
957 mount_id: *i32,958 mount_id: *i32,
958 flags: u32,959 flags: u32,
959) usize {960) usize {
...@@ -971,27 +972,27 @@ pub fn readlink(noalias path: [*:0]const u8, noalias buf_ptr: [*]u8, buf_len: us...@@ -971,27 +972,27 @@ pub fn readlink(noalias path: [*:0]const u8, noalias buf_ptr: [*]u8, buf_len: us
971 if (@hasField(SYS, "readlink")) {972 if (@hasField(SYS, "readlink")) {
972 return syscall3(.readlink, @intFromPtr(path), @intFromPtr(buf_ptr), buf_len);973 return syscall3(.readlink, @intFromPtr(path), @intFromPtr(buf_ptr), buf_len);
973 } else {974 } else {
974 return syscall4(.readlinkat, @as(usize, @bitCast(@as(isize, AT.FDCWD))), @intFromPtr(path), @intFromPtr(buf_ptr), buf_len);975 return syscall4(.readlinkat, @as(u32, @bitCast(@as(i32, AT.FDCWD))), @intFromPtr(path), @intFromPtr(buf_ptr), buf_len);
975 }976 }
976}977}
977978
978pub fn readlinkat(dirfd: i32, noalias path: [*:0]const u8, noalias buf_ptr: [*]u8, buf_len: usize) usize {979pub fn readlinkat(dirfd: fd_t, noalias path: [*:0]const u8, noalias buf_ptr: [*]u8, buf_len: usize) usize {
979 return syscall4(.readlinkat, @as(usize, @bitCast(@as(isize, dirfd))), @intFromPtr(path), @intFromPtr(buf_ptr), buf_len);980 return syscall4(.readlinkat, @as(u32, @bitCast(dirfd)), @intFromPtr(path), @intFromPtr(buf_ptr), buf_len);
980}981}
981982
982pub fn mkdir(path: [*:0]const u8, mode: mode_t) usize {983pub fn mkdir(path: [*:0]const u8, mode: mode_t) usize {
983 if (@hasField(SYS, "mkdir")) {984 if (@hasField(SYS, "mkdir")) {
984 return syscall2(.mkdir, @intFromPtr(path), mode);985 return syscall2(.mkdir, @intFromPtr(path), mode);
985 } else {986 } else {
986 return syscall3(.mkdirat, @as(usize, @bitCast(@as(isize, AT.FDCWD))), @intFromPtr(path), mode);987 return syscall3(.mkdirat, @as(u32, @bitCast(@as(i32, AT.FDCWD))), @intFromPtr(path), mode);
987 }988 }
988}989}
989990
990pub fn mkdirat(dirfd: i32, path: [*:0]const u8, mode: mode_t) usize {991pub fn mkdirat(dirfd: fd_t, path: [*:0]const u8, mode: mode_t) usize {
991 return syscall3(.mkdirat, @as(usize, @bitCast(@as(isize, dirfd))), @intFromPtr(path), mode);992 return syscall3(.mkdirat, @as(u32, @bitCast(dirfd)), @intFromPtr(path), mode);
992}993}
993994
994pub fn mknod(path: [*:0]const u8, mode: u32, dev: u32) usize {995pub fn mknod(path: [*:0]const u8, mode: mode_t, dev: dev_t) usize {
995 if (@hasField(SYS, "mknod")) {996 if (@hasField(SYS, "mknod")) {
996 return syscall3(.mknod, @intFromPtr(path), mode, dev);997 return syscall3(.mknod, @intFromPtr(path), mode, dev);
997 } else {998 } else {
...@@ -999,8 +1000,8 @@ pub fn mknod(path: [*:0]const u8, mode: u32, dev: u32) usize {...@@ -999,8 +1000,8 @@ pub fn mknod(path: [*:0]const u8, mode: u32, dev: u32) usize {
999 }1000 }
1000}1001}
10011002
1002pub fn mknodat(dirfd: i32, path: [*:0]const u8, mode: u32, dev: u32) usize {1003pub fn mknodat(dirfd: dev_t, path: [*:0]const u8, mode: mode_t, dev: dev_t) usize {
1003 return syscall4(.mknodat, @as(usize, @bitCast(@as(isize, dirfd))), @intFromPtr(path), mode, dev);1004 return syscall4(.mknodat, @as(u32, @bitCast(dirfd)), @intFromPtr(path), mode, dev);
1004}1005}
10051006
1006pub fn mount(special: ?[*:0]const u8, dir: [*:0]const u8, fstype: ?[*:0]const u8, flags: u32, data: usize) usize {1007pub fn mount(special: ?[*:0]const u8, dir: [*:0]const u8, fstype: ?[*:0]const u8, flags: u32, data: usize) usize {
...@@ -1036,7 +1037,14 @@ pub const MOVE_MOUNT = packed struct(u32) {...@@ -1036,7 +1037,14 @@ pub const MOVE_MOUNT = packed struct(u32) {
1036};1037};
10371038
1038pub 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 {1039pub 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 {
1039 return syscall5(.move_mount, fd_to_usize(from_dirfd), @intFromPtr(from_path), fd_to_usize(to_dirfd), @intFromPtr(to_path), @as(u32, @bitCast(flags)));1040 return syscall5(
1041 .move_mount,
1042 @as(u32, @bitCast(from_dirfd)),
1043 @intFromPtr(from_path),
1044 @as(u32, @bitCast(to_dirfd)),
1045 @intFromPtr(to_path),
1046 @as(u32, @bitCast(flags)),
1047 );
1040}1048}
10411049
1042pub const MOUNT_ATTR = packed struct(u32) {1050pub const MOUNT_ATTR = packed struct(u32) {
...@@ -1068,7 +1076,7 @@ pub const MOUNT_ATTR = packed struct(u32) {...@@ -1068,7 +1076,7 @@ pub const MOUNT_ATTR = packed struct(u32) {
1068};1076};
10691077
1070pub fn mount_setattr(dirfd: fd_t, path: [*:0]const u8, flags: MOUNT_ATTR) usize {1078pub fn mount_setattr(dirfd: fd_t, path: [*:0]const u8, flags: MOUNT_ATTR) usize {
1071 return syscall3(.mount_setattr, fd_to_usize(dirfd), @intFromPtr(path), @as(u32, @bitCast(flags)));1079 return syscall3(.mount_setattr, @as(u32, @bitCast(dirfd)), @intFromPtr(path), @as(u32, @bitCast(flags)));
1072}1080}
10731081
1074pub const FSOPEN = packed struct(u32) {1082pub const FSOPEN = packed struct(u32) {
...@@ -1101,7 +1109,7 @@ pub const FSCONFIG_CMD = enum(u32) {...@@ -1101,7 +1109,7 @@ pub const FSCONFIG_CMD = enum(u32) {
1101};1109};
11021110
1103pub fn fsconfig(fd: fd_t, cmd: FSCONFIG_CMD, key: ?[*:0]const u8, value: ?[*:0]const u8, aux: u32) usize {1111pub fn fsconfig(fd: fd_t, cmd: FSCONFIG_CMD, key: ?[*:0]const u8, value: ?[*:0]const u8, aux: u32) usize {
1104 return syscall5(.fsconfig, fd_to_usize(fd), @intFromEnum(cmd), @intFromPtr(key), @intFromPtr(value), aux);1112 return syscall5(.fsconfig, @as(u32, @bitCast(fd)), @intFromEnum(cmd), @intFromPtr(key), @intFromPtr(value), aux);
1105}1113}
11061114
1107pub const FSMOUNT = packed struct(u32) {1115pub const FSMOUNT = packed struct(u32) {
...@@ -1111,7 +1119,7 @@ pub const FSMOUNT = packed struct(u32) {...@@ -1111,7 +1119,7 @@ pub const FSMOUNT = packed struct(u32) {
1111};1119};
11121120
1113pub fn fsmount(fsfd: fd_t, flags: FSMOUNT, attr_flags: MOUNT_ATTR) usize {1121pub fn fsmount(fsfd: fd_t, flags: FSMOUNT, attr_flags: MOUNT_ATTR) usize {
1114 return syscall3(.fsmount, fd_to_usize(fsfd), @as(u32, @bitCast(flags)), @as(u32, @bitCast(attr_flags)));1122 return syscall3(.fsmount, @as(u32, @bitCast(fsfd)), @as(u32, @bitCast(flags)), @as(u32, @bitCast(attr_flags)));
1115}1123}
11161124
1117pub const FSPICK = packed struct(u32) {1125pub const FSPICK = packed struct(u32) {
...@@ -1124,7 +1132,7 @@ pub const FSPICK = packed struct(u32) {...@@ -1124,7 +1132,7 @@ pub const FSPICK = packed struct(u32) {
1124};1132};
11251133
1126pub fn fspick(dirfd: fd_t, path: [*:0]const u8, flags: FSPICK) usize {1134pub fn fspick(dirfd: fd_t, path: [*:0]const u8, flags: FSPICK) usize {
1127 return syscall3(.fspick, fd_to_usize(dirfd), @intFromPtr(path), @as(u32, @bitCast(flags)));1135 return syscall3(.fspick, @as(u32, @bitCast(dirfd)), @intFromPtr(path), @as(u32, @bitCast(flags)));
1128}1136}
11291137
1130pub fn pivot_root(new_root: [*:0]const u8, put_old: [*:0]const u8) usize {1138pub fn pivot_root(new_root: [*:0]const u8, put_old: [*:0]const u8) usize {
...@@ -1139,7 +1147,7 @@ fn mmap2Unit() u64 {...@@ -1139,7 +1147,7 @@ fn mmap2Unit() u64 {
1139 };1147 };
1140}1148}
11411149
1142pub fn mmap(address: ?[*]u8, length: usize, prot: PROT, flags: MAP, fd: i32, offset: i64) usize {1150pub fn mmap(address: ?[*]u8, length: usize, prot: PROT, flags: MAP, fd: fd_t, offset: off_t) usize {
1143 if (@hasField(SYS, "mmap2")) {1151 if (@hasField(SYS, "mmap2")) {
1144 return syscall6(1152 return syscall6(
1145 .mmap2,1153 .mmap2,
...@@ -1147,7 +1155,7 @@ pub fn mmap(address: ?[*]u8, length: usize, prot: PROT, flags: MAP, fd: i32, off...@@ -1147,7 +1155,7 @@ pub fn mmap(address: ?[*]u8, length: usize, prot: PROT, flags: MAP, fd: i32, off
1147 length,1155 length,
1148 @as(u32, @bitCast(prot)),1156 @as(u32, @bitCast(prot)),
1149 @as(u32, @bitCast(flags)),1157 @as(u32, @bitCast(flags)),
1150 @bitCast(@as(isize, fd)),1158 @as(u32, @bitCast(fd)),
1151 @truncate(@as(u64, @bitCast(offset)) / mmap2Unit()),1159 @truncate(@as(u64, @bitCast(offset)) / mmap2Unit()),
1152 );1160 );
1153 } else {1161 } else {
...@@ -1160,7 +1168,7 @@ pub fn mmap(address: ?[*]u8, length: usize, prot: PROT, flags: MAP, fd: i32, off...@@ -1160,7 +1168,7 @@ pub fn mmap(address: ?[*]u8, length: usize, prot: PROT, flags: MAP, fd: i32, off
1160 length,1168 length,
1161 @as(u32, @bitCast(prot)),1169 @as(u32, @bitCast(prot)),
1162 @as(u32, @bitCast(flags)),1170 @as(u32, @bitCast(flags)),
1163 @bitCast(@as(isize, fd)),1171 @as(u32, @bitCast(fd)),
1164 @as(u64, @bitCast(offset)),1172 @as(u64, @bitCast(offset)),
1165 }),1173 }),
1166 ) else syscall6(1174 ) else syscall6(
...@@ -1169,7 +1177,7 @@ pub fn mmap(address: ?[*]u8, length: usize, prot: PROT, flags: MAP, fd: i32, off...@@ -1169,7 +1177,7 @@ pub fn mmap(address: ?[*]u8, length: usize, prot: PROT, flags: MAP, fd: i32, off
1169 length,1177 length,
1170 @as(u32, @bitCast(prot)),1178 @as(u32, @bitCast(prot)),
1171 @as(u32, @bitCast(flags)),1179 @as(u32, @bitCast(flags)),
1172 @bitCast(@as(isize, fd)),1180 @as(u32, @bitCast(fd)),
1173 @as(u64, @bitCast(offset)),1181 @as(u64, @bitCast(offset)),
1174 );1182 );
1175 }1183 }
...@@ -1276,70 +1284,142 @@ pub fn ppoll(fds: [*]pollfd, n: nfds_t, timeout: ?*timespec, sigmask: ?*const si...@@ -1276,70 +1284,142 @@ pub fn ppoll(fds: [*]pollfd, n: nfds_t, timeout: ?*timespec, sigmask: ?*const si
1276 );1284 );
1277}1285}
12781286
1279pub fn read(fd: i32, buf: [*]u8, count: usize) usize {1287pub fn read(fd: fd_t, buf: [*]u8, count: usize) usize {
1280 return syscall3(.read, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(buf), count);1288 return syscall3(.read, @as(u32, @bitCast(fd)), @intFromPtr(buf), count);
1281}1289}
12821290
1283pub fn preadv(fd: i32, iov: [*]const iovec, count: usize, offset: i64) usize {1291pub fn pread(fd: fd_t, buf: [*]u8, count: usize, offset: off_t) usize {
1292 if (@sizeOf(syscall_arg_t) < @sizeOf(u64)) {
1293 const offset_halves = splitValue64(offset);
1294 if (require_aligned_register_pair) {
1295 return syscall6(
1296 .pread64,
1297 @as(u32, @bitCast(fd)),
1298 @intFromPtr(buf),
1299 count,
1300 0,
1301 offset_halves[0],
1302 offset_halves[1],
1303 );
1304 } else {
1305 return syscall5(
1306 .pread64,
1307 @as(u32, @bitCast(fd)),
1308 @intFromPtr(buf),
1309 count,
1310 offset_halves[0],
1311 offset_halves[1],
1312 );
1313 }
1314 } else {
1315 return syscall4(
1316 .pread64,
1317 @as(u32, @bitCast(fd)),
1318 @intFromPtr(buf),
1319 count,
1320 @as(u64, @bitCast(offset)),
1321 );
1322 }
1323}
1324
1325pub fn readv(fd: fd_t, iov: [*]const iovec, count: usize) usize {
1326 return syscall3(.readv, @as(u32, @bitCast(fd)), @intFromPtr(iov), count);
1327}
1328
1329pub fn preadv(fd: fd_t, iov: [*]const iovec, count: usize, offset: off_t) usize {
1284 const offset_u: u64 = @bitCast(offset);1330 const offset_u: u64 = @bitCast(offset);
1285 return syscall5(1331 return syscall5(
1286 .preadv,1332 .preadv,
1287 @as(usize, @bitCast(@as(isize, fd))),1333 @as(u32, @bitCast(fd)),
1288 @intFromPtr(iov),1334 @intFromPtr(iov),
1289 count,1335 count,
1290 // Kernel expects the offset is split into largest natural word-size.1336 // Kernel expects the offset is split into largest natural word-size.
1291 // See following link for detail:1337 // See following link for detail:
1292 // https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=601cc11d054ae4b5e9b5babec3d8e4667a2cb9b51338 // https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=601cc11d054ae4b5e9b5babec3d8e4667a2cb9b5
1293 @as(usize, @truncate(offset_u)),1339 @truncate(offset_u),
1294 if (usize_bits < 64) @as(usize, @truncate(offset_u >> 32)) else 0,1340 if (@sizeOf(syscall_arg_t) < @sizeOf(u64)) @truncate(offset_u >> 32) else 0,
1295 );1341 );
1296}1342}
12971343
1298pub fn preadv2(fd: i32, iov: [*]const iovec, count: usize, offset: i64, flags: kernel_rwf) usize {1344pub fn preadv2(fd: fd_t, iov: [*]const iovec, count: usize, offset: off_t, flags: kernel_rwf) usize {
1299 const offset_u: u64 = @bitCast(offset);1345 const offset_u: u64 = @bitCast(offset);
1300 return syscall6(1346 return syscall6(
1301 .preadv2,1347 .preadv2,
1302 @as(usize, @bitCast(@as(isize, fd))),1348 @as(u32, @bitCast(fd)),
1303 @intFromPtr(iov),1349 @intFromPtr(iov),
1304 count,1350 count,
1305 // See comments in preadv1351 // See comments in preadv
1306 @as(usize, @truncate(offset_u)),1352 @truncate(offset_u),
1307 if (usize_bits < 64) @as(usize, @truncate(offset_u >> 32)) else 0,1353 if (@sizeOf(syscall_arg_t) < @sizeOf(u64)) @truncate(offset_u >> 32) else 0,
1308 flags,1354 flags,
1309 );1355 );
1310}1356}
13111357
1312pub fn readv(fd: i32, iov: [*]const iovec, count: usize) usize {1358pub fn write(fd: fd_t, buf: [*]const u8, count: usize) usize {
1313 return syscall3(.readv, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(iov), count);1359 return syscall3(.write, @as(u32, @bitCast(fd)), @intFromPtr(buf), count);
1314}1360}
13151361
1316pub fn writev(fd: i32, iov: [*]const iovec_const, count: usize) usize {1362pub fn pwrite(fd: fd_t, buf: [*]const u8, count: usize, offset: off_t) usize {
1317 return syscall3(.writev, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(iov), count);1363 if (@sizeOf(syscall_arg_t) < @sizeOf(u64)) {
1364 const offset_halves = splitValue64(offset);
1365 if (require_aligned_register_pair) {
1366 return syscall6(
1367 .pwrite64,
1368 @as(u32, @bitCast(fd)),
1369 @intFromPtr(buf),
1370 count,
1371 0,
1372 offset_halves[0],
1373 offset_halves[1],
1374 );
1375 } else {
1376 return syscall5(
1377 .pwrite64,
1378 @as(u32, @bitCast(fd)),
1379 @intFromPtr(buf),
1380 count,
1381 offset_halves[0],
1382 offset_halves[1],
1383 );
1384 }
1385 } else {
1386 return syscall4(
1387 .pwrite64,
1388 @as(u32, @bitCast(fd)),
1389 @intFromPtr(buf),
1390 count,
1391 @as(u64, @bitCast(offset)),
1392 );
1393 }
1318}1394}
13191395
1320pub fn pwritev(fd: i32, iov: [*]const iovec_const, count: usize, offset: i64) usize {1396pub fn writev(fd: fd_t, iov: [*]const iovec_const, count: usize) usize {
1397 return syscall3(.writev, @as(u32, @bitCast(fd)), @intFromPtr(iov), count);
1398}
1399
1400pub fn pwritev(fd: fd_t, iov: [*]const iovec_const, count: usize, offset: off_t) usize {
1321 const offset_u: u64 = @bitCast(offset);1401 const offset_u: u64 = @bitCast(offset);
1322 return syscall5(1402 return syscall5(
1323 .pwritev,1403 .pwritev,
1324 @as(usize, @bitCast(@as(isize, fd))),1404 @as(u32, @bitCast(fd)),
1325 @intFromPtr(iov),1405 @intFromPtr(iov),
1326 count,1406 count,
1327 // See comments in preadv1407 // See comments in preadv
1328 @as(usize, @truncate(offset_u)),1408 @truncate(offset_u),
1329 if (usize_bits < 64) @as(usize, @truncate(offset_u >> 32)) else 0,1409 if (@sizeOf(syscall_arg_t) < @sizeOf(u64)) @truncate(offset_u >> 32) else 0,
1330 );1410 );
1331}1411}
13321412
1333pub fn pwritev2(fd: i32, iov: [*]const iovec_const, count: usize, offset: i64, flags: kernel_rwf) usize {1413pub fn pwritev2(fd: fd_t, iov: [*]const iovec_const, count: usize, offset: off_t, flags: kernel_rwf) usize {
1334 const offset_u: u64 = @bitCast(offset);1414 const offset_u: u64 = @bitCast(offset);
1335 return syscall6(1415 return syscall6(
1336 .pwritev2,1416 .pwritev2,
1337 @as(usize, @bitCast(@as(isize, fd))),1417 @as(u32, @bitCast(fd)),
1338 @intFromPtr(iov),1418 @intFromPtr(iov),
1339 count,1419 count,
1340 // See comments in preadv1420 // See comments in preadv
1341 @as(usize, @truncate(offset_u)),1421 @truncate(offset_u),
1342 if (usize_bits < 64) @as(usize, @truncate(offset_u >> 32)) else 0,1422 if (@sizeOf(syscall_arg_t) < @sizeOf(u64)) @truncate(offset_u >> 32) else 0,
1343 flags,1423 flags,
1344 );1424 );
1345}1425}
...@@ -1348,7 +1428,7 @@ pub fn rmdir(path: [*:0]const u8) usize {...@@ -1348,7 +1428,7 @@ pub fn rmdir(path: [*:0]const u8) usize {
1348 if (@hasField(SYS, "rmdir")) {1428 if (@hasField(SYS, "rmdir")) {
1349 return syscall1(.rmdir, @intFromPtr(path));1429 return syscall1(.rmdir, @intFromPtr(path));
1350 } else {1430 } else {
1351 return syscall3(.unlinkat, @as(usize, @bitCast(@as(isize, AT.FDCWD))), @intFromPtr(path), AT.REMOVEDIR);1431 return syscall3(.unlinkat, @as(u32, @bitCast(@as(i32, AT.FDCWD))), @intFromPtr(path), AT.REMOVEDIR);
1352 }1432 }
1353}1433}
13541434
...@@ -1356,54 +1436,15 @@ pub fn symlink(existing: [*:0]const u8, new: [*:0]const u8) usize {...@@ -1356,54 +1436,15 @@ pub fn symlink(existing: [*:0]const u8, new: [*:0]const u8) usize {
1356 if (@hasField(SYS, "symlink")) {1436 if (@hasField(SYS, "symlink")) {
1357 return syscall2(.symlink, @intFromPtr(existing), @intFromPtr(new));1437 return syscall2(.symlink, @intFromPtr(existing), @intFromPtr(new));
1358 } else {1438 } else {
1359 return syscall3(.symlinkat, @intFromPtr(existing), @as(usize, @bitCast(@as(isize, AT.FDCWD))), @intFromPtr(new));1439 return syscall3(.symlinkat, @intFromPtr(existing), @as(u32, @bitCast(@as(i32, AT.FDCWD))), @intFromPtr(new));
1360 }1440 }
1361}1441}
13621442
1363pub fn symlinkat(existing: [*:0]const u8, newfd: i32, newpath: [*:0]const u8) usize {1443pub fn symlinkat(existing: [*:0]const u8, newfd: fd_t, newpath: [*:0]const u8) usize {
1364 return syscall3(.symlinkat, @intFromPtr(existing), @as(usize, @bitCast(@as(isize, newfd))), @intFromPtr(newpath));1444 return syscall3(.symlinkat, @intFromPtr(existing), @as(u32, @bitCast(newfd)), @intFromPtr(newpath));
1365}1445}
13661446
1367pub fn pread(fd: i32, buf: [*]u8, count: usize, offset: i64) usize {1447pub fn access(path: [*:0]const u8, mode: mode_t) usize {
1368 if (@hasField(SYS, "pread64") and usize_bits < 64) {
1369 const offset_halves = splitValue64(offset);
1370 if (require_aligned_register_pair) {
1371 return syscall6(
1372 .pread64,
1373 @as(usize, @bitCast(@as(isize, fd))),
1374 @intFromPtr(buf),
1375 count,
1376 0,
1377 offset_halves[0],
1378 offset_halves[1],
1379 );
1380 } else {
1381 return syscall5(
1382 .pread64,
1383 @as(usize, @bitCast(@as(isize, fd))),
1384 @intFromPtr(buf),
1385 count,
1386 offset_halves[0],
1387 offset_halves[1],
1388 );
1389 }
1390 } else {
1391 // Some architectures (eg. 64bit SPARC) pread is called pread64.
1392 const syscall_number = if (!@hasField(SYS, "pread") and @hasField(SYS, "pread64"))
1393 .pread64
1394 else
1395 .pread;
1396 return syscall4(
1397 syscall_number,
1398 @as(usize, @bitCast(@as(isize, fd))),
1399 @intFromPtr(buf),
1400 count,
1401 @as(u64, @bitCast(offset)),
1402 );
1403 }
1404}
1405
1406pub fn access(path: [*:0]const u8, mode: u32) usize {
1407 if (@hasField(SYS, "access")) {1448 if (@hasField(SYS, "access")) {
1408 return syscall2(.access, @intFromPtr(path), mode);1449 return syscall2(.access, @intFromPtr(path), mode);
1409 } else {1450 } else {
...@@ -1411,19 +1452,19 @@ pub fn access(path: [*:0]const u8, mode: u32) usize {...@@ -1411,19 +1452,19 @@ pub fn access(path: [*:0]const u8, mode: u32) usize {
1411 }1452 }
1412}1453}
14131454
1414pub fn faccessat(dirfd: i32, path: [*:0]const u8, mode: u32, flags: u32) usize {1455pub fn faccessat(dirfd: fd_t, path: [*:0]const u8, mode: mode_t, flags: u32) usize {
1415 if (flags == 0) {1456 if (flags == 0) {
1416 return syscall3(.faccessat, @as(usize, @bitCast(@as(isize, dirfd))), @intFromPtr(path), mode);1457 return syscall3(.faccessat, @as(u32, @bitCast(dirfd)), @intFromPtr(path), mode);
1417 }1458 }
1418 return syscall4(.faccessat2, @as(usize, @bitCast(@as(isize, dirfd))), @intFromPtr(path), mode, flags);1459 return syscall4(.faccessat2, @as(u32, @bitCast(dirfd)), @intFromPtr(path), mode, flags);
1419}1460}
14201461
1421pub fn acct(path: [*:0]const u8) usize {1462pub fn acct(path: [*:0]const u8) usize {
1422 return syscall1(.acct, @intFromPtr(path));1463 return syscall1(.acct, @intFromPtr(path));
1423}1464}
14241465
1425pub fn pipe(fd: *[2]i32) usize {1466pub fn pipe(fd: *[2]fd_t) usize {
1426 if (comptime (native_arch.isMIPS() or native_arch.isSPARC())) {1467 if (native_arch.isMIPS() or native_arch.isSPARC()) {
1427 return syscall_pipe(fd);1468 return syscall_pipe(fd);
1428 } else if (@hasField(SYS, "pipe")) {1469 } else if (@hasField(SYS, "pipe")) {
1429 return syscall1(.pipe, @intFromPtr(fd));1470 return syscall1(.pipe, @intFromPtr(fd));
...@@ -1432,21 +1473,17 @@ pub fn pipe(fd: *[2]i32) usize {...@@ -1432,21 +1473,17 @@ pub fn pipe(fd: *[2]i32) usize {
1432 }1473 }
1433}1474}
14341475
1435pub fn pipe2(fd: *[2]i32, flags: O) usize {1476pub fn pipe2(fd: *[2]fd_t, flags: O) usize {
1436 return syscall2(.pipe2, @intFromPtr(fd), @as(u32, @bitCast(flags)));1477 return syscall2(.pipe2, @intFromPtr(fd), @as(u32, @bitCast(flags)));
1437}1478}
14381479
1439pub fn write(fd: i32, buf: [*]const u8, count: usize) usize {1480pub fn ftruncate(fd: fd_t, length: off_t) usize {
1440 return syscall3(.write, @bitCast(@as(isize, fd)), @intFromPtr(buf), count);1481 if (@sizeOf(syscall_arg_t) < @sizeOf(u64)) {
1441}
1442
1443pub fn ftruncate(fd: i32, length: i64) usize {
1444 if (@hasField(SYS, "ftruncate64") and usize_bits < 64) {
1445 const length_halves = splitValue64(length);1482 const length_halves = splitValue64(length);
1446 if (require_aligned_register_pair) {1483 if (require_aligned_register_pair) {
1447 return syscall4(1484 return syscall4(
1448 .ftruncate64,1485 .ftruncate64,
1449 @as(usize, @bitCast(@as(isize, fd))),1486 @as(u32, @bitCast(fd)),
1450 0,1487 0,
1451 length_halves[0],1488 length_halves[0],
1452 length_halves[1],1489 length_halves[1],
...@@ -1454,7 +1491,7 @@ pub fn ftruncate(fd: i32, length: i64) usize {...@@ -1454,7 +1491,7 @@ pub fn ftruncate(fd: i32, length: i64) usize {
1454 } else {1491 } else {
1455 return syscall3(1492 return syscall3(
1456 .ftruncate64,1493 .ftruncate64,
1457 @as(usize, @bitCast(@as(isize, fd))),1494 @as(u32, @bitCast(fd)),
1458 length_halves[0],1495 length_halves[0],
1459 length_halves[1],1496 length_halves[1],
1460 );1497 );
...@@ -1462,48 +1499,8 @@ pub fn ftruncate(fd: i32, length: i64) usize {...@@ -1462,48 +1499,8 @@ pub fn ftruncate(fd: i32, length: i64) usize {
1462 } else {1499 } else {
1463 return syscall2(1500 return syscall2(
1464 .ftruncate,1501 .ftruncate,
1465 @as(usize, @bitCast(@as(isize, fd))),1502 @as(u32, @bitCast(fd)),
1466 @as(usize, @bitCast(length)),1503 @as(u64, @bitCast(length)),
1467 );
1468 }
1469}
1470
1471pub fn pwrite(fd: i32, buf: [*]const u8, count: usize, offset: i64) usize {
1472 if (@hasField(SYS, "pwrite64") and usize_bits < 64) {
1473 const offset_halves = splitValue64(offset);
1474
1475 if (require_aligned_register_pair) {
1476 return syscall6(
1477 .pwrite64,
1478 @as(usize, @bitCast(@as(isize, fd))),
1479 @intFromPtr(buf),
1480 count,
1481 0,
1482 offset_halves[0],
1483 offset_halves[1],
1484 );
1485 } else {
1486 return syscall5(
1487 .pwrite64,
1488 @as(usize, @bitCast(@as(isize, fd))),
1489 @intFromPtr(buf),
1490 count,
1491 offset_halves[0],
1492 offset_halves[1],
1493 );
1494 }
1495 } else {
1496 // Some architectures (eg. 64bit SPARC) pwrite is called pwrite64.
1497 const syscall_number = if (!@hasField(SYS, "pwrite") and @hasField(SYS, "pwrite64"))
1498 .pwrite64
1499 else
1500 .pwrite;
1501 return syscall4(
1502 syscall_number,
1503 @as(usize, @bitCast(@as(isize, fd))),
1504 @intFromPtr(buf),
1505 count,
1506 @as(u64, @bitCast(offset)),
1507 );1504 );
1508 }1505 }
1509}1506}
...@@ -1514,50 +1511,50 @@ pub fn rename(old: [*:0]const u8, new: [*:0]const u8) usize {...@@ -1514,50 +1511,50 @@ pub fn rename(old: [*:0]const u8, new: [*:0]const u8) usize {
1514 } else if (@hasField(SYS, "renameat")) {1511 } else if (@hasField(SYS, "renameat")) {
1515 return syscall4(1512 return syscall4(
1516 .renameat,1513 .renameat,
1517 @as(usize, @bitCast(@as(isize, AT.FDCWD))),1514 @as(u32, @bitCast(@as(i32, AT.FDCWD))),
1518 @intFromPtr(old),1515 @intFromPtr(old),
1519 @as(usize, @bitCast(@as(isize, AT.FDCWD))),1516 @as(u32, @bitCast(@as(i32, AT.FDCWD))),
1520 @intFromPtr(new),1517 @intFromPtr(new),
1521 );1518 );
1522 } else {1519 } else {
1523 return syscall5(1520 return syscall5(
1524 .renameat2,1521 .renameat2,
1525 @as(usize, @bitCast(@as(isize, AT.FDCWD))),1522 @as(u32, @bitCast(@as(i32, AT.FDCWD))),
1526 @intFromPtr(old),1523 @intFromPtr(old),
1527 @as(usize, @bitCast(@as(isize, AT.FDCWD))),1524 @as(u32, @bitCast(@as(i32, AT.FDCWD))),
1528 @intFromPtr(new),1525 @intFromPtr(new),
1529 0,1526 0,
1530 );1527 );
1531 }1528 }
1532}1529}
15331530
1534pub fn renameat(oldfd: i32, oldpath: [*:0]const u8, newfd: i32, newpath: [*:0]const u8) usize {1531pub fn renameat(oldfd: fd_t, oldpath: [*:0]const u8, newfd: fd_t, newpath: [*:0]const u8) usize {
1535 if (@hasField(SYS, "renameat")) {1532 if (@hasField(SYS, "renameat")) {
1536 return syscall4(1533 return syscall4(
1537 .renameat,1534 .renameat,
1538 @as(usize, @bitCast(@as(isize, oldfd))),1535 @as(u32, @bitCast(oldfd)),
1539 @intFromPtr(oldpath),1536 @intFromPtr(oldpath),
1540 @as(usize, @bitCast(@as(isize, newfd))),1537 @as(u32, @bitCast(newfd)),
1541 @intFromPtr(newpath),1538 @intFromPtr(newpath),
1542 );1539 );
1543 } else {1540 } else {
1544 return syscall5(1541 return syscall5(
1545 .renameat2,1542 .renameat2,
1546 @as(usize, @bitCast(@as(isize, oldfd))),1543 @as(u32, @bitCast(oldfd)),
1547 @intFromPtr(oldpath),1544 @intFromPtr(oldpath),
1548 @as(usize, @bitCast(@as(isize, newfd))),1545 @as(u32, @bitCast(newfd)),
1549 @intFromPtr(newpath),1546 @intFromPtr(newpath),
1550 0,1547 0,
1551 );1548 );
1552 }1549 }
1553}1550}
15541551
1555pub fn renameat2(oldfd: i32, oldpath: [*:0]const u8, newfd: i32, newpath: [*:0]const u8, flags: RENAME) usize {1552pub fn renameat2(oldfd: fd_t, oldpath: [*:0]const u8, newfd: fd_t, newpath: [*:0]const u8, flags: RENAME) usize {
1556 return syscall5(1553 return syscall5(
1557 .renameat2,1554 .renameat2,
1558 @as(usize, @bitCast(@as(isize, oldfd))),1555 @as(u32, @bitCast(oldfd)),
1559 @intFromPtr(oldpath),1556 @intFromPtr(oldpath),
1560 @as(usize, @bitCast(@as(isize, newfd))),1557 @as(u32, @bitCast(newfd)),
1561 @intFromPtr(newpath),1558 @intFromPtr(newpath),
1562 @as(u32, @bitCast(flags)),1559 @as(u32, @bitCast(flags)),
1563 );1560 );
...@@ -1569,7 +1566,7 @@ pub fn open(path: [*:0]const u8, flags: O, perm: mode_t) usize {...@@ -1569,7 +1566,7 @@ pub fn open(path: [*:0]const u8, flags: O, perm: mode_t) usize {
1569 } else {1566 } else {
1570 return syscall4(1567 return syscall4(
1571 .openat,1568 .openat,
1572 @bitCast(@as(isize, AT.FDCWD)),1569 @as(u32, @bitCast(@as(i32, AT.FDCWD))),
1573 @intFromPtr(path),1570 @intFromPtr(path),
1574 @as(u32, @bitCast(flags)),1571 @as(u32, @bitCast(flags)),
1575 perm,1572 perm,
...@@ -1581,13 +1578,13 @@ pub fn create(path: [*:0]const u8, perm: mode_t) usize {...@@ -1581,13 +1578,13 @@ pub fn create(path: [*:0]const u8, perm: mode_t) usize {
1581 return syscall2(.creat, @intFromPtr(path), perm);1578 return syscall2(.creat, @intFromPtr(path), perm);
1582}1579}
15831580
1584pub fn openat(dirfd: i32, path: [*:0]const u8, flags: O, mode: mode_t) usize {1581pub fn openat(dirfd: fd_t, path: [*:0]const u8, flags: O, mode: mode_t) usize {
1585 // dirfd could be negative, for example AT.FDCWD is -1001582 // dirfd could be negative, for example AT.FDCWD is -100
1586 return syscall4(.openat, @bitCast(@as(isize, dirfd)), @intFromPtr(path), @as(u32, @bitCast(flags)), mode);1583 return syscall4(.openat, @as(u32, @bitCast(dirfd)), @intFromPtr(path), @as(u32, @bitCast(flags)), mode);
1587}1584}
15881585
1589/// See also `clone` (from the arch-specific include)1586/// See also `clone` (from the arch-specific include)
1590pub fn clone5(flags: usize, child_stack_ptr: usize, parent_tid: *i32, child_tid: *i32, newtls: usize) usize {1587pub fn clone5(flags: usize, child_stack_ptr: usize, parent_tid: *pid_t, child_tid: *pid_t, newtls: usize) usize {
1591 return syscall5(.clone, flags, child_stack_ptr, @intFromPtr(parent_tid), @intFromPtr(child_tid), newtls);1588 return syscall5(.clone, flags, child_stack_ptr, @intFromPtr(parent_tid), @intFromPtr(child_tid), newtls);
1592}1589}
15931590
...@@ -1602,7 +1599,7 @@ pub fn set_tid_address(tidptr: ?*pid_t) pid_t {...@@ -1602,7 +1599,7 @@ pub fn set_tid_address(tidptr: ?*pid_t) pid_t {
1602}1599}
16031600
1604pub fn close(fd: fd_t) usize {1601pub fn close(fd: fd_t) usize {
1605 return syscall1(.close, @as(usize, @bitCast(@as(isize, fd))));1602 return syscall1(.close, @as(u32, @bitCast(fd)));
1606}1603}
16071604
1608pub const CLOSE_RANGE = packed struct(u32) {1605pub const CLOSE_RANGE = packed struct(u32) {
...@@ -1614,11 +1611,11 @@ pub const CLOSE_RANGE = packed struct(u32) {...@@ -1614,11 +1611,11 @@ pub const CLOSE_RANGE = packed struct(u32) {
1614};1611};
16151612
1616pub fn close_range(first: fd_t, last: fd_t, flags: CLOSE_RANGE) usize {1613pub fn close_range(first: fd_t, last: fd_t, flags: CLOSE_RANGE) usize {
1617 return syscall3(.close_range, fd_to_usize(first), fd_to_usize(last), @as(u32, @bitCast(flags)));1614 return syscall3(.close_range, @as(u32, @bitCast(first)), @as(u32, @bitCast(last)), @as(u32, @bitCast(flags)));
1618}1615}
16191616
1620pub fn fchmod(fd: i32, mode: mode_t) usize {1617pub fn fchmod(fd: fd_t, mode: mode_t) usize {
1621 return syscall2(.fchmod, @as(usize, @bitCast(@as(isize, fd))), mode);1618 return syscall2(.fchmod, @as(u32, @bitCast(fd)), mode);
1622}1619}
16231620
1624pub fn chmod(path: [*:0]const u8, mode: mode_t) usize {1621pub fn chmod(path: [*:0]const u8, mode: mode_t) usize {
...@@ -1629,16 +1626,16 @@ pub fn chmod(path: [*:0]const u8, mode: mode_t) usize {...@@ -1629,16 +1626,16 @@ pub fn chmod(path: [*:0]const u8, mode: mode_t) usize {
1629 }1626 }
1630}1627}
16311628
1632pub fn fchown(fd: i32, owner: uid_t, group: gid_t) usize {1629pub fn fchown(fd: fd_t, owner: uid_t, group: gid_t) usize {
1633 if (@hasField(SYS, "fchown32")) {1630 if (@hasField(SYS, "fchown32")) {
1634 return syscall3(.fchown32, @as(usize, @bitCast(@as(isize, fd))), owner, group);1631 return syscall3(.fchown32, @as(u32, @bitCast(fd)), owner, group);
1635 } else {1632 } else {
1636 return syscall3(.fchown, @as(usize, @bitCast(@as(isize, fd))), owner, group);1633 return syscall3(.fchown, @as(u32, @bitCast(fd)), owner, group);
1637 }1634 }
1638}1635}
16391636
1640pub fn fchownat(fd: i32, path: [*:0]const u8, owner: uid_t, group: gid_t, flags: u32) usize {1637pub fn fchownat(fd: fd_t, path: [*:0]const u8, owner: uid_t, group: gid_t, flags: u32) usize {
1641 return syscall5(.fchownat, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(path), owner, group, flags);1638 return syscall5(.fchownat, @as(u32, @bitCast(fd)), @intFromPtr(path), owner, group, flags);
1642}1639}
16431640
1644pub fn chown(path: [*:0]const u8, owner: uid_t, group: gid_t) usize {1641pub fn chown(path: [*:0]const u8, owner: uid_t, group: gid_t) usize {
...@@ -1661,40 +1658,40 @@ pub fn lchown(path: [*:0]const u8, owner: uid_t, group: gid_t) usize {...@@ -1661,40 +1658,40 @@ pub fn lchown(path: [*:0]const u8, owner: uid_t, group: gid_t) usize {
1661 }1658 }
1662}1659}
16631660
1664pub fn fchmodat(fd: i32, path: [*:0]const u8, mode: mode_t) usize {1661pub fn fchmodat(fd: fd_t, path: [*:0]const u8, mode: mode_t) usize {
1665 return syscall3(.fchmodat, @bitCast(@as(isize, fd)), @intFromPtr(path), mode);1662 return syscall3(.fchmodat, @as(u32, @bitCast(fd)), @intFromPtr(path), mode);
1666}1663}
16671664
1668pub fn fchmodat2(fd: i32, path: [*:0]const u8, mode: mode_t, flags: u32) usize {1665pub fn fchmodat2(fd: fd_t, path: [*:0]const u8, mode: mode_t, flags: u32) usize {
1669 return syscall4(.fchmodat2, @bitCast(@as(isize, fd)), @intFromPtr(path), mode, flags);1666 return syscall4(.fchmodat2, @as(u32, @bitCast(fd)), @intFromPtr(path), mode, flags);
1670}1667}
16711668
1672/// Can only be called on 32 bit systems. For 64 bit see `lseek`.1669/// Can only be called on 32 bit systems. For 64 bit see `lseek`.
1673pub fn llseek(fd: i32, offset: u64, result: ?*u64, whence: usize) usize {1670pub fn llseek(fd: fd_t, offset: off_t, result: ?*off_t, whence: u32) usize {
1674 // NOTE: The offset parameter splitting is independent from the target1671 // NOTE: The offset parameter splitting is independent from the target
1675 // endianness.1672 // endianness.
1676 return syscall5(1673 return syscall5(
1677 .llseek,1674 .llseek,
1678 @as(usize, @bitCast(@as(isize, fd))),1675 @as(u32, @bitCast(fd)),
1679 @as(usize, @truncate(offset >> 32)),1676 @truncate(@as(u64, @bitCast(offset >> 32))),
1680 @as(usize, @truncate(offset)),1677 @truncate(@as(u64, @bitCast(offset))),
1681 @intFromPtr(result),1678 @intFromPtr(result),
1682 whence,1679 whence,
1683 );1680 );
1684}1681}
16851682
1686/// Can only be called on 64 bit systems. For 32 bit see `llseek`.1683/// Can only be called on 64 bit systems. For 32 bit see `llseek`.
1687pub fn lseek(fd: i32, offset: i64, whence: usize) usize {1684pub fn lseek(fd: fd_t, offset: off_t, whence: u32) usize {
1688 return syscall3(.lseek, @as(usize, @bitCast(@as(isize, fd))), @as(usize, @bitCast(offset)), whence);1685 return syscall3(.lseek, @as(u32, @bitCast(fd)), @as(u64, @bitCast(offset)), whence);
1689}1686}
16901687
1691pub fn exit(status: i32) noreturn {1688pub fn exit(status: i32) noreturn {
1692 _ = syscall1(.exit, @as(usize, @bitCast(@as(isize, status))));1689 _ = syscall1(.exit, @as(u32, @bitCast(status)));
1693 unreachable;1690 unreachable;
1694}1691}
16951692
1696pub fn exit_group(status: i32) noreturn {1693pub fn exit_group(status: i32) noreturn {
1697 _ = syscall1(.exit_group, @as(usize, @bitCast(@as(isize, status))));1694 _ = syscall1(.exit_group, @as(u32, @bitCast(status)));
1698 unreachable;1695 unreachable;
1699}1696}
17001697
...@@ -1760,15 +1757,15 @@ pub fn getrandom(buf: [*]u8, count: usize, flags: u32) usize {...@@ -1760,15 +1757,15 @@ pub fn getrandom(buf: [*]u8, count: usize, flags: u32) usize {
1760}1757}
17611758
1762pub fn kill(pid: pid_t, sig: SIG) usize {1759pub fn kill(pid: pid_t, sig: SIG) usize {
1763 return syscall2(.kill, @as(usize, @bitCast(@as(isize, pid))), @intFromEnum(sig));1760 return syscall2(.kill, @as(u32, @bitCast(pid)), @intFromEnum(sig));
1764}1761}
17651762
1766pub fn tkill(tid: pid_t, sig: SIG) usize {1763pub fn tkill(tid: pid_t, sig: SIG) usize {
1767 return syscall2(.tkill, @as(usize, @bitCast(@as(isize, tid))), @intFromEnum(sig));1764 return syscall2(.tkill, @as(u32, @bitCast(tid)), @intFromEnum(sig));
1768}1765}
17691766
1770pub fn tgkill(tgid: pid_t, tid: pid_t, sig: SIG) usize {1767pub fn tgkill(tgid: pid_t, tid: pid_t, sig: SIG) usize {
1771 return syscall3(.tgkill, @as(usize, @bitCast(@as(isize, tgid))), @as(usize, @bitCast(@as(isize, tid))), @intFromEnum(sig));1768 return syscall3(.tgkill, @as(u32, @bitCast(tgid)), @as(u32, @bitCast(tid)), @intFromEnum(sig));
1772}1769}
17731770
1774pub fn link(oldpath: [*:0]const u8, newpath: [*:0]const u8) usize {1771pub fn link(oldpath: [*:0]const u8, newpath: [*:0]const u8) usize {
...@@ -1781,9 +1778,9 @@ pub fn link(oldpath: [*:0]const u8, newpath: [*:0]const u8) usize {...@@ -1781,9 +1778,9 @@ pub fn link(oldpath: [*:0]const u8, newpath: [*:0]const u8) usize {
1781 } else {1778 } else {
1782 return syscall5(1779 return syscall5(
1783 .linkat,1780 .linkat,
1784 @as(usize, @bitCast(@as(isize, AT.FDCWD))),1781 @as(u32, @bitCast(@as(i32, AT.FDCWD))),
1785 @intFromPtr(oldpath),1782 @intFromPtr(oldpath),
1786 @as(usize, @bitCast(@as(isize, AT.FDCWD))),1783 @as(u32, @bitCast(@as(i32, AT.FDCWD))),
1787 @intFromPtr(newpath),1784 @intFromPtr(newpath),
1788 0,1785 0,
1789 );1786 );
...@@ -1793,9 +1790,9 @@ pub fn link(oldpath: [*:0]const u8, newpath: [*:0]const u8) usize {...@@ -1793,9 +1790,9 @@ pub fn link(oldpath: [*:0]const u8, newpath: [*:0]const u8) usize {
1793pub fn linkat(oldfd: fd_t, oldpath: [*:0]const u8, newfd: fd_t, newpath: [*:0]const u8, flags: u32) usize {1790pub fn linkat(oldfd: fd_t, oldpath: [*:0]const u8, newfd: fd_t, newpath: [*:0]const u8, flags: u32) usize {
1794 return syscall5(1791 return syscall5(
1795 .linkat,1792 .linkat,
1796 @as(usize, @bitCast(@as(isize, oldfd))),1793 @as(u32, @bitCast(oldfd)),
1797 @intFromPtr(oldpath),1794 @intFromPtr(oldpath),
1798 @as(usize, @bitCast(@as(isize, newfd))),1795 @as(u32, @bitCast(newfd)),
1799 @intFromPtr(newpath),1796 @intFromPtr(newpath),
1800 flags,1797 flags,
1801 );1798 );
...@@ -1805,33 +1802,33 @@ pub fn unlink(path: [*:0]const u8) usize {...@@ -1805,33 +1802,33 @@ pub fn unlink(path: [*:0]const u8) usize {
1805 if (@hasField(SYS, "unlink")) {1802 if (@hasField(SYS, "unlink")) {
1806 return syscall1(.unlink, @intFromPtr(path));1803 return syscall1(.unlink, @intFromPtr(path));
1807 } else {1804 } else {
1808 return syscall3(.unlinkat, @as(usize, @bitCast(@as(isize, AT.FDCWD))), @intFromPtr(path), 0);1805 return syscall3(.unlinkat, @as(u32, @bitCast(@as(i32, AT.FDCWD))), @intFromPtr(path), 0);
1809 }1806 }
1810}1807}
18111808
1812pub fn unlinkat(dirfd: i32, path: [*:0]const u8, flags: u32) usize {1809pub fn unlinkat(dirfd: fd_t, path: [*:0]const u8, flags: u32) usize {
1813 return syscall3(.unlinkat, @as(usize, @bitCast(@as(isize, dirfd))), @intFromPtr(path), flags);1810 return syscall3(.unlinkat, @as(u32, @bitCast(dirfd)), @intFromPtr(path), flags);
1814}1811}
18151812
1816pub fn waitpid(pid: pid_t, status: *u32, flags: u32) usize {1813pub fn waitpid(pid: pid_t, status: *i32, flags: u32) usize {
1817 return syscall4(.wait4, @as(usize, @bitCast(@as(isize, pid))), @intFromPtr(status), flags, 0);1814 return syscall4(.wait4, @as(u32, @bitCast(pid)), @intFromPtr(status), flags, 0);
1818}1815}
18191816
1820pub fn wait4(pid: pid_t, status: *u32, flags: u32, usage: ?*rusage) usize {1817pub fn wait4(pid: pid_t, status: *i32, flags: u32, usage: ?*rusage) usize {
1821 return syscall4(1818 return syscall4(
1822 .wait4,1819 .wait4,
1823 @as(usize, @bitCast(@as(isize, pid))),1820 @as(u32, @bitCast(pid)),
1824 @intFromPtr(status),1821 @intFromPtr(status),
1825 flags,1822 flags,
1826 @intFromPtr(usage),1823 @intFromPtr(usage),
1827 );1824 );
1828}1825}
18291826
1830pub fn waitid(id_type: P, id: i32, infop: *siginfo_t, flags: u32, usage: ?*rusage) usize {1827pub fn waitid(id_type: P, id: pid_t, infop: *siginfo_t, flags: u32, usage: ?*rusage) usize {
1831 return syscall5(1828 return syscall5(
1832 .waitid,1829 .waitid,
1833 @intFromEnum(id_type),1830 @intFromEnum(id_type),
1834 @as(usize, @bitCast(@as(isize, id))),1831 @as(u32, @bitCast(id)),
1835 @intFromPtr(infop),1832 @intFromPtr(infop),
1836 flags,1833 flags,
1837 @intFromPtr(usage),1834 @intFromPtr(usage),
...@@ -1930,14 +1927,14 @@ pub const Flock = extern struct {...@@ -1930,14 +1927,14 @@ pub const Flock = extern struct {
19301927
1931pub fn fcntl(fd: fd_t, cmd: i32, arg: usize) usize {1928pub fn fcntl(fd: fd_t, cmd: i32, arg: usize) usize {
1932 if (@hasField(SYS, "fcntl64")) {1929 if (@hasField(SYS, "fcntl64")) {
1933 return syscall3(.fcntl64, @as(usize, @bitCast(@as(isize, fd))), @as(usize, @bitCast(@as(isize, cmd))), arg);1930 return syscall3(.fcntl64, @as(u32, @bitCast(fd)), @as(u32, @bitCast(cmd)), arg);
1934 } else {1931 } else {
1935 return syscall3(.fcntl, @as(usize, @bitCast(@as(isize, fd))), @as(usize, @bitCast(@as(isize, cmd))), arg);1932 return syscall3(.fcntl, @as(u32, @bitCast(fd)), @as(u32, @bitCast(cmd)), arg);
1936 }1933 }
1937}1934}
19381935
1939pub fn flock(fd: fd_t, operation: i32) usize {1936pub fn flock(fd: fd_t, operation: i32) usize {
1940 return syscall2(.flock, @as(usize, @bitCast(@as(isize, fd))), @as(usize, @bitCast(@as(isize, operation))));1937 return syscall2(.flock, @as(u32, @bitCast(fd)), @as(u32, @bitCast(operation)));
1941}1938}
19421939
1943pub const Elf_Symndx = if (native_arch == .s390x) u64 else u32;1940pub const Elf_Symndx = if (native_arch == .s390x) u64 else u32;
...@@ -1977,7 +1974,7 @@ fn init_vdso_clock_gettime(clk: clockid_t, ts: *timespec) callconv(.c) usize {...@@ -1977,7 +1974,7 @@ fn init_vdso_clock_gettime(clk: clockid_t, ts: *timespec) callconv(.c) usize {
1977pub fn clock_getres(clk_id: clockid_t, tp: *timespec) usize {1974pub fn clock_getres(clk_id: clockid_t, tp: *timespec) usize {
1978 return syscall2(1975 return syscall2(
1979 if (@hasField(SYS, "clock_getres") and native_arch != .hexagon) .clock_getres else .clock_getres_time64,1976 if (@hasField(SYS, "clock_getres") and native_arch != .hexagon) .clock_getres else .clock_getres_time64,
1980 @as(usize, @intFromEnum(clk_id)),1977 @intFromEnum(clk_id),
1981 @intFromPtr(tp),1978 @intFromPtr(tp),
1982 );1979 );
1983}1980}
...@@ -1985,7 +1982,7 @@ pub fn clock_getres(clk_id: clockid_t, tp: *timespec) usize {...@@ -1985,7 +1982,7 @@ pub fn clock_getres(clk_id: clockid_t, tp: *timespec) usize {
1985pub fn clock_settime(clk_id: clockid_t, tp: *const timespec) usize {1982pub fn clock_settime(clk_id: clockid_t, tp: *const timespec) usize {
1986 return syscall2(1983 return syscall2(
1987 if (@hasField(SYS, "clock_settime") and native_arch != .hexagon) .clock_settime else .clock_settime64,1984 if (@hasField(SYS, "clock_settime") and native_arch != .hexagon) .clock_settime else .clock_settime64,
1988 @as(usize, @intFromEnum(clk_id)),1985 @intFromEnum(clk_id),
1989 @intFromPtr(tp),1986 @intFromPtr(tp),
1990 );1987 );
1991}1988}
...@@ -2139,11 +2136,11 @@ pub fn setresgid(rgid: gid_t, egid: gid_t, sgid: gid_t) usize {...@@ -2139,11 +2136,11 @@ pub fn setresgid(rgid: gid_t, egid: gid_t, sgid: gid_t) usize {
2139}2136}
21402137
2141pub fn setpgid(pid: pid_t, pgid: pid_t) usize {2138pub fn setpgid(pid: pid_t, pgid: pid_t) usize {
2142 return syscall2(.setpgid, @intCast(pid), @intCast(pgid));2139 return syscall2(.setpgid, @as(u32, @bitCast(pid)), @as(u32, @bitCast(pgid)));
2143}2140}
21442141
2145pub fn getpgid(pid: pid_t) usize {2142pub fn getpgid(pid: pid_t) usize {
2146 return syscall1(.getpgid, @intCast(pid));2143 return syscall1(.getpgid, @as(u32, @bitCast(pid)));
2147}2144}
21482145
2149pub fn getgroups(size: usize, list: ?[*]gid_t) usize {2146pub fn getgroups(size: usize, list: ?[*]gid_t) usize {
...@@ -2167,7 +2164,7 @@ pub fn setsid() usize {...@@ -2167,7 +2164,7 @@ pub fn setsid() usize {
2167}2164}
21682165
2169pub fn getsid(pid: pid_t) usize {2166pub fn getsid(pid: pid_t) usize {
2170 return syscall1(.getsid, @intCast(pid));2167 return syscall1(.getsid, @as(u32, @bitCast(pid)));
2171}2168}
21722169
2173pub fn getpid() pid_t {2170pub fn getpid() pid_t {
...@@ -2238,8 +2235,6 @@ pub fn sigaction(sig: SIG, noalias act: ?*const Sigaction, noalias oact: ?*Sigac...@@ -2238,8 +2235,6 @@ pub fn sigaction(sig: SIG, noalias act: ?*const Sigaction, noalias oact: ?*Sigac
2238 return 0;2235 return 0;
2239}2236}
22402237
2241const usize_bits = @typeInfo(usize).int.bits;
2242
2243/// Defined as one greater than the largest defined signal number.2238/// Defined as one greater than the largest defined signal number.
2244pub const NSIG = if (is_mips) 128 else 65;2239pub const NSIG = if (is_mips) 128 else 65;
22452240
...@@ -2300,18 +2295,18 @@ pub fn sigismember(set: *const sigset_t, sig: SIG) bool {...@@ -2300,18 +2295,18 @@ pub fn sigismember(set: *const sigset_t, sig: SIG) bool {
2300 return ((set.*)[index.word] & index.mask) != 0;2295 return ((set.*)[index.word] & index.mask) != 0;
2301}2296}
23022297
2303pub fn getsockname(fd: i32, noalias addr: *sockaddr, noalias len: *socklen_t) usize {2298pub fn getsockname(fd: fd_t, noalias addr: *sockaddr, noalias len: *socklen_t) usize {
2304 if (native_arch == .x86) {2299 if (native_arch == .x86) {
2305 return socketcall(SC.getsockname, &[3]usize{ @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(addr), @intFromPtr(len) });2300 return socketcall(SC.getsockname, &[3]usize{ @as(u32, @bitCast(fd)), @intFromPtr(addr), @intFromPtr(len) });
2306 }2301 }
2307 return syscall3(.getsockname, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(addr), @intFromPtr(len));2302 return syscall3(.getsockname, @as(u32, @bitCast(fd)), @intFromPtr(addr), @intFromPtr(len));
2308}2303}
23092304
2310pub fn getpeername(fd: i32, noalias addr: *sockaddr, noalias len: *socklen_t) usize {2305pub fn getpeername(fd: fd_t, noalias addr: *sockaddr, noalias len: *socklen_t) usize {
2311 if (native_arch == .x86) {2306 if (native_arch == .x86) {
2312 return socketcall(SC.getpeername, &[3]usize{ @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(addr), @intFromPtr(len) });2307 return socketcall(SC.getpeername, &[3]usize{ @as(u32, @bitCast(fd)), @intFromPtr(addr), @intFromPtr(len) });
2313 }2308 }
2314 return syscall3(.getpeername, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(addr), @intFromPtr(len));2309 return syscall3(.getpeername, @as(u32, @bitCast(fd)), @intFromPtr(addr), @intFromPtr(len));
2315}2310}
23162311
2317pub fn socket(domain: u32, socket_type: u32, protocol: u32) usize {2312pub fn socket(domain: u32, socket_type: u32, protocol: u32) usize {
...@@ -2321,58 +2316,52 @@ pub fn socket(domain: u32, socket_type: u32, protocol: u32) usize {...@@ -2321,58 +2316,52 @@ pub fn socket(domain: u32, socket_type: u32, protocol: u32) usize {
2321 return syscall3(.socket, domain, socket_type, protocol);2316 return syscall3(.socket, domain, socket_type, protocol);
2322}2317}
23232318
2324pub fn setsockopt(fd: i32, level: i32, optname: u32, optval: [*]const u8, optlen: socklen_t) usize {2319pub fn setsockopt(fd: fd_t, level: i32, optname: u32, optval: [*]const u8, optlen: socklen_t) usize {
2325 if (native_arch == .x86) {2320 if (native_arch == .x86) {
2326 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)) });2321 return socketcall(SC.setsockopt, &[5]usize{ @as(u32, @bitCast(fd)), @as(usize, @bitCast(@as(isize, level))), optname, @intFromPtr(optval), @as(usize, @intCast(optlen)) });
2327 }2322 }
2328 return syscall5(.setsockopt, @as(usize, @bitCast(@as(isize, fd))), @as(usize, @bitCast(@as(isize, level))), optname, @intFromPtr(optval), @as(usize, @intCast(optlen)));2323 return syscall5(.setsockopt, @as(u32, @bitCast(fd)), @as(usize, @bitCast(@as(isize, level))), optname, @intFromPtr(optval), @as(usize, @intCast(optlen)));
2329}2324}
23302325
2331pub fn getsockopt(fd: i32, level: i32, optname: u32, noalias optval: [*]u8, noalias optlen: *socklen_t) usize {2326pub fn getsockopt(fd: fd_t, level: i32, optname: u32, noalias optval: [*]u8, noalias optlen: *socklen_t) usize {
2332 if (native_arch == .x86) {2327 if (native_arch == .x86) {
2333 return socketcall(SC.getsockopt, &[5]usize{ @as(usize, @bitCast(@as(isize, fd))), @as(usize, @bitCast(@as(isize, level))), optname, @intFromPtr(optval), @intFromPtr(optlen) });2328 return socketcall(SC.getsockopt, &[5]usize{ @as(u32, @bitCast(fd)), @as(usize, @bitCast(@as(isize, level))), optname, @intFromPtr(optval), @intFromPtr(optlen) });
2334 }2329 }
2335 return syscall5(.getsockopt, @as(usize, @bitCast(@as(isize, fd))), @as(usize, @bitCast(@as(isize, level))), optname, @intFromPtr(optval), @intFromPtr(optlen));2330 return syscall5(.getsockopt, @as(u32, @bitCast(fd)), @as(usize, @bitCast(@as(isize, level))), optname, @intFromPtr(optval), @intFromPtr(optlen));
2336}2331}
23372332
2338pub fn sendmsg(fd: i32, msg: *const msghdr_const, flags: u32) usize {2333pub fn sendmsg(fd: fd_t, msg: *const msghdr_const, flags: u32) usize {
2339 const fd_usize = @as(usize, @bitCast(@as(isize, fd)));
2340 const msg_usize = @intFromPtr(msg);
2341 if (native_arch == .x86) {2334 if (native_arch == .x86) {
2342 return socketcall(SC.sendmsg, &[3]usize{ fd_usize, msg_usize, flags });2335 return socketcall(SC.sendmsg, &[3]usize{ @as(u32, @bitCast(fd)), @intFromPtr(msg), flags });
2343 } else {2336 } else {
2344 return syscall3(.sendmsg, fd_usize, msg_usize, flags);2337 return syscall3(.sendmsg, @as(u32, @bitCast(fd)), @intFromPtr(msg), flags);
2345 }2338 }
2346}2339}
23472340
2348pub fn sendmmsg(fd: i32, msgvec: [*]mmsghdr, vlen: u32, flags: u32) usize {2341pub fn sendmmsg(fd: fd_t, msgvec: [*]mmsghdr, vlen: u32, flags: u32) usize {
2349 return syscall4(.sendmmsg, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(msgvec), vlen, flags);2342 return syscall4(.sendmmsg, @as(u32, @bitCast(fd)), @intFromPtr(msgvec), vlen, flags);
2350}2343}
23512344
2352pub fn connect(fd: i32, addr: *const anyopaque, len: socklen_t) usize {2345pub fn connect(fd: fd_t, addr: *const anyopaque, len: socklen_t) usize {
2353 const fd_usize = @as(usize, @bitCast(@as(isize, fd)));
2354 const addr_usize = @intFromPtr(addr);
2355 if (native_arch == .x86) {2346 if (native_arch == .x86) {
2356 return socketcall(SC.connect, &[3]usize{ fd_usize, addr_usize, len });2347 return socketcall(SC.connect, &[3]usize{ @as(u32, @bitCast(fd)), @intFromPtr(addr), len });
2357 } else {2348 } else {
2358 return syscall3(.connect, fd_usize, addr_usize, len);2349 return syscall3(.connect, @as(u32, @bitCast(fd)), @intFromPtr(addr), len);
2359 }2350 }
2360}2351}
23612352
2362pub fn recvmsg(fd: i32, msg: *msghdr, flags: u32) usize {2353pub fn recvmsg(fd: fd_t, msg: *msghdr, flags: u32) usize {
2363 const fd_usize = @as(usize, @bitCast(@as(isize, fd)));
2364 const msg_usize = @intFromPtr(msg);
2365 if (native_arch == .x86) {2354 if (native_arch == .x86) {
2366 return socketcall(SC.recvmsg, &[3]usize{ fd_usize, msg_usize, flags });2355 return socketcall(SC.recvmsg, &[3]usize{ @as(u32, @bitCast(fd)), @intFromPtr(msg), flags });
2367 } else {2356 } else {
2368 return syscall3(.recvmsg, fd_usize, msg_usize, flags);2357 return syscall3(.recvmsg, @as(u32, @bitCast(fd)), @intFromPtr(msg), flags);
2369 }2358 }
2370}2359}
23712360
2372pub fn recvmmsg(fd: i32, msgvec: ?[*]mmsghdr, vlen: u32, flags: u32, timeout: ?*timespec) usize {2361pub fn recvmmsg(fd: fd_t, msgvec: ?[*]mmsghdr, vlen: u32, flags: u32, timeout: ?*timespec) usize {
2373 return syscall5(2362 return syscall5(
2374 if (@hasField(SYS, "recvmmsg") and native_arch != .hexagon) .recvmmsg else .recvmmsg_time64,2363 if (@hasField(SYS, "recvmmsg") and native_arch != .hexagon) .recvmmsg else .recvmmsg_time64,
2375 @as(usize, @bitCast(@as(isize, fd))),2364 @as(u32, @bitCast(fd)),
2376 @intFromPtr(msgvec),2365 @intFromPtr(msgvec),
2377 vlen,2366 vlen,
2378 flags,2367 flags,
...@@ -2381,43 +2370,39 @@ pub fn recvmmsg(fd: i32, msgvec: ?[*]mmsghdr, vlen: u32, flags: u32, timeout: ?*...@@ -2381,43 +2370,39 @@ pub fn recvmmsg(fd: i32, msgvec: ?[*]mmsghdr, vlen: u32, flags: u32, timeout: ?*
2381}2370}
23822371
2383pub fn recvfrom(2372pub fn recvfrom(
2384 fd: i32,2373 fd: fd_t,
2385 noalias buf: [*]u8,2374 noalias buf: [*]u8,
2386 len: usize,2375 len: usize,
2387 flags: u32,2376 flags: u32,
2388 noalias addr: ?*sockaddr,2377 noalias addr: ?*sockaddr,
2389 noalias alen: ?*socklen_t,2378 noalias alen: ?*socklen_t,
2390) usize {2379) usize {
2391 const fd_usize = @as(usize, @bitCast(@as(isize, fd)));
2392 const buf_usize = @intFromPtr(buf);
2393 const addr_usize = @intFromPtr(addr);
2394 const alen_usize = @intFromPtr(alen);
2395 if (native_arch == .x86) {2380 if (native_arch == .x86) {
2396 return socketcall(SC.recvfrom, &[6]usize{ fd_usize, buf_usize, len, flags, addr_usize, alen_usize });2381 return socketcall(SC.recvfrom, &[6]usize{ @as(u32, @bitCast(fd)), @intFromPtr(buf), len, flags, @intFromPtr(addr), @intFromPtr(alen) });
2397 } else {2382 } else {
2398 return syscall6(.recvfrom, fd_usize, buf_usize, len, flags, addr_usize, alen_usize);2383 return syscall6(.recvfrom, @as(u32, @bitCast(fd)), @intFromPtr(buf), len, flags, @intFromPtr(addr), @intFromPtr(alen));
2399 }2384 }
2400}2385}
24012386
2402pub fn shutdown(fd: i32, how: i32) usize {2387pub fn shutdown(fd: fd_t, how: i32) usize {
2403 if (native_arch == .x86) {2388 if (native_arch == .x86) {
2404 return socketcall(SC.shutdown, &[2]usize{ @as(usize, @bitCast(@as(isize, fd))), @as(usize, @bitCast(@as(isize, how))) });2389 return socketcall(SC.shutdown, &[2]usize{ @as(u32, @bitCast(fd)), @as(u32, @bitCast(how)) });
2405 }2390 }
2406 return syscall2(.shutdown, @as(usize, @bitCast(@as(isize, fd))), @as(usize, @bitCast(@as(isize, how))));2391 return syscall2(.shutdown, @as(u32, @bitCast(fd)), @as(u32, @bitCast(how)));
2407}2392}
24082393
2409pub fn bind(fd: i32, addr: *const sockaddr, len: socklen_t) usize {2394pub fn bind(fd: fd_t, addr: *const sockaddr, len: socklen_t) usize {
2410 if (native_arch == .x86) {2395 if (native_arch == .x86) {
2411 return socketcall(SC.bind, &[3]usize{ @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(addr), @as(usize, @intCast(len)) });2396 return socketcall(SC.bind, &[3]usize{ @as(u32, @bitCast(fd)), @intFromPtr(addr), len });
2412 }2397 }
2413 return syscall3(.bind, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(addr), @as(usize, @intCast(len)));2398 return syscall3(.bind, @as(u32, @bitCast(fd)), @intFromPtr(addr), len);
2414}2399}
24152400
2416pub fn listen(fd: i32, backlog: u32) usize {2401pub fn listen(fd: fd_t, backlog: u32) usize {
2417 if (native_arch == .x86) {2402 if (native_arch == .x86) {
2418 return socketcall(SC.listen, &[2]usize{ @as(usize, @bitCast(@as(isize, fd))), backlog });2403 return socketcall(SC.listen, &[2]usize{ @as(u32, @bitCast(fd)), backlog });
2419 }2404 }
2420 return syscall2(.listen, @as(usize, @bitCast(@as(isize, fd))), backlog);2405 return syscall2(.listen, @as(u32, @bitCast(fd)), backlog);
2421}2406}
24222407
2423pub fn sendto(fd: i32, buf: [*]const u8, len: usize, flags: u32, addr: ?*const sockaddr, alen: socklen_t) usize {2408pub fn sendto(fd: i32, buf: [*]const u8, len: usize, flags: u32, addr: ?*const sockaddr, alen: socklen_t) usize {
...@@ -2427,51 +2412,41 @@ pub fn sendto(fd: i32, buf: [*]const u8, len: usize, flags: u32, addr: ?*const s...@@ -2427,51 +2412,41 @@ pub fn sendto(fd: i32, buf: [*]const u8, len: usize, flags: u32, addr: ?*const s
2427 return syscall6(.sendto, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(buf), len, flags, @intFromPtr(addr), @as(usize, @intCast(alen)));2412 return syscall6(.sendto, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(buf), len, flags, @intFromPtr(addr), @as(usize, @intCast(alen)));
2428}2413}
24292414
2430pub fn sendfile(outfd: i32, infd: i32, offset: ?*i64, count: usize) usize {2415pub fn sendfile(outfd: fd_t, infd: fd_t, offset: ?*off_t, count: usize) usize {
2431 if (@hasField(SYS, "sendfile64")) {2416 return syscall4(
2432 return syscall4(2417 if (@hasField(SYS, "sendfile64")) .sendfile64 else .sendfile,
2433 .sendfile64,2418 @as(u32, @bitCast(outfd)),
2434 @as(usize, @bitCast(@as(isize, outfd))),2419 @as(u32, @bitCast(infd)),
2435 @as(usize, @bitCast(@as(isize, infd))),2420 @intFromPtr(offset),
2436 @intFromPtr(offset),2421 count,
2437 count,2422 );
2438 );
2439 } else {
2440 return syscall4(
2441 .sendfile,
2442 @as(usize, @bitCast(@as(isize, outfd))),
2443 @as(usize, @bitCast(@as(isize, infd))),
2444 @intFromPtr(offset),
2445 count,
2446 );
2447 }
2448}2423}
24492424
2450pub fn socketpair(domain: u32, socket_type: u32, protocol: u32, fd: *[2]i32) usize {2425pub fn socketpair(domain: u32, socket_type: u32, protocol: u32, fd: *[2]fd_t) usize {
2451 if (native_arch == .x86) {2426 if (native_arch == .x86) {
2452 return socketcall(SC.socketpair, &[4]usize{ domain, socket_type, protocol, @intFromPtr(fd) });2427 return socketcall(SC.socketpair, &[4]usize{ domain, socket_type, protocol, @intFromPtr(fd) });
2453 }2428 }
2454 return syscall4(.socketpair, domain, socket_type, protocol, @intFromPtr(fd));2429 return syscall4(.socketpair, domain, socket_type, protocol, @intFromPtr(fd));
2455}2430}
24562431
2457pub fn accept(fd: i32, noalias addr: ?*sockaddr, noalias len: ?*socklen_t) usize {2432pub fn accept(fd: fd_t, noalias addr: ?*sockaddr, noalias len: ?*socklen_t) usize {
2458 if (native_arch == .x86) {2433 if (native_arch == .x86) {
2459 return socketcall(SC.accept, &[4]usize{ @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(addr), @intFromPtr(len), 0 });2434 return socketcall(SC.accept, &[4]usize{ @as(u32, @bitCast(fd)), @intFromPtr(addr), @intFromPtr(len), 0 });
2460 }2435 }
2461 return accept4(fd, addr, len, 0);2436 return accept4(fd, addr, len, 0);
2462}2437}
24632438
2464pub fn accept4(fd: i32, noalias addr: ?*sockaddr, noalias len: ?*socklen_t, flags: u32) usize {2439pub fn accept4(fd: fd_t, noalias addr: ?*sockaddr, noalias len: ?*socklen_t, flags: u32) usize {
2465 if (native_arch == .x86) {2440 if (native_arch == .x86) {
2466 return socketcall(SC.accept4, &[4]usize{ @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(addr), @intFromPtr(len), flags });2441 return socketcall(SC.accept4, &[4]usize{ @as(u32, @bitCast(fd)), @intFromPtr(addr), @intFromPtr(len), flags });
2467 }2442 }
2468 return syscall4(.accept4, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(addr), @intFromPtr(len), flags);2443 return syscall4(.accept4, @as(u32, @bitCast(fd)), @intFromPtr(addr), @intFromPtr(len), flags);
2469}2444}
24702445
2471pub fn statx(dirfd: i32, path: [*:0]const u8, flags: u32, mask: STATX, statx_buf: *Statx) usize {2446pub fn statx(dirfd: fd_t, path: [*:0]const u8, flags: u32, mask: STATX, statx_buf: *Statx) usize {
2472 return syscall5(2447 return syscall5(
2473 .statx,2448 .statx,
2474 @as(usize, @bitCast(@as(isize, dirfd))),2449 @as(u32, @bitCast(dirfd)),
2475 @intFromPtr(path),2450 @intFromPtr(path),
2476 flags,2451 flags,
2477 @as(u32, @bitCast(mask)),2452 @as(u32, @bitCast(mask)),
...@@ -2488,7 +2463,7 @@ pub fn llistxattr(path: [*:0]const u8, list: [*]u8, size: usize) usize {...@@ -2488,7 +2463,7 @@ pub fn llistxattr(path: [*:0]const u8, list: [*]u8, size: usize) usize {
2488}2463}
24892464
2490pub fn flistxattr(fd: fd_t, list: [*]u8, size: usize) usize {2465pub fn flistxattr(fd: fd_t, list: [*]u8, size: usize) usize {
2491 return syscall3(.flistxattr, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(list), size);2466 return syscall3(.flistxattr, @as(u32, @bitCast(fd)), @intFromPtr(list), size);
2492}2467}
24932468
2494pub fn getxattr(path: [*:0]const u8, name: [*:0]const u8, value: [*]u8, size: usize) usize {2469pub fn getxattr(path: [*:0]const u8, name: [*:0]const u8, value: [*]u8, size: usize) usize {
...@@ -2500,7 +2475,7 @@ pub fn lgetxattr(path: [*:0]const u8, name: [*:0]const u8, value: [*]u8, size: u...@@ -2500,7 +2475,7 @@ pub fn lgetxattr(path: [*:0]const u8, name: [*:0]const u8, value: [*]u8, size: u
2500}2475}
25012476
2502pub fn fgetxattr(fd: fd_t, name: [*:0]const u8, value: [*]u8, size: usize) usize {2477pub fn fgetxattr(fd: fd_t, name: [*:0]const u8, value: [*]u8, size: usize) usize {
2503 return syscall4(.fgetxattr, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(name), @intFromPtr(value), size);2478 return syscall4(.fgetxattr, @as(u32, @bitCast(fd)), @intFromPtr(name), @intFromPtr(value), size);
2504}2479}
25052480
2506pub fn setxattr(path: [*:0]const u8, name: [*:0]const u8, value: [*]const u8, size: usize, flags: usize) usize {2481pub fn setxattr(path: [*:0]const u8, name: [*:0]const u8, value: [*]const u8, size: usize, flags: usize) usize {
...@@ -2512,7 +2487,7 @@ pub fn lsetxattr(path: [*:0]const u8, name: [*:0]const u8, value: [*]const u8, s...@@ -2512,7 +2487,7 @@ pub fn lsetxattr(path: [*:0]const u8, name: [*:0]const u8, value: [*]const u8, s
2512}2487}
25132488
2514pub fn fsetxattr(fd: fd_t, name: [*:0]const u8, value: [*]const u8, size: usize, flags: usize) usize {2489pub fn fsetxattr(fd: fd_t, name: [*:0]const u8, value: [*]const u8, size: usize, flags: usize) usize {
2515 return syscall5(.fsetxattr, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(name), @intFromPtr(value), size, flags);2490 return syscall5(.fsetxattr, @as(u32, @bitCast(fd)), @intFromPtr(name), @intFromPtr(value), size, flags);
2516}2491}
25172492
2518pub fn removexattr(path: [*:0]const u8, name: [*:0]const u8) usize {2493pub fn removexattr(path: [*:0]const u8, name: [*:0]const u8) usize {
...@@ -2523,8 +2498,8 @@ pub fn lremovexattr(path: [*:0]const u8, name: [*:0]const u8) usize {...@@ -2523,8 +2498,8 @@ pub fn lremovexattr(path: [*:0]const u8, name: [*:0]const u8) usize {
2523 return syscall2(.lremovexattr, @intFromPtr(path), @intFromPtr(name));2498 return syscall2(.lremovexattr, @intFromPtr(path), @intFromPtr(name));
2524}2499}
25252500
2526pub fn fremovexattr(fd: usize, name: [*:0]const u8) usize {2501pub fn fremovexattr(fd: fd_t, name: [*:0]const u8) usize {
2527 return syscall2(.fremovexattr, fd, @intFromPtr(name));2502 return syscall2(.fremovexattr, @as(u32, @bitCast(fd)), @intFromPtr(name));
2528}2503}
25292504
2530pub const sched_param = extern struct {2505pub const sched_param = extern struct {
...@@ -2554,27 +2529,27 @@ pub const SCHED = packed struct(i32) {...@@ -2554,27 +2529,27 @@ pub const SCHED = packed struct(i32) {
2554};2529};
25552530
2556pub fn sched_setparam(pid: pid_t, param: *const sched_param) usize {2531pub fn sched_setparam(pid: pid_t, param: *const sched_param) usize {
2557 return syscall2(.sched_setparam, @as(usize, @bitCast(@as(isize, pid))), @intFromPtr(param));2532 return syscall2(.sched_setparam, @as(u32, @bitCast(pid)), @intFromPtr(param));
2558}2533}
25592534
2560pub fn sched_getparam(pid: pid_t, param: *sched_param) usize {2535pub fn sched_getparam(pid: pid_t, param: *sched_param) usize {
2561 return syscall2(.sched_getparam, @as(usize, @bitCast(@as(isize, pid))), @intFromPtr(param));2536 return syscall2(.sched_getparam, @as(u32, @bitCast(pid)), @intFromPtr(param));
2562}2537}
25632538
2564pub fn sched_setscheduler(pid: pid_t, policy: SCHED, param: *const sched_param) usize {2539pub fn sched_setscheduler(pid: pid_t, policy: SCHED, param: *const sched_param) usize {
2565 return syscall3(.sched_setscheduler, @as(usize, @bitCast(@as(isize, pid))), @intCast(@as(u32, @bitCast(policy))), @intFromPtr(param));2540 return syscall3(.sched_setscheduler, @as(u32, @bitCast(pid)), @as(u32, @bitCast(policy)), @intFromPtr(param));
2566}2541}
25672542
2568pub fn sched_getscheduler(pid: pid_t) usize {2543pub fn sched_getscheduler(pid: pid_t) usize {
2569 return syscall1(.sched_getscheduler, @as(usize, @bitCast(@as(isize, pid))));2544 return syscall1(.sched_getscheduler, @as(u32, @bitCast(pid)));
2570}2545}
25712546
2572pub fn sched_get_priority_max(policy: SCHED) usize {2547pub fn sched_get_priority_max(policy: SCHED) usize {
2573 return syscall1(.sched_get_priority_max, @intCast(@as(u32, @bitCast(policy))));2548 return syscall1(.sched_get_priority_max, @as(u32, @bitCast(policy)));
2574}2549}
25752550
2576pub fn sched_get_priority_min(policy: SCHED) usize {2551pub fn sched_get_priority_min(policy: SCHED) usize {
2577 return syscall1(.sched_get_priority_min, @intCast(@as(u32, @bitCast(policy))));2552 return syscall1(.sched_get_priority_min, @as(u32, @bitCast(policy)));
2578}2553}
25792554
2580pub fn getcpu(cpu: ?*usize, node: ?*usize) usize {2555pub fn getcpu(cpu: ?*usize, node: ?*usize) usize {
...@@ -2593,24 +2568,24 @@ pub const sched_attr = extern struct {...@@ -2593,24 +2568,24 @@ pub const sched_attr = extern struct {
2593 period: u64 = 0,2568 period: u64 = 0,
2594};2569};
25952570
2596pub fn sched_setattr(pid: pid_t, attr: *const sched_attr, flags: usize) usize {2571pub fn sched_setattr(pid: pid_t, attr: *const sched_attr, flags: u32) usize {
2597 return syscall3(.sched_setattr, @as(usize, @bitCast(@as(isize, pid))), @intFromPtr(attr), flags);2572 return syscall3(.sched_setattr, @as(u32, @bitCast(pid)), @intFromPtr(attr), flags);
2598}2573}
25992574
2600pub fn sched_getattr(pid: pid_t, attr: *sched_attr, size: usize, flags: usize) usize {2575pub fn sched_getattr(pid: pid_t, attr: *sched_attr, size: u32, flags: u32) usize {
2601 return syscall4(.sched_getattr, @as(usize, @bitCast(@as(isize, pid))), @intFromPtr(attr), size, flags);2576 return syscall4(.sched_getattr, @as(u32, @bitCast(pid)), @intFromPtr(attr), size, flags);
2602}2577}
26032578
2604pub fn sched_rr_get_interval(pid: pid_t, tp: *timespec) usize {2579pub fn sched_rr_get_interval(pid: pid_t, tp: *timespec) usize {
2605 return syscall2(.sched_rr_get_interval, @as(usize, @bitCast(@as(isize, pid))), @intFromPtr(tp));2580 return syscall2(.sched_rr_get_interval, @as(u32, @bitCast(pid)), @intFromPtr(tp));
2606}2581}
26072582
2608pub fn sched_yield() usize {2583pub fn sched_yield() usize {
2609 return syscall0(.sched_yield);2584 return syscall0(.sched_yield);
2610}2585}
26112586
2612pub fn sched_getaffinity(pid: pid_t, size: usize, set: *cpu_set_t) usize {2587pub fn sched_getaffinity(pid: pid_t, size: u32, set: *cpu_set_t) usize {
2613 const rc = syscall3(.sched_getaffinity, @as(usize, @bitCast(@as(isize, pid))), size, @intFromPtr(set));2588 const rc = syscall3(.sched_getaffinity, @as(u32, @bitCast(pid)), size, @intFromPtr(set));
2614 if (@as(isize, @bitCast(rc)) < 0) return rc;2589 if (@as(isize, @bitCast(rc)) < 0) return rc;
2615 if (rc < size) @memset(@as([*]u8, @ptrCast(set))[rc..size], 0);2590 if (rc < size) @memset(@as([*]u8, @ptrCast(set))[rc..size], 0);
2616 return 0;2591 return 0;
...@@ -2618,7 +2593,7 @@ pub fn sched_getaffinity(pid: pid_t, size: usize, set: *cpu_set_t) usize {...@@ -2618,7 +2593,7 @@ pub fn sched_getaffinity(pid: pid_t, size: usize, set: *cpu_set_t) usize {
26182593
2619pub fn sched_setaffinity(pid: pid_t, set: *const cpu_set_t) !void {2594pub fn sched_setaffinity(pid: pid_t, set: *const cpu_set_t) !void {
2620 const size = @sizeOf(cpu_set_t);2595 const size = @sizeOf(cpu_set_t);
2621 const rc = syscall3(.sched_setaffinity, @as(usize, @bitCast(@as(isize, pid))), size, @intFromPtr(set));2596 const rc = syscall3(.sched_setaffinity, @as(u32, @bitCast(pid)), size, @intFromPtr(set));
26222597
2623 switch (errno(rc)) {2598 switch (errno(rc)) {
2624 .SUCCESS => return,2599 .SUCCESS => return,
...@@ -2630,25 +2605,25 @@ pub fn epoll_create() usize {...@@ -2630,25 +2605,25 @@ pub fn epoll_create() usize {
2630 return epoll_create1(0);2605 return epoll_create1(0);
2631}2606}
26322607
2633pub fn epoll_create1(flags: usize) usize {2608pub fn epoll_create1(flags: u32) usize {
2634 return syscall1(.epoll_create1, flags);2609 return syscall1(.epoll_create1, flags);
2635}2610}
26362611
2637pub fn epoll_ctl(epoll_fd: i32, op: u32, fd: i32, ev: ?*epoll_event) usize {2612pub fn epoll_ctl(epoll_fd: fd_t, op: u32, fd: fd_t, ev: ?*epoll_event) usize {
2638 return syscall4(.epoll_ctl, @as(usize, @bitCast(@as(isize, epoll_fd))), @as(usize, @intCast(op)), @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(ev));2613 return syscall4(.epoll_ctl, @as(u32, @bitCast(epoll_fd)), op, @as(u32, @bitCast(fd)), @intFromPtr(ev));
2639}2614}
26402615
2641pub fn epoll_wait(epoll_fd: i32, events: [*]epoll_event, maxevents: u32, timeout: i32) usize {2616pub fn epoll_wait(epoll_fd: fd_t, events: [*]epoll_event, maxevents: u32, timeout: i32) usize {
2642 return epoll_pwait(epoll_fd, events, maxevents, timeout, null);2617 return epoll_pwait(epoll_fd, events, maxevents, timeout, null);
2643}2618}
26442619
2645pub fn epoll_pwait(epoll_fd: i32, events: [*]epoll_event, maxevents: u32, timeout: i32, sigmask: ?*const sigset_t) usize {2620pub fn epoll_pwait(epoll_fd: fd_t, events: [*]epoll_event, maxevents: u32, timeout: i32, sigmask: ?*const sigset_t) usize {
2646 return syscall6(2621 return syscall6(
2647 .epoll_pwait,2622 .epoll_pwait,
2648 @as(usize, @bitCast(@as(isize, epoll_fd))),2623 @as(u32, @bitCast(epoll_fd)),
2649 @intFromPtr(events),2624 @intFromPtr(events),
2650 @as(usize, @intCast(maxevents)),2625 maxevents,
2651 @as(usize, @bitCast(@as(isize, timeout))),2626 @as(u32, @bitCast(timeout)),
2652 @intFromPtr(sigmask),2627 @intFromPtr(sigmask),
2653 NSIG / 8,2628 NSIG / 8,
2654 );2629 );
...@@ -2671,18 +2646,18 @@ pub const itimerspec = extern struct {...@@ -2671,18 +2646,18 @@ pub const itimerspec = extern struct {
2671 it_value: timespec,2646 it_value: timespec,
2672};2647};
26732648
2674pub fn timerfd_gettime(fd: i32, curr_value: *itimerspec) usize {2649pub fn timerfd_gettime(fd: fd_t, curr_value: *itimerspec) usize {
2675 return syscall2(2650 return syscall2(
2676 if (@hasField(SYS, "timerfd_gettime") and native_arch != .hexagon) .timerfd_gettime else .timerfd_gettime64,2651 if (@hasField(SYS, "timerfd_gettime") and native_arch != .hexagon) .timerfd_gettime else .timerfd_gettime64,
2677 @bitCast(@as(isize, fd)),2652 @as(u32, @bitCast(fd)),
2678 @intFromPtr(curr_value),2653 @intFromPtr(curr_value),
2679 );2654 );
2680}2655}
26812656
2682pub fn timerfd_settime(fd: i32, flags: TFD.TIMER, new_value: *const itimerspec, old_value: ?*itimerspec) usize {2657pub fn timerfd_settime(fd: fd_t, flags: TFD.TIMER, new_value: *const itimerspec, old_value: ?*itimerspec) usize {
2683 return syscall4(2658 return syscall4(
2684 if (@hasField(SYS, "timerfd_settime") and native_arch != .hexagon) .timerfd_settime else .timerfd_settime64,2659 if (@hasField(SYS, "timerfd_settime") and native_arch != .hexagon) .timerfd_settime else .timerfd_settime64,
2685 @bitCast(@as(isize, fd)),2660 @as(u32, @bitCast(fd)),
2686 @as(u32, @bitCast(flags)),2661 @as(u32, @bitCast(flags)),
2687 @intFromPtr(new_value),2662 @intFromPtr(new_value),
2688 @intFromPtr(old_value),2663 @intFromPtr(old_value),
...@@ -2697,11 +2672,11 @@ pub const ITIMER = enum(i32) {...@@ -2697,11 +2672,11 @@ pub const ITIMER = enum(i32) {
2697};2672};
26982673
2699pub fn getitimer(which: i32, curr_value: *itimerspec) usize {2674pub fn getitimer(which: i32, curr_value: *itimerspec) usize {
2700 return syscall2(.getitimer, @as(usize, @bitCast(@as(isize, which))), @intFromPtr(curr_value));2675 return syscall2(.getitimer, @as(u32, @bitCast(which)), @intFromPtr(curr_value));
2701}2676}
27022677
2703pub fn setitimer(which: i32, new_value: *const itimerspec, old_value: ?*itimerspec) usize {2678pub fn setitimer(which: i32, new_value: *const itimerspec, old_value: ?*itimerspec) usize {
2704 return syscall3(.setitimer, @as(usize, @bitCast(@as(isize, which))), @intFromPtr(new_value), @intFromPtr(old_value));2679 return syscall3(.setitimer, @as(u32, @bitCast(which)), @intFromPtr(new_value), @intFromPtr(old_value));
2705}2680}
27062681
2707pub fn unshare(flags: usize) usize {2682pub fn unshare(flags: usize) usize {
...@@ -2709,7 +2684,7 @@ pub fn unshare(flags: usize) usize {...@@ -2709,7 +2684,7 @@ pub fn unshare(flags: usize) usize {
2709}2684}
27102685
2711pub fn setns(fd: fd_t, flags: u32) usize {2686pub fn setns(fd: fd_t, flags: u32) usize {
2712 return syscall2(.setns, @as(usize, @bitCast(@as(isize, fd))), flags);2687 return syscall2(.setns, @as(u32, @bitCast(fd)), flags);
2713}2688}
27142689
2715pub fn capget(hdrp: *cap_user_header_t, datap: *cap_user_data_t) usize {2690pub fn capget(hdrp: *cap_user_header_t, datap: *cap_user_data_t) usize {
...@@ -2732,12 +2707,12 @@ pub fn io_uring_setup(entries: u32, p: *io_uring_params) usize {...@@ -2732,12 +2707,12 @@ pub fn io_uring_setup(entries: u32, p: *io_uring_params) usize {
2732 return syscall2(.io_uring_setup, entries, @intFromPtr(p));2707 return syscall2(.io_uring_setup, entries, @intFromPtr(p));
2733}2708}
27342709
2735pub fn io_uring_enter(fd: i32, to_submit: u32, min_complete: u32, flags: u32, sig: ?*sigset_t) usize {2710pub fn io_uring_enter(fd: fd_t, to_submit: u32, min_complete: u32, flags: u32, sig: ?*sigset_t) usize {
2736 return syscall6(.io_uring_enter, @as(usize, @bitCast(@as(isize, fd))), to_submit, min_complete, flags, @intFromPtr(sig), NSIG / 8);2711 return syscall6(.io_uring_enter, @as(u32, @bitCast(fd)), to_submit, min_complete, flags, @intFromPtr(sig), NSIG / 8);
2737}2712}
27382713
2739pub fn io_uring_register(fd: i32, opcode: IORING_REGISTER, arg: ?*const anyopaque, nr_args: u32) usize {2714pub fn io_uring_register(fd: fd_t, opcode: IORING_REGISTER, arg: ?*const anyopaque, nr_args: u32) usize {
2740 return syscall4(.io_uring_register, @as(usize, @bitCast(@as(isize, fd))), @intFromEnum(opcode), @intFromPtr(arg), nr_args);2715 return syscall4(.io_uring_register, @as(u32, @bitCast(fd)), @intFromEnum(opcode), @intFromPtr(arg), nr_args);
2741}2716}
27422717
2743pub fn memfd_create(name: [*:0]const u8, flags: u32) usize {2718pub fn memfd_create(name: [*:0]const u8, flags: u32) usize {
...@@ -2745,43 +2720,43 @@ pub fn memfd_create(name: [*:0]const u8, flags: u32) usize {...@@ -2745,43 +2720,43 @@ pub fn memfd_create(name: [*:0]const u8, flags: u32) usize {
2745}2720}
27462721
2747pub fn getrusage(who: i32, usage: *rusage) usize {2722pub fn getrusage(who: i32, usage: *rusage) usize {
2748 return syscall2(.getrusage, @as(usize, @bitCast(@as(isize, who))), @intFromPtr(usage));2723 return syscall2(.getrusage, @as(u32, @bitCast(who)), @intFromPtr(usage));
2749}2724}
27502725
2751pub fn tcgetattr(fd: fd_t, termios_p: *termios) usize {2726pub fn tcgetattr(fd: fd_t, termios_p: *termios) usize {
2752 return syscall3(.ioctl, @as(usize, @bitCast(@as(isize, fd))), T.CGETS, @intFromPtr(termios_p));2727 return syscall3(.ioctl, @as(u32, @bitCast(fd)), T.CGETS, @intFromPtr(termios_p));
2753}2728}
27542729
2755pub fn tcsetattr(fd: fd_t, optional_action: TCSA, termios_p: *const termios) usize {2730pub fn tcsetattr(fd: fd_t, optional_action: TCSA, termios_p: *const termios) usize {
2756 return syscall3(.ioctl, @as(usize, @bitCast(@as(isize, fd))), T.CSETS + @intFromEnum(optional_action), @intFromPtr(termios_p));2731 return syscall3(.ioctl, @as(u32, @bitCast(fd)), T.CSETS + @intFromEnum(optional_action), @intFromPtr(termios_p));
2757}2732}
27582733
2759pub fn tcgetpgrp(fd: fd_t, pgrp: *pid_t) usize {2734pub fn tcgetpgrp(fd: fd_t, pgrp: *pid_t) usize {
2760 return syscall3(.ioctl, @as(usize, @bitCast(@as(isize, fd))), T.IOCGPGRP, @intFromPtr(pgrp));2735 return syscall3(.ioctl, @as(u32, @bitCast(fd)), T.IOCGPGRP, @intFromPtr(pgrp));
2761}2736}
27622737
2763pub fn tcsetpgrp(fd: fd_t, pgrp: *const pid_t) usize {2738pub fn tcsetpgrp(fd: fd_t, pgrp: *const pid_t) usize {
2764 return syscall3(.ioctl, @as(usize, @bitCast(@as(isize, fd))), T.IOCSPGRP, @intFromPtr(pgrp));2739 return syscall3(.ioctl, @as(u32, @bitCast(fd)), T.IOCSPGRP, @intFromPtr(pgrp));
2765}2740}
27662741
2767pub fn tcdrain(fd: fd_t) usize {2742pub fn tcdrain(fd: fd_t) usize {
2768 return syscall3(.ioctl, @as(usize, @bitCast(@as(isize, fd))), T.CSBRK, 1);2743 return syscall3(.ioctl, @as(u32, @bitCast(fd)), T.CSBRK, 1);
2769}2744}
27702745
2771pub fn ioctl(fd: fd_t, request: u32, arg: usize) usize {2746pub fn ioctl(fd: fd_t, request: u32, arg: usize) usize {
2772 return syscall3(.ioctl, @as(usize, @bitCast(@as(isize, fd))), request, arg);2747 return syscall3(.ioctl, @as(u32, @bitCast(fd)), request, arg);
2773}2748}
27742749
2775pub fn signalfd(fd: fd_t, mask: *const sigset_t, flags: u32) usize {2750pub fn signalfd(fd: fd_t, mask: *const sigset_t, flags: u32) usize {
2776 return syscall4(.signalfd4, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(mask), NSIG / 8, flags);2751 return syscall4(.signalfd4, @as(u32, @bitCast(fd)), @intFromPtr(mask), NSIG / 8, flags);
2777}2752}
27782753
2779pub fn copy_file_range(fd_in: fd_t, off_in: ?*i64, fd_out: fd_t, off_out: ?*i64, len: usize, flags: u32) usize {2754pub 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 {
2780 return syscall6(2755 return syscall6(
2781 .copy_file_range,2756 .copy_file_range,
2782 @as(usize, @bitCast(@as(isize, fd_in))),2757 @as(u32, @bitCast(fd_in)),
2783 @intFromPtr(off_in),2758 @intFromPtr(off_in),
2784 @as(usize, @bitCast(@as(isize, fd_out))),2759 @as(u32, @bitCast(fd_out)),
2785 @intFromPtr(off_out),2760 @intFromPtr(off_out),
2786 len,2761 len,
2787 flags,2762 flags,
...@@ -2797,19 +2772,19 @@ pub fn sync() void {...@@ -2797,19 +2772,19 @@ pub fn sync() void {
2797}2772}
27982773
2799pub fn syncfs(fd: fd_t) usize {2774pub fn syncfs(fd: fd_t) usize {
2800 return syscall1(.syncfs, @as(usize, @bitCast(@as(isize, fd))));2775 return syscall1(.syncfs, @as(u32, @bitCast(fd)));
2801}2776}
28022777
2803pub fn fsync(fd: fd_t) usize {2778pub fn fsync(fd: fd_t) usize {
2804 return syscall1(.fsync, @as(usize, @bitCast(@as(isize, fd))));2779 return syscall1(.fsync, @as(u32, @bitCast(fd)));
2805}2780}
28062781
2807pub fn fdatasync(fd: fd_t) usize {2782pub fn fdatasync(fd: fd_t) usize {
2808 return syscall1(.fdatasync, @as(usize, @bitCast(@as(isize, fd))));2783 return syscall1(.fdatasync, @as(u32, @bitCast(fd)));
2809}2784}
28102785
2811pub fn prctl(option: i32, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {2786pub fn prctl(option: i32, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
2812 return syscall5(.prctl, @as(usize, @bitCast(@as(isize, option))), arg2, arg3, arg4, arg5);2787 return syscall5(.prctl, @as(u32, @bitCast(option)), arg2, arg3, arg4, arg5);
2813}2788}
28142789
2815pub fn getrlimit(resource: rlimit_resource, rlim: *rlimit) usize {2790pub fn getrlimit(resource: rlimit_resource, rlim: *rlimit) usize {
...@@ -2825,8 +2800,8 @@ pub fn setrlimit(resource: rlimit_resource, rlim: *const rlimit) usize {...@@ -2825,8 +2800,8 @@ pub fn setrlimit(resource: rlimit_resource, rlim: *const rlimit) usize {
2825pub fn prlimit(pid: pid_t, resource: rlimit_resource, new_limit: ?*const rlimit, old_limit: ?*rlimit) usize {2800pub fn prlimit(pid: pid_t, resource: rlimit_resource, new_limit: ?*const rlimit, old_limit: ?*rlimit) usize {
2826 return syscall4(2801 return syscall4(
2827 .prlimit64,2802 .prlimit64,
2828 @as(usize, @bitCast(@as(isize, pid))),2803 @as(u32, @bitCast(pid)),
2829 @as(usize, @bitCast(@as(isize, @intFromEnum(resource)))),2804 @as(u32, @bitCast(@as(i32, @intFromEnum(resource)))),
2830 @intFromPtr(new_limit),2805 @intFromPtr(new_limit),
2831 @intFromPtr(old_limit),2806 @intFromPtr(old_limit),
2832 );2807 );
...@@ -2841,14 +2816,14 @@ pub fn madvise(address: [*]u8, len: usize, advice: u32) usize {...@@ -2841,14 +2816,14 @@ pub fn madvise(address: [*]u8, len: usize, advice: u32) usize {
2841}2816}
28422817
2843pub fn pidfd_open(pid: pid_t, flags: u32) usize {2818pub fn pidfd_open(pid: pid_t, flags: u32) usize {
2844 return syscall2(.pidfd_open, @as(usize, @bitCast(@as(isize, pid))), flags);2819 return syscall2(.pidfd_open, @as(u32, @bitCast(pid)), flags);
2845}2820}
28462821
2847pub fn pidfd_getfd(pidfd: fd_t, targetfd: fd_t, flags: u32) usize {2822pub fn pidfd_getfd(pidfd: fd_t, targetfd: fd_t, flags: u32) usize {
2848 return syscall3(2823 return syscall3(
2849 .pidfd_getfd,2824 .pidfd_getfd,
2850 @as(usize, @bitCast(@as(isize, pidfd))),2825 @as(u32, @bitCast(pidfd)),
2851 @as(usize, @bitCast(@as(isize, targetfd))),2826 @as(u32, @bitCast(targetfd)),
2852 flags,2827 flags,
2853 );2828 );
2854}2829}
...@@ -2856,7 +2831,7 @@ pub fn pidfd_getfd(pidfd: fd_t, targetfd: fd_t, flags: u32) usize {...@@ -2856,7 +2831,7 @@ pub fn pidfd_getfd(pidfd: fd_t, targetfd: fd_t, flags: u32) usize {
2856pub fn pidfd_send_signal(pidfd: fd_t, sig: SIG, info: ?*siginfo_t, flags: u32) usize {2831pub fn pidfd_send_signal(pidfd: fd_t, sig: SIG, info: ?*siginfo_t, flags: u32) usize {
2857 return syscall4(2832 return syscall4(
2858 .pidfd_send_signal,2833 .pidfd_send_signal,
2859 @as(usize, @bitCast(@as(isize, pidfd))),2834 @as(u32, @bitCast(pidfd)),
2860 @intFromEnum(sig),2835 @intFromEnum(sig),
2861 @intFromPtr(info),2836 @intFromPtr(info),
2862 flags,2837 flags,
...@@ -2866,7 +2841,7 @@ pub fn pidfd_send_signal(pidfd: fd_t, sig: SIG, info: ?*siginfo_t, flags: u32) u...@@ -2866,7 +2841,7 @@ pub fn pidfd_send_signal(pidfd: fd_t, sig: SIG, info: ?*siginfo_t, flags: u32) u
2866pub fn process_vm_readv(pid: pid_t, local: []const iovec, remote: []const iovec_const, flags: usize) usize {2841pub fn process_vm_readv(pid: pid_t, local: []const iovec, remote: []const iovec_const, flags: usize) usize {
2867 return syscall6(2842 return syscall6(
2868 .process_vm_readv,2843 .process_vm_readv,
2869 @as(usize, @bitCast(@as(isize, pid))),2844 @as(u32, @bitCast(pid)),
2870 @intFromPtr(local.ptr),2845 @intFromPtr(local.ptr),
2871 local.len,2846 local.len,
2872 @intFromPtr(remote.ptr),2847 @intFromPtr(remote.ptr),
...@@ -2878,7 +2853,7 @@ pub fn process_vm_readv(pid: pid_t, local: []const iovec, remote: []const iovec_...@@ -2878,7 +2853,7 @@ pub fn process_vm_readv(pid: pid_t, local: []const iovec, remote: []const iovec_
2878pub fn process_vm_writev(pid: pid_t, local: []const iovec_const, remote: []const iovec_const, flags: usize) usize {2853pub fn process_vm_writev(pid: pid_t, local: []const iovec_const, remote: []const iovec_const, flags: usize) usize {
2879 return syscall6(2854 return syscall6(
2880 .process_vm_writev,2855 .process_vm_writev,
2881 @as(usize, @bitCast(@as(isize, pid))),2856 @as(u32, @bitCast(pid)),
2882 @intFromPtr(local.ptr),2857 @intFromPtr(local.ptr),
2883 local.len,2858 local.len,
2884 @intFromPtr(remote.ptr),2859 @intFromPtr(remote.ptr),
...@@ -2888,50 +2863,43 @@ pub fn process_vm_writev(pid: pid_t, local: []const iovec_const, remote: []const...@@ -2888,50 +2863,43 @@ pub fn process_vm_writev(pid: pid_t, local: []const iovec_const, remote: []const
2888}2863}
28892864
2890pub fn fadvise(fd: fd_t, offset: i64, len: i64, advice: usize) usize {2865pub fn fadvise(fd: fd_t, offset: i64, len: i64, advice: usize) usize {
2891 if (comptime native_arch.isArm() or native_arch == .hexagon or native_arch.isPowerPC32()) {2866 if (native_arch.isMIPS32()) {
2892 // These architectures reorder the arguments so that a register is not skipped to align the2867 // MIPS O32 weirdly differs from the other architectures that require
2893 // register number that `offset` is passed in.2868 // aligned register pairs for this specific syscall.
28942869
2895 const offset_halves = splitValue64(offset);2870 const offset_halves = splitValue64(offset);
2896 const length_halves = splitValue64(len);2871 const length_halves = splitValue64(len);
28972872
2898 return syscall6(2873 return syscall7(
2899 .fadvise64_64,2874 .fadvise64,
2900 @as(usize, @bitCast(@as(isize, fd))),2875 @as(u32, @bitCast(fd)),
2901 advice,2876 0,
2902 offset_halves[0],2877 offset_halves[0],
2903 offset_halves[1],2878 offset_halves[1],
2904 length_halves[0],2879 length_halves[0],
2905 length_halves[1],2880 length_halves[1],
2881 advice,
2906 );2882 );
2907 } else if (native_arch.isMIPS32()) {2883 } else if (require_aligned_register_pair) {
2908 // MIPS O32 does not deal with the register alignment issue, so pass a dummy value.
2909
2910 const offset_halves = splitValue64(offset);2884 const offset_halves = splitValue64(offset);
2911 const length_halves = splitValue64(len);2885 const length_halves = splitValue64(len);
29122886
2913 return syscall7(2887 return syscall6(
2914 .fadvise64,2888 .fadvise64_64,
2915 @as(usize, @bitCast(@as(isize, fd))),2889 @as(u32, @bitCast(fd)),
2916 0,2890 advice,
2917 offset_halves[0],2891 offset_halves[0],
2918 offset_halves[1],2892 offset_halves[1],
2919 length_halves[0],2893 length_halves[0],
2920 length_halves[1],2894 length_halves[1],
2921 advice,
2922 );2895 );
2923 } else if (comptime usize_bits < 64) {2896 } else if (@sizeOf(syscall_arg_t) < @sizeOf(u64)) {
2924 // Other 32-bit architectures do not require register alignment.
2925
2926 const offset_halves = splitValue64(offset);2897 const offset_halves = splitValue64(offset);
2927 const length_halves = splitValue64(len);2898 const length_halves = splitValue64(len);
29282899
2929 return syscall6(2900 return syscall6(
2930 switch (builtin.abi) {2901 .fadvise64_64,
2931 .gnuabin32, .gnux32, .muslabin32, .muslx32 => .fadvise64,2902 @as(u32, @bitCast(fd)),
2932 else => .fadvise64_64,
2933 },
2934 @as(usize, @bitCast(@as(isize, fd))),
2935 offset_halves[0],2903 offset_halves[0],
2936 offset_halves[1],2904 offset_halves[1],
2937 length_halves[0],2905 length_halves[0],
...@@ -2939,14 +2907,11 @@ pub fn fadvise(fd: fd_t, offset: i64, len: i64, advice: usize) usize {...@@ -2939,14 +2907,11 @@ pub fn fadvise(fd: fd_t, offset: i64, len: i64, advice: usize) usize {
2939 advice,2907 advice,
2940 );2908 );
2941 } else {2909 } else {
2942 // On 64-bit architectures, fadvise64_64 and fadvise64 are the same. Generally, older ports
2943 // call it fadvise64 (x86, PowerPC, etc), while newer ports call it fadvise64_64 (RISC-V,
2944 // LoongArch, etc). SPARC is the odd one out because it has both.
2945 return syscall4(2910 return syscall4(
2946 if (@hasField(SYS, "fadvise64_64")) .fadvise64_64 else .fadvise64,2911 .fadvise64,
2947 @as(usize, @bitCast(@as(isize, fd))),2912 @as(u32, @bitCast(fd)),
2948 @as(usize, @bitCast(offset)),2913 @as(u64, @bitCast(offset)),
2949 @as(usize, @bitCast(len)),2914 @as(u64, @bitCast(len)),
2950 advice,2915 advice,
2951 );2916 );
2952 }2917 }
...@@ -2962,9 +2927,9 @@ pub fn perf_event_open(...@@ -2962,9 +2927,9 @@ pub fn perf_event_open(
2962 return syscall5(2927 return syscall5(
2963 .perf_event_open,2928 .perf_event_open,
2964 @intFromPtr(attr),2929 @intFromPtr(attr),
2965 @as(usize, @bitCast(@as(isize, pid))),2930 @as(u32, @bitCast(pid)),
2966 @as(usize, @bitCast(@as(isize, cpu))),2931 @as(u32, @bitCast(cpu)),
2967 @as(usize, @bitCast(@as(isize, group_fd))),2932 @as(u32, @bitCast(group_fd)),
2968 flags,2933 flags,
2969 );2934 );
2970}2935}
...@@ -2983,7 +2948,7 @@ pub fn ptrace(...@@ -2983,7 +2948,7 @@ pub fn ptrace(
2983 return syscall5(2948 return syscall5(
2984 .ptrace,2949 .ptrace,
2985 req,2950 req,
2986 @as(usize, @bitCast(@as(isize, pid))),2951 @as(u32, @bitCast(pid)),
2987 addr,2952 addr,
2988 data,2953 data,
2989 addr2,2954 addr2,
...@@ -3005,14 +2970,14 @@ pub fn cachestat(...@@ -3005,14 +2970,14 @@ pub fn cachestat(
3005) usize {2970) usize {
3006 return syscall4(2971 return syscall4(
3007 .cachestat,2972 .cachestat,
3008 @as(usize, @bitCast(@as(isize, fd))),2973 @as(u32, @bitCast(fd)),
3009 @intFromPtr(cstat_range),2974 @intFromPtr(cstat_range),
3010 @intFromPtr(cstat),2975 @intFromPtr(cstat),
3011 flags,2976 flags,
3012 );2977 );
3013}2978}
30142979
3015pub fn map_shadow_stack(addr: u64, size: u64, flags: u32) usize {2980pub fn map_shadow_stack(addr: usize, size: usize, flags: u32) usize {
3016 return syscall3(.map_shadow_stack, addr, size, flags);2981 return syscall3(.map_shadow_stack, addr, size, flags);
3017}2982}
30182983
...@@ -3676,13 +3641,6 @@ pub const E = switch (native_arch) {...@@ -3676,13 +3641,6 @@ pub const E = switch (native_arch) {
3676 },3641 },
3677};3642};
36783643
3679pub const pid_t = i32;
3680pub const fd_t = i32;
3681pub const socket_t = i32;
3682pub const uid_t = u32;
3683pub const gid_t = u32;
3684pub const clock_t = isize;
3685
3686pub const NAME_MAX = 255;3644pub const NAME_MAX = 255;
3687pub const PATH_MAX = 4096;3645pub const PATH_MAX = 4096;
3688pub const IOV_MAX = 1024;3646pub const IOV_MAX = 1024;
...@@ -10174,7 +10132,3 @@ pub const cmsghdr = extern struct {...@@ -10174,7 +10132,3 @@ pub const cmsghdr = extern struct {
10174 level: i32,10132 level: i32,
10175 type: i32,10133 type: i32,
10176};10134};
10177
10178inline fn fd_to_usize(fd: fd_t) usize {
10179 return @as(usize, @bitCast(@as(isize, fd)));
10180}
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-13
...@@ -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
...@@ -87,7 +116,6 @@ pub fn syscall6(...@@ -87,7 +116,6 @@ pub fn syscall6(
87 : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });116 : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
88}117}
89118
90// FIXME
91pub fn clone() callconv(.naked) u32 {119pub fn clone() callconv(.naked) u32 {
92 // __clone(func, stack, flags, arg, ptid, tls, ctid)120 // __clone(func, stack, flags, arg, ptid, tls, ctid)
93 // a0, a1, a2, a3, a4, a5, a6121 // a0, a1, a2, a3, a4, a5, a6
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),