From e5a11020cc838019de12955437b371511b4745e5 Mon Sep 17 00:00:00 2001 From: Koakuma Date: Mon, 17 Aug 2020 15:07:57 +0700 Subject: Add sparc64 syscall interface --- lib/std/os/linux.zig | 1 + 1 file changed, 1 insertion(+) (limited to 'lib/std/os/linux.zig') diff --git a/lib/std/os/linux.zig b/lib/std/os/linux.zig index e38d9bc10d..0a675cf10f 100644 --- a/lib/std/os/linux.zig +++ b/lib/std/os/linux.zig @@ -24,6 +24,7 @@ pub usingnamespace switch (builtin.arch) { .aarch64 => @import("linux/arm64.zig"), .arm => @import("linux/arm-eabi.zig"), .riscv64 => @import("linux/riscv64.zig"), + .sparcv9 => @import("linux/sparc64.zig"), .mips, .mipsel => @import("linux/mips.zig"), .powerpc64, .powerpc64le => @import("linux/powerpc64.zig"), else => struct {}, -- cgit v1.2.3 From 6146f81c6e5bb96f834a02dfd9cbadbe6e48e982 Mon Sep 17 00:00:00 2001 From: Koakuma Date: Fri, 28 Aug 2020 21:42:26 +0700 Subject: Add pipe(2) support --- lib/std/os/linux.zig | 2 +- lib/std/os/linux/sparc64.zig | 34 ++++++++++++++++++++++++++-------- lib/std/target.zig | 7 +++++++ 3 files changed, 34 insertions(+), 9 deletions(-) (limited to 'lib/std/os/linux.zig') diff --git a/lib/std/os/linux.zig b/lib/std/os/linux.zig index 0a675cf10f..af4f127228 100644 --- a/lib/std/os/linux.zig +++ b/lib/std/os/linux.zig @@ -381,7 +381,7 @@ pub fn faccessat(dirfd: i32, path: [*:0]const u8, mode: u32, flags: u32) usize { } pub fn pipe(fd: *[2]i32) usize { - if (comptime builtin.arch.isMIPS()) { + if (comptime builtin.arch.isMIPS() || comptime builtin.arch.isSPARC()) { return syscall_pipe(fd); } else if (@hasField(SYS, "pipe")) { return syscall1(.pipe, @ptrToInt(fd)); diff --git a/lib/std/os/linux/sparc64.zig b/lib/std/os/linux/sparc64.zig index d3dd551a25..dc0b5845b1 100644 --- a/lib/std/os/linux/sparc64.zig +++ b/lib/std/os/linux/sparc64.zig @@ -1,5 +1,23 @@ usingnamespace @import("../bits.zig"); +pub fn syscall_pipe(fd: *[2]i32) usize { + return asm volatile ( + \\ mov %%o0, %%o2 + \\ t 0x6d + \\ bcc %%xcc, 1f + \\ nop + \\ ba 2f + \\ neg %%o0 + \\ 1: + \\ st %%o0, [%%o2] + \\ st %%o1, [%%o2 + 4] + \\ clr %%o0 + \\ 2: + : [ret] "={o0}" (-> usize) + : [number] "{$2}" (@enumToInt(SYS.pipe)) + : "memory", "xcc", "o1", "o2", "o3", "o4", "o5", "o7" + ); +} pub fn syscall0(number: SYS) usize { return asm volatile ( @@ -10,7 +28,7 @@ pub fn syscall0(number: SYS) usize { \\ 1: : [ret] "={o0}" (-> usize) : [number] "{g1}" (@enumToInt(number)) - : "memory", "o1", "o2", "o3", "o4", "o5", "o7" + : "memory", "xcc", "o1", "o2", "o3", "o4", "o5", "o7" ); } @@ -24,7 +42,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize { : [ret] "={o0}" (-> usize) : [number] "{g1}" (@enumToInt(number)), [arg1] "{o0}" (arg1) - : "memory", "o1", "o2", "o3", "o4", "o5", "o7" + : "memory", "xcc", "o1", "o2", "o3", "o4", "o5", "o7" ); } @@ -39,7 +57,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize { : [number] "{g1}" (@enumToInt(number)), [arg1] "{o0}" (arg1), [arg2] "{o1}" (arg2) - : "memory", "o1", "o2", "o3", "o4", "o5", "o7" + : "memory", "xcc", "o1", "o2", "o3", "o4", "o5", "o7" ); } @@ -55,7 +73,7 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize { [arg1] "{o0}" (arg1), [arg2] "{o1}" (arg2), [arg3] "{o2}" (arg3) - : "memory", "o1", "o2", "o3", "o4", "o5", "o7" + : "memory", "xcc", "o1", "o2", "o3", "o4", "o5", "o7" ); } @@ -72,7 +90,7 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) [arg2] "{o1}" (arg2), [arg3] "{o2}" (arg3), [arg4] "{o3}" (arg4) - : "memory", "o1", "o2", "o3", "o4", "o5", "o7" + : "memory", "xcc", "o1", "o2", "o3", "o4", "o5", "o7" ); } @@ -90,7 +108,7 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, [arg3] "{o2}" (arg3), [arg4] "{o3}" (arg4), [arg5] "{o4}" (arg5), - : "memory", "o1", "o2", "o3", "o4", "o5", "o7" + : "memory", "xcc", "o1", "o2", "o3", "o4", "o5", "o7" ); } @@ -117,7 +135,7 @@ pub fn syscall6( [arg4] "{o3}" (arg4), [arg5] "{o4}" (arg5), [arg6] "{o5}" (arg6), - : "memory", "o1", "o2", "o3", "o4", "o5", "o7" + : "memory", "xcc", "o1", "o2", "o3", "o4", "o5", "o7" ); } @@ -130,6 +148,6 @@ pub fn restore_rt() callconv(.Naked) void { return asm volatile ("t 0x6d" : : [number] "{g1}" (@enumToInt(SYS.rt_sigreturn)) - : "memory", "o0", "o1", "o2", "o3", "o4", "o5", "o7" + : "memory", "xcc", "o0", "o1", "o2", "o3", "o4", "o5", "o7" ); } diff --git a/lib/std/target.zig b/lib/std/target.zig index 7fbac8a4be..798a90bbdf 100644 --- a/lib/std/target.zig +++ b/lib/std/target.zig @@ -761,6 +761,13 @@ pub const Target = struct { }; } + pub fn isSPARC(arch: Arch) bool { + return switch (arch) { + .sparcv8, .sparcv9 => true, + else => false, + }; + } + pub fn parseCpuModel(arch: Arch, cpu_name: []const u8) !*const Cpu.Model { for (arch.allCpuModels()) |cpu| { if (mem.eql(u8, cpu_name, cpu.name)) { -- cgit v1.2.3 From 238f253de95aef0afe6c245dbbf4ef75dc616cc2 Mon Sep 17 00:00:00 2001 From: Koakuma Date: Sat, 29 Aug 2020 22:11:48 +0700 Subject: Move comptime out --- lib/std/os/linux.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/std/os/linux.zig') diff --git a/lib/std/os/linux.zig b/lib/std/os/linux.zig index af4f127228..a17c99a6a9 100644 --- a/lib/std/os/linux.zig +++ b/lib/std/os/linux.zig @@ -381,7 +381,7 @@ pub fn faccessat(dirfd: i32, path: [*:0]const u8, mode: u32, flags: u32) usize { } pub fn pipe(fd: *[2]i32) usize { - if (comptime builtin.arch.isMIPS() || comptime builtin.arch.isSPARC()) { + if (comptime (builtin.arch.isMIPS() || builtin.arch.isSPARC())) { return syscall_pipe(fd); } else if (@hasField(SYS, "pipe")) { return syscall1(.pipe, @ptrToInt(fd)); -- cgit v1.2.3 From 73e62f22ecf25e58db343a45dfce35fccd8a4fa3 Mon Sep 17 00:00:00 2001 From: Koakuma Date: Sat, 24 Oct 2020 19:58:01 +0700 Subject: Fix sigaction(2) call on sparc64 --- lib/std/os/linux.zig | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'lib/std/os/linux.zig') diff --git a/lib/std/os/linux.zig b/lib/std/os/linux.zig index a17c99a6a9..bb8ce00efe 100644 --- a/lib/std/os/linux.zig +++ b/lib/std/os/linux.zig @@ -818,7 +818,12 @@ pub fn sigaction(sig: u6, noalias act: *const Sigaction, noalias oact: ?*Sigacti var ksa_old: k_sigaction = undefined; const ksa_mask_size = @sizeOf(@TypeOf(ksa_old.mask)); @memcpy(@ptrCast([*]u8, &ksa.mask), @ptrCast([*]const u8, &act.mask), ksa_mask_size); - const result = syscall4(.rt_sigaction, sig, @ptrToInt(&ksa), @ptrToInt(&ksa_old), ksa_mask_size); + const result = switch (builtin.arch) { + // The sparc version of rt_sigaction needs the restorer function to be passed as an argument too. + .sparc, .sparcv9 => syscall5(.rt_sigaction, sig, + @ptrToInt(&ksa), @ptrToInt(&ksa_old), @ptrToInt(ksa.restorer), ksa_mask_size), + else => syscall4(.rt_sigaction, sig, @ptrToInt(&ksa), @ptrToInt(&ksa_old), ksa_mask_size), + }; const err = getErrno(result); if (err != 0) { return result; -- cgit v1.2.3 From e7369ada936e6bf744ab8d119f6b3b435b0be8cd Mon Sep 17 00:00:00 2001 From: Koakuma Date: Sat, 24 Oct 2020 21:33:40 +0700 Subject: Fix boolean operator in if clause --- lib/std/os/linux.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/std/os/linux.zig') diff --git a/lib/std/os/linux.zig b/lib/std/os/linux.zig index bb8ce00efe..05543a9e3f 100644 --- a/lib/std/os/linux.zig +++ b/lib/std/os/linux.zig @@ -381,7 +381,7 @@ pub fn faccessat(dirfd: i32, path: [*:0]const u8, mode: u32, flags: u32) usize { } pub fn pipe(fd: *[2]i32) usize { - if (comptime (builtin.arch.isMIPS() || builtin.arch.isSPARC())) { + if (comptime (builtin.arch.isMIPS() or builtin.arch.isSPARC())) { return syscall_pipe(fd); } else if (@hasField(SYS, "pipe")) { return syscall1(.pipe, @ptrToInt(fd)); -- cgit v1.2.3 From 1d3abb761d49a88a3245220cb470e2621867442e Mon Sep 17 00:00:00 2001 From: Koakuma Date: Sun, 25 Oct 2020 13:37:03 +0700 Subject: "zig fmt" on lib/std/os/linux.zig --- lib/std/os/linux.zig | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) (limited to 'lib/std/os/linux.zig') diff --git a/lib/std/os/linux.zig b/lib/std/os/linux.zig index 05543a9e3f..765ed06cf3 100644 --- a/lib/std/os/linux.zig +++ b/lib/std/os/linux.zig @@ -820,8 +820,7 @@ pub fn sigaction(sig: u6, noalias act: *const Sigaction, noalias oact: ?*Sigacti @memcpy(@ptrCast([*]u8, &ksa.mask), @ptrCast([*]const u8, &act.mask), ksa_mask_size); const result = switch (builtin.arch) { // The sparc version of rt_sigaction needs the restorer function to be passed as an argument too. - .sparc, .sparcv9 => syscall5(.rt_sigaction, sig, - @ptrToInt(&ksa), @ptrToInt(&ksa_old), @ptrToInt(ksa.restorer), ksa_mask_size), + .sparc, .sparcv9 => syscall5(.rt_sigaction, sig, @ptrToInt(&ksa), @ptrToInt(&ksa_old), @ptrToInt(ksa.restorer), ksa_mask_size), else => syscall4(.rt_sigaction, sig, @ptrToInt(&ksa), @ptrToInt(&ksa_old), ksa_mask_size), }; const err = getErrno(result); @@ -1280,13 +1279,7 @@ pub fn setrlimit(resource: rlimit_resource, rlim: *const rlimit) usize { } pub fn prlimit(pid: pid_t, resource: rlimit_resource, new_limit: ?*const rlimit, old_limit: ?*rlimit) usize { - return syscall4( - .prlimit64, - @bitCast(usize, @as(isize, pid)), - @bitCast(usize, @as(isize, @enumToInt(resource))), - @ptrToInt(new_limit), - @ptrToInt(old_limit) - ); + return syscall4(.prlimit64, @bitCast(usize, @as(isize, pid)), @bitCast(usize, @as(isize, @enumToInt(resource))), @ptrToInt(new_limit), @ptrToInt(old_limit)); } test "" { -- cgit v1.2.3 From 3ce9428e3d617625227bf6b61cae0b4ded946bfe Mon Sep 17 00:00:00 2001 From: Koakuma Date: Sun, 25 Oct 2020 21:53:16 +0700 Subject: Various formatting fixes --- lib/std/os/linux.zig | 8 +++++++- lib/std/special/c.zig | 2 -- 2 files changed, 7 insertions(+), 3 deletions(-) (limited to 'lib/std/os/linux.zig') diff --git a/lib/std/os/linux.zig b/lib/std/os/linux.zig index 765ed06cf3..da17799566 100644 --- a/lib/std/os/linux.zig +++ b/lib/std/os/linux.zig @@ -1279,7 +1279,13 @@ pub fn setrlimit(resource: rlimit_resource, rlim: *const rlimit) usize { } pub fn prlimit(pid: pid_t, resource: rlimit_resource, new_limit: ?*const rlimit, old_limit: ?*rlimit) usize { - return syscall4(.prlimit64, @bitCast(usize, @as(isize, pid)), @bitCast(usize, @as(isize, @enumToInt(resource))), @ptrToInt(new_limit), @ptrToInt(old_limit)); + return syscall4( + .prlimit64, + @bitCast(usize, @as(isize, pid)), + @bitCast(usize, @as(isize, @enumToInt(resource))), + @ptrToInt(new_limit), + @ptrToInt(old_limit), + ); } test "" { diff --git a/lib/std/special/c.zig b/lib/std/special/c.zig index c50aa940d3..462dcb537f 100644 --- a/lib/std/special/c.zig +++ b/lib/std/special/c.zig @@ -528,10 +528,8 @@ fn clone() callconv(.Naked) void { ); }, .sparcv9 => { - // Implementation by @LemonBoy (https://github.com/LemonBoy) // __clone(func, stack, flags, arg, ptid, tls, ctid) // i0, i1, i2, i3, i4, i5, sp - // syscall(SYS_clone, flags, stack, ptid, tls, ctid) // g1 o0, o1, o2, o3, o4 asm volatile ( -- cgit v1.2.3