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 {...@@ -381,7 +381,7 @@ pub fn faccessat(dirfd: i32, path: [*:0]const u8, mode: u32, flags: u32) usize {
381}381}
382382
383pub fn pipe(fd: *[2]i32) usize {383pub fn pipe(fd: *[2]i32) usize {
384 if (comptime builtin.arch.isMIPS()) {384 if (comptime builtin.arch.isMIPS() || comptime builtin.arch.isSPARC()) {
385 return syscall_pipe(fd);385 return syscall_pipe(fd);
386 } else if (@hasField(SYS, "pipe")) {386 } else if (@hasField(SYS, "pipe")) {
387 return syscall1(.pipe, @ptrToInt(fd));387 return syscall1(.pipe, @ptrToInt(fd));
lib/std/os/linux/sparc64.zig+26-8
...@@ -1,5 +1,23 @@...@@ -1,5 +1,23 @@
1usingnamespace @import("../bits.zig");1usingnamespace @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
4pub fn syscall0(number: SYS) usize {22pub fn syscall0(number: SYS) usize {
5 return asm volatile (23 return asm volatile (
...@@ -10,7 +28,7 @@ pub fn syscall0(number: SYS) usize {...@@ -10,7 +28,7 @@ pub fn syscall0(number: SYS) usize {
10 \\ 1:28 \\ 1:
11 : [ret] "={o0}" (-> usize)29 : [ret] "={o0}" (-> usize)
12 : [number] "{g1}" (@enumToInt(number))30 : [number] "{g1}" (@enumToInt(number))
13 : "memory", "o1", "o2", "o3", "o4", "o5", "o7"31 : "memory", "xcc", "o1", "o2", "o3", "o4", "o5", "o7"
14 );32 );
15}33}
1634
...@@ -24,7 +42,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {...@@ -24,7 +42,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
24 : [ret] "={o0}" (-> usize)42 : [ret] "={o0}" (-> usize)
25 : [number] "{g1}" (@enumToInt(number)),43 : [number] "{g1}" (@enumToInt(number)),
26 [arg1] "{o0}" (arg1)44 [arg1] "{o0}" (arg1)
27 : "memory", "o1", "o2", "o3", "o4", "o5", "o7"45 : "memory", "xcc", "o1", "o2", "o3", "o4", "o5", "o7"
28 );46 );
29}47}
3048
...@@ -39,7 +57,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {...@@ -39,7 +57,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
39 : [number] "{g1}" (@enumToInt(number)),57 : [number] "{g1}" (@enumToInt(number)),
40 [arg1] "{o0}" (arg1),58 [arg1] "{o0}" (arg1),
41 [arg2] "{o1}" (arg2)59 [arg2] "{o1}" (arg2)
42 : "memory", "o1", "o2", "o3", "o4", "o5", "o7"60 : "memory", "xcc", "o1", "o2", "o3", "o4", "o5", "o7"
43 );61 );
44}62}
4563
...@@ -55,7 +73,7 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {...@@ -55,7 +73,7 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
55 [arg1] "{o0}" (arg1),73 [arg1] "{o0}" (arg1),
56 [arg2] "{o1}" (arg2),74 [arg2] "{o1}" (arg2),
57 [arg3] "{o2}" (arg3)75 [arg3] "{o2}" (arg3)
58 : "memory", "o1", "o2", "o3", "o4", "o5", "o7"76 : "memory", "xcc", "o1", "o2", "o3", "o4", "o5", "o7"
59 );77 );
60}78}
6179
...@@ -72,7 +90,7 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)...@@ -72,7 +90,7 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
72 [arg2] "{o1}" (arg2),90 [arg2] "{o1}" (arg2),
73 [arg3] "{o2}" (arg3),91 [arg3] "{o2}" (arg3),
74 [arg4] "{o3}" (arg4)92 [arg4] "{o3}" (arg4)
75 : "memory", "o1", "o2", "o3", "o4", "o5", "o7"93 : "memory", "xcc", "o1", "o2", "o3", "o4", "o5", "o7"
76 );94 );
77}95}
7896
...@@ -90,7 +108,7 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,...@@ -90,7 +108,7 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
90 [arg3] "{o2}" (arg3),108 [arg3] "{o2}" (arg3),
91 [arg4] "{o3}" (arg4),109 [arg4] "{o3}" (arg4),
92 [arg5] "{o4}" (arg5),110 [arg5] "{o4}" (arg5),
93 : "memory", "o1", "o2", "o3", "o4", "o5", "o7"111 : "memory", "xcc", "o1", "o2", "o3", "o4", "o5", "o7"
94 );112 );
95}113}
96114
...@@ -117,7 +135,7 @@ pub fn syscall6(...@@ -117,7 +135,7 @@ pub fn syscall6(
117 [arg4] "{o3}" (arg4),135 [arg4] "{o3}" (arg4),
118 [arg5] "{o4}" (arg5),136 [arg5] "{o4}" (arg5),
119 [arg6] "{o5}" (arg6),137 [arg6] "{o5}" (arg6),
120 : "memory", "o1", "o2", "o3", "o4", "o5", "o7"138 : "memory", "xcc", "o1", "o2", "o3", "o4", "o5", "o7"
121 );139 );
122}140}
123141
...@@ -130,6 +148,6 @@ pub fn restore_rt() callconv(.Naked) void {...@@ -130,6 +148,6 @@ pub fn restore_rt() callconv(.Naked) void {
130 return asm volatile ("t 0x6d"148 return asm volatile ("t 0x6d"
131 :149 :
132 : [number] "{g1}" (@enumToInt(SYS.rt_sigreturn))150 : [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"
134 );152 );
135}153}
lib/std/target.zig+7
...@@ -761,6 +761,13 @@ pub const Target = struct {...@@ -761,6 +761,13 @@ pub const Target = struct {
761 };761 };
762 }762 }
763763
764 pub fn isSPARC(arch: Arch) bool {
765 return switch (arch) {
766 .sparcv8, .sparcv9 => true,
767 else => false,
768 };
769 }
770
764 pub fn parseCpuModel(arch: Arch, cpu_name: []const u8) !*const Cpu.Model {771 pub fn parseCpuModel(arch: Arch, cpu_name: []const u8) !*const Cpu.Model {
765 for (arch.allCpuModels()) |cpu| {772 for (arch.allCpuModels()) |cpu| {
766 if (mem.eql(u8, cpu_name, cpu.name)) {773 if (mem.eql(u8, cpu_name, cpu.name)) {