diff --git a/lib/std/os/linux.zig b/lib/std/os/linux.zig index e813519c68..46aeb28f2f 100644 --- a/lib/std/os/linux.zig +++ b/lib/std/os/linux.zig @@ -328,7 +328,9 @@ pub fn faccessat(dirfd: i32, path: [*]const u8, mode: u32, flags: u32) usize { } pub fn pipe(fd: *[2]i32) usize { - if (@hasDecl(@This(), "SYS_pipe")) { + if (builtin.arch == .mipsel) { + return syscall_pipe(fd); + } else if (@hasDecl(@This(), "SYS_pipe")) { return syscall1(SYS_pipe, @ptrToInt(fd)); } else { return syscall2(SYS_pipe2, @ptrToInt(fd), 0); diff --git a/lib/std/os/linux/mipsel.zig b/lib/std/os/linux/mipsel.zig index b9a3120096..791bec6a12 100644 --- a/lib/std/os/linux/mipsel.zig +++ b/lib/std/os/linux/mipsel.zig @@ -12,6 +12,25 @@ pub fn syscall0(number: usize) usize { ); } +pub fn syscall_pipe(fd: *[2]i32) usize { + return asm volatile ( + \\ .set noat + \\ .set noreorder + \\ syscall + \\ blez $7, 1f + \\ nop + \\ b 2f + \\ subu $2, $0, $2 + \\ 1: + \\ sw $2, 0($4) + \\ sw $3, 4($4) + \\ 2: + : [ret] "={$2}" (-> usize) + : [number] "{$2}" (usize(SYS_pipe)) + : "memory", "cc", "$7" + ); +} + pub fn syscall1(number: usize, arg1: usize) usize { return asm volatile ( \\ syscall diff --git a/lib/std/os/test.zig b/lib/std/os/test.zig index d886597a38..4ca843cf68 100644 --- a/lib/std/os/test.zig +++ b/lib/std/os/test.zig @@ -219,3 +219,16 @@ test "gethostname" { const hostname = try os.gethostname(&buf); expect(hostname.len != 0); } + +test "pipe" { + if (os.windows.is_the_target) + return error.SkipZigTest; + + var fds = try os.pipe(); + try os.write(fds[1], "hello"); + var buf: [16]u8 = undefined; + expect((try os.read(fds[0], buf[0..])) == 5); + testing.expectEqualSlices(u8, buf[0..5], "hello"); + os.close(fds[1]); + os.close(fds[0]); +}