authorgravatar for koachan@protonmail.comKoakuma <koachan@protonmail.com> 2020-08-28 21:42:26+07:00
committergravatar for koachan@protonmail.comKoakuma <koachan@protonmail.com> 2020-10-24 20:03:37+07:00
log6146f81c6e5bb96f834a02dfd9cbadbe6e48e982
tree5cdb44e512a7b616c0dfaaa7633ba00426e839b4
parentdba009fd21f76759e41158909b558a7f9955daa0

Add pipe(2) support


3 files changed, 34 insertions(+), 9 deletions(-)

lib/std/os/linux.zig+1-1
......@@ -381,7 +381,7 @@ pub fn faccessat(dirfd: i32, path: [*:0]const u8, mode: u32, flags: u32) usize {
381381}
382382
383383pub fn pipe(fd: *[2]i32) usize {
384 if (comptime builtin.arch.isMIPS()) {
384 if (comptime builtin.arch.isMIPS() || comptime builtin.arch.isSPARC()) {
385385 return syscall_pipe(fd);
386386 } else if (@hasField(SYS, "pipe")) {
387387 return syscall1(.pipe, @ptrToInt(fd));
lib/std/os/linux/sparc64.zig+26-8
......@@ -1,5 +1,23 @@
11usingnamespace @import("../bits.zig");
22
3pub fn syscall_pipe(fd: *[2]i32) usize {
4 return asm volatile (
5 \\ mov %%o0, %%o2
6 \\ t 0x6d
7 \\ bcc %%xcc, 1f
8 \\ nop
9 \\ ba 2f
10 \\ neg %%o0
11 \\ 1:
12 \\ st %%o0, [%%o2]
13 \\ st %%o1, [%%o2 + 4]
14 \\ clr %%o0
15 \\ 2:
16 : [ret] "={o0}" (-> usize)
17 : [number] "{$2}" (@enumToInt(SYS.pipe))
18 : "memory", "xcc", "o1", "o2", "o3", "o4", "o5", "o7"
19 );
20}
321
422pub fn syscall0(number: SYS) usize {
523 return asm volatile (
......@@ -10,7 +28,7 @@ pub fn syscall0(number: SYS) usize {
1028 \\ 1:
1129 : [ret] "={o0}" (-> usize)
1230 : [number] "{g1}" (@enumToInt(number))
13 : "memory", "o1", "o2", "o3", "o4", "o5", "o7"
31 : "memory", "xcc", "o1", "o2", "o3", "o4", "o5", "o7"
1432 );
1533}
1634
......@@ -24,7 +42,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
2442 : [ret] "={o0}" (-> usize)
2543 : [number] "{g1}" (@enumToInt(number)),
2644 [arg1] "{o0}" (arg1)
27 : "memory", "o1", "o2", "o3", "o4", "o5", "o7"
45 : "memory", "xcc", "o1", "o2", "o3", "o4", "o5", "o7"
2846 );
2947}
3048
......@@ -39,7 +57,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
3957 : [number] "{g1}" (@enumToInt(number)),
4058 [arg1] "{o0}" (arg1),
4159 [arg2] "{o1}" (arg2)
42 : "memory", "o1", "o2", "o3", "o4", "o5", "o7"
60 : "memory", "xcc", "o1", "o2", "o3", "o4", "o5", "o7"
4361 );
4462}
4563
......@@ -55,7 +73,7 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
5573 [arg1] "{o0}" (arg1),
5674 [arg2] "{o1}" (arg2),
5775 [arg3] "{o2}" (arg3)
58 : "memory", "o1", "o2", "o3", "o4", "o5", "o7"
76 : "memory", "xcc", "o1", "o2", "o3", "o4", "o5", "o7"
5977 );
6078}
6179
......@@ -72,7 +90,7 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
7290 [arg2] "{o1}" (arg2),
7391 [arg3] "{o2}" (arg3),
7492 [arg4] "{o3}" (arg4)
75 : "memory", "o1", "o2", "o3", "o4", "o5", "o7"
93 : "memory", "xcc", "o1", "o2", "o3", "o4", "o5", "o7"
7694 );
7795}
7896
......@@ -90,7 +108,7 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
90108 [arg3] "{o2}" (arg3),
91109 [arg4] "{o3}" (arg4),
92110 [arg5] "{o4}" (arg5),
93 : "memory", "o1", "o2", "o3", "o4", "o5", "o7"
111 : "memory", "xcc", "o1", "o2", "o3", "o4", "o5", "o7"
94112 );
95113}
96114
......@@ -117,7 +135,7 @@ pub fn syscall6(
117135 [arg4] "{o3}" (arg4),
118136 [arg5] "{o4}" (arg5),
119137 [arg6] "{o5}" (arg6),
120 : "memory", "o1", "o2", "o3", "o4", "o5", "o7"
138 : "memory", "xcc", "o1", "o2", "o3", "o4", "o5", "o7"
121139 );
122140}
123141
......@@ -130,6 +148,6 @@ pub fn restore_rt() callconv(.Naked) void {
130148 return asm volatile ("t 0x6d"
131149 :
132150 : [number] "{g1}" (@enumToInt(SYS.rt_sigreturn))
133 : "memory", "o0", "o1", "o2", "o3", "o4", "o5", "o7"
151 : "memory", "xcc", "o0", "o1", "o2", "o3", "o4", "o5", "o7"
134152 );
135153}
lib/std/target.zig+7
......@@ -761,6 +761,13 @@ pub const Target = struct {
761761 };
762762 }
763763
764 pub fn isSPARC(arch: Arch) bool {
765 return switch (arch) {
766 .sparcv8, .sparcv9 => true,
767 else => false,
768 };
769 }
770
764771 pub fn parseCpuModel(arch: Arch, cpu_name: []const u8) !*const Cpu.Model {
765772 for (arch.allCpuModels()) |cpu| {
766773 if (mem.eql(u8, cpu_name, cpu.name)) {