From 50c37c75d1208bb8a0bf5b2792e4a1d69d6f7110 Mon Sep 17 00:00:00 2001 From: Robin Voetter Date: Wed, 28 Aug 2019 17:41:49 +0200 Subject: add arm32 syscall conventions --- std/os/linux.zig | 1 + 1 file changed, 1 insertion(+) (limited to 'std/os/linux.zig') diff --git a/std/os/linux.zig b/std/os/linux.zig index 053f30d265..ba679387dd 100644 --- a/std/os/linux.zig +++ b/std/os/linux.zig @@ -17,6 +17,7 @@ pub const is_the_target = builtin.os == .linux; pub usingnamespace switch (builtin.arch) { .x86_64 => @import("linux/x86_64.zig"), .aarch64 => @import("linux/arm64.zig"), + .arm => @import("linux/arm-eabi.zig"), else => struct {}, }; pub usingnamespace @import("bits.zig"); -- cgit v1.2.3 From 57de61084e1a805838243e5428e774a591197454 Mon Sep 17 00:00:00 2001 From: Robin Voetter Date: Thu, 29 Aug 2019 00:55:22 +0200 Subject: Make mmap use SYS_mmap2 if it exists --- std/os/bits/linux/arm-eabi.zig | 2 ++ std/os/linux.zig | 6 +++++- 2 files changed, 7 insertions(+), 1 deletion(-) (limited to 'std/os/linux.zig') diff --git a/std/os/bits/linux/arm-eabi.zig b/std/os/bits/linux/arm-eabi.zig index 956e40a2ce..1b45588459 100644 --- a/std/os/bits/linux/arm-eabi.zig +++ b/std/os/bits/linux/arm-eabi.zig @@ -397,6 +397,8 @@ pub const SYS_usr32 = 0x0f0004; pub const SYS_set_tls = 0x0f0005; pub const SYS_get_tls = 0x0f0006; +pub const MMAP2_UNIT = 4096; + pub const O_CREAT = 0o100; pub const O_EXCL = 0o200; pub const O_NOCTTY = 0o400; diff --git a/std/os/linux.zig b/std/os/linux.zig index ba679387dd..7d019001ef 100644 --- a/std/os/linux.zig +++ b/std/os/linux.zig @@ -190,7 +190,11 @@ pub fn umount2(special: [*]const u8, flags: u32) usize { } pub fn mmap(address: ?[*]u8, length: usize, prot: usize, flags: u32, fd: i32, offset: isize) usize { - return syscall6(SYS_mmap, @ptrToInt(address), length, prot, flags, @bitCast(usize, isize(fd)), @bitCast(usize, offset)); + if (@hasDecl(@This(), "SYS_mmap2")) { + return syscall6(SYS_mmap2, @ptrToInt(address), length, prot, flags, @bitCast(usize, isize(fd)), @bitCast(usize, @divTrunc(offset, MMAP2_UNIT))); + } else { + return syscall6(SYS_mmap, @ptrToInt(address), length, prot, flags, @bitCast(usize, isize(fd)), @bitCast(usize, offset)); + } } pub fn mprotect(address: [*]const u8, length: usize, protection: usize) usize { -- cgit v1.2.3 From 108a51b11032ba3ed7864a653f87283853e6e318 Mon Sep 17 00:00:00 2001 From: Robin Voetter Date: Thu, 29 Aug 2019 10:34:05 +0200 Subject: fix issues with debug.zig - Use sys_*stat*64 instead of sys_*stat* where appropriate - Fix overflow when calculating atime, ctime and mtime on File.stat() - Fix compilation error casting getEndPos to usize. --- std/debug.zig | 2 +- std/fs/file.zig | 6 +++--- std/os/bits/linux/arm-eabi.zig | 4 ++-- std/os/linux.zig | 24 ++++++++++++++++++++---- 4 files changed, 26 insertions(+), 10 deletions(-) (limited to 'std/os/linux.zig') diff --git a/std/debug.zig b/std/debug.zig index d1c17343ef..a6ef60b663 100644 --- a/std/debug.zig +++ b/std/debug.zig @@ -1053,7 +1053,7 @@ fn openSelfDebugInfoPosix(allocator: *mem.Allocator) !DwarfInfo { S.self_exe_file = try fs.openSelfExe(); errdefer S.self_exe_file.close(); - const self_exe_mmap_len = mem.alignForward(try S.self_exe_file.getEndPos(), mem.page_size); + const self_exe_mmap_len = mem.alignForward(@intCast(usize, try S.self_exe_file.getEndPos()), mem.page_size); const self_exe_mmap = try os.mmap( null, self_exe_mmap_len, diff --git a/std/fs/file.zig b/std/fs/file.zig index 0014693d40..83cbe23780 100644 --- a/std/fs/file.zig +++ b/std/fs/file.zig @@ -261,9 +261,9 @@ pub const File = struct { return Stat{ .size = @bitCast(u64, st.size), .mode = st.mode, - .atime = atime.tv_sec * std.time.ns_per_s + atime.tv_nsec, - .mtime = mtime.tv_sec * std.time.ns_per_s + mtime.tv_nsec, - .ctime = ctime.tv_sec * std.time.ns_per_s + ctime.tv_nsec, + .atime = @intCast(i64, atime.tv_sec) * std.time.ns_per_s + atime.tv_nsec, + .mtime = @intCast(i64, mtime.tv_sec) * std.time.ns_per_s + mtime.tv_nsec, + .ctime = @intCast(i64, ctime.tv_sec) * std.time.ns_per_s + ctime.tv_nsec, }; } diff --git a/std/os/bits/linux/arm-eabi.zig b/std/os/bits/linux/arm-eabi.zig index 1b45588459..5048a2afc7 100644 --- a/std/os/bits/linux/arm-eabi.zig +++ b/std/os/bits/linux/arm-eabi.zig @@ -502,7 +502,7 @@ pub const msghdr_const = extern struct { /// methods to accomplish this. pub const Stat = extern struct { dev: u64, - __dev_patting: u32, + __dev_padding: u32, __ino_truncated: u32, mode: u32, nlink: u32, @@ -512,7 +512,7 @@ pub const Stat = extern struct { __rdev_padding: u32, size: i64, blksize: i32, - blocks: i64, + blocks: u64, atim: timespec, mtim: timespec, ctim: timespec, diff --git a/std/os/linux.zig b/std/os/linux.zig index 7d019001ef..3134ebf641 100644 --- a/std/os/linux.zig +++ b/std/os/linux.zig @@ -713,22 +713,38 @@ pub fn accept4(fd: i32, noalias addr: *sockaddr, noalias len: *socklen_t, flags: } pub fn fstat(fd: i32, stat_buf: *Stat) usize { - return syscall2(SYS_fstat, @bitCast(usize, isize(fd)), @ptrToInt(stat_buf)); + if (@hasDecl(@This(), "SYS_fstat64")) { + return syscall2(SYS_fstat64, @bitCast(usize, isize(fd)), @ptrToInt(stat_buf)); + } else { + return syscall2(SYS_fstat, @bitCast(usize, isize(fd)), @ptrToInt(stat_buf)); + } } // TODO https://github.com/ziglang/zig/issues/265 pub fn stat(pathname: [*]const u8, statbuf: *Stat) usize { - return syscall2(SYS_stat, @ptrToInt(pathname), @ptrToInt(statbuf)); + if (@hasDecl(@This(), "SYS_stat64")) { + return syscall2(SYS_stat64, @ptrToInt(pathname), @ptrToInt(statbuf)); + } else { + return syscall2(SYS_stat, @ptrToInt(pathname), @ptrToInt(statbuf)); + } } // TODO https://github.com/ziglang/zig/issues/265 pub fn lstat(pathname: [*]const u8, statbuf: *Stat) usize { - return syscall2(SYS_lstat, @ptrToInt(pathname), @ptrToInt(statbuf)); + if (@hasDecl(@This(), "SYS_lstat64")) { + return syscall2(SYS_lstat64, @ptrToInt(pathname), @ptrToInt(statbuf)); + } else { + return syscall2(SYS_lstat, @ptrToInt(pathname), @ptrToInt(statbuf)); + } } // TODO https://github.com/ziglang/zig/issues/265 pub fn fstatat(dirfd: i32, path: [*]const u8, stat_buf: *Stat, flags: u32) usize { - return syscall4(SYS_fstatat, @bitCast(usize, isize(dirfd)), @ptrToInt(path), @ptrToInt(stat_buf), flags); + if (@hasDecl(@This(), "SYS_fstatat64")) { + return syscall4(SYS_fstatat64, @bitCast(usize, isize(dirfd)), @ptrToInt(path), @ptrToInt(stat_buf), flags); + } else { + return syscall4(SYS_fstatat, @bitCast(usize, isize(dirfd)), @ptrToInt(path), @ptrToInt(stat_buf), flags); + } } // TODO https://github.com/ziglang/zig/issues/265 -- cgit v1.2.3 From e39c93a2f346e4bfb2653ccf231d736dfb9bce6e Mon Sep 17 00:00:00 2001 From: Robin Voetter Date: Sun, 1 Sep 2019 11:54:57 +0200 Subject: Replace legacy 16-bit syscalls with 32-bit versions when appropriate --- std/os/linux.zig | 84 ++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 70 insertions(+), 14 deletions(-) (limited to 'std/os/linux.zig') diff --git a/std/os/linux.zig b/std/os/linux.zig index 3134ebf641..e24ba441cc 100644 --- a/std/os/linux.zig +++ b/std/os/linux.zig @@ -486,35 +486,67 @@ pub fn nanosleep(req: *const timespec, rem: ?*timespec) usize { } pub fn setuid(uid: u32) usize { - return syscall1(SYS_setuid, uid); + if (@hasDecl(@This(), "SYS_setuid32")) { + return syscall1(SYS_setuid32, uid); + } else { + return syscall1(SYS_setuid, uid); + } } pub fn setgid(gid: u32) usize { - return syscall1(SYS_setgid, gid); + if (@hasDecl(@This(), "SYS_setgid32")) { + return syscall1(SYS_setgid32, gid); + } else { + return syscall1(SYS_setgid, gid); + } } pub fn setreuid(ruid: u32, euid: u32) usize { - return syscall2(SYS_setreuid, ruid, euid); + if (@hasDecl(@This(), "SYS_setreuid32")) { + return syscall2(SYS_setreuid32, ruid, euid)); + } else { + return syscall2(SYS_setreuid, ruid, euid)); + } } pub fn setregid(rgid: u32, egid: u32) usize { - return syscall2(SYS_setregid, rgid, egid); + if (@hasDecl(@This(), "SYS_setregid32")) { + return syscall2(SYS_setregid32, rgid, egid); + } else { + return syscall2(SYS_setregid, rgid, egid); + } } pub fn getuid() u32 { - return u32(syscall0(SYS_getuid)); + if (@hasDecl(@This(), "SYS_getuid32")) { + return u32(syscall0(SYS_getuid32)); + } else { + return u32(syscall0(SYS_getuid)); + } } pub fn getgid() u32 { - return u32(syscall0(SYS_getgid)); + if (@hasDecl(@This(), "SYS_getgid32")) { + return u32(syscall0(SYS_getgid32)); + } else { + return u32(syscall0(SYS_getgid)); + } } pub fn geteuid() u32 { - return u32(syscall0(SYS_geteuid)); + if (@hasDecl(@This(), "SYS_geteuid32")) { + return u32(syscall0(SYS_geteuid32)); + } else { + return u32(syscall0(SYS_geteuid)); + } } pub fn getegid() u32 { - return u32(syscall0(SYS_getegid)); + if (@hasDecl(@This(), "SYS_getegid32")) { + return u32(syscall0(SYS_getegid32)); + } else { + return u32(syscall0(SYS_getegid)); + } } pub fn seteuid(euid: u32) usize { @@ -526,27 +558,51 @@ pub fn setegid(egid: u32) usize { } pub fn getresuid(ruid: *u32, euid: *u32, suid: *u32) usize { - return syscall3(SYS_getresuid, @ptrToInt(ruid), @ptrToInt(euid), @ptrToInt(suid)); + if (@hasDecl(@This(), "SYS_getresuid32")) { + return syscall3(SYS_getresuid32, @ptrToInt(ruid), @ptrToInt(euid), @ptrToInt(suid)); + } else { + return syscall3(SYS_getresuid, @ptrToInt(ruid), @ptrToInt(euid), @ptrToInt(suid)); + } } pub fn getresgid(rgid: *u32, egid: *u32, sgid: *u32) usize { - return syscall3(SYS_getresgid, @ptrToInt(rgid), @ptrToInt(egid), @ptrToInt(sgid)); + if (@hasDecl(@This(), "SYS_getresgid32")) { + return syscall3(SYS_getresgid32, @ptrToInt(rgid), @ptrToInt(egid), @ptrToInt(sgid)); + } else { + return syscall3(SYS_getresgid, @ptrToInt(rgid), @ptrToInt(egid), @ptrToInt(sgid)); + } } pub fn setresuid(ruid: u32, euid: u32, suid: u32) usize { - return syscall3(SYS_setresuid, ruid, euid, suid); + if (@hasDecl(@This(), "SYS_setresuid32")) { + return syscall3(SYS_setresuid32, ruid, euid, suid); + } else { + return syscall3(SYS_setresuid, ruid, euid, suid); + } } pub fn setresgid(rgid: u32, egid: u32, sgid: u32) usize { - return syscall3(SYS_setresgid, rgid, egid, sgid); + if (@hasDecl(@This(), "SYS_setresgid32")) { + return syscall3(SYS_setresgid32, rgid, egid, sgid); + } else { + return syscall3(SYS_setresgid, rgid, egid, sgid); + } } pub fn getgroups(size: usize, list: *u32) usize { - return syscall2(SYS_getgroups, size, @ptrToInt(list)); + if (@hasDecl(@This(), "SYS_getgroups32")) { + return syscall2(SYS_getgroups32, size, @ptrToInt(list)); + } else { + return syscall2(SYS_getgroups, size, @ptrToInt(list)); + } } pub fn setgroups(size: usize, list: *const u32) usize { - return syscall2(SYS_setgroups, size, @ptrToInt(list)); + if (@hasDecl(@This(), "SYS_setgroups32")) { + return syscall2(SYS_setgroups32, size, @ptrToInt(list)); + } else { + return syscall2(SYS_setgroups, size, @ptrToInt(list)); + } } pub fn getpid() i32 { -- cgit v1.2.3 From e9d795b025e55dcd9d8c4378141b996358634863 Mon Sep 17 00:00:00 2001 From: Robin Voetter Date: Sun, 1 Sep 2019 12:08:02 +0200 Subject: Fix up seteuid and setegid --- std/os/linux.zig | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'std/os/linux.zig') diff --git a/std/os/linux.zig b/std/os/linux.zig index e24ba441cc..7bb59dde41 100644 --- a/std/os/linux.zig +++ b/std/os/linux.zig @@ -550,11 +550,11 @@ pub fn getegid() u32 { } pub fn seteuid(euid: u32) usize { - return syscall1(SYS_seteuid, euid); + return setreuid(std.math.maxInt(u32), euid); } pub fn setegid(egid: u32) usize { - return syscall1(SYS_setegid, egid); + return setregid(std.math.maxInt(u32), egid); } pub fn getresuid(ruid: *u32, euid: *u32, suid: *u32) usize { -- cgit v1.2.3 From e7912dee9bd63b03415f441b4de9b3babc79c859 Mon Sep 17 00:00:00 2001 From: Robin Voetter Date: Sun, 1 Sep 2019 16:10:36 +0200 Subject: Fix up preadv, preadv2, pwritev and pwritev2 --- std/os/linux.zig | 42 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 36 insertions(+), 6 deletions(-) (limited to 'std/os/linux.zig') diff --git a/std/os/linux.zig b/std/os/linux.zig index 7bb59dde41..58c402f829 100644 --- a/std/os/linux.zig +++ b/std/os/linux.zig @@ -210,11 +210,26 @@ pub fn read(fd: i32, buf: [*]u8, count: usize) usize { } pub fn preadv(fd: i32, iov: [*]const iovec, count: usize, offset: u64) usize { - return syscall4(SYS_preadv, @bitCast(usize, isize(fd)), @ptrToInt(iov), count, offset); + return syscall5( + SYS_preadv, + @bitCast(usize, isize(fd)), + @ptrToInt(iov), + count, + @truncate(usize, offset), + @truncate(usize, offset >> 32), + ); } pub fn preadv2(fd: i32, iov: [*]const iovec, count: usize, offset: u64, flags: kernel_rwf) usize { - return syscall5(SYS_preadv2, @bitCast(usize, isize(fd)), @ptrToInt(iov), count, offset, flags); + return syscall6( + SYS_preadv2, + @bitCast(usize, isize(fd)), + @ptrToInt(iov), + count, + @truncate(usize, offset), + @truncate(usize, offset >> 32), + flags + ); } pub fn readv(fd: i32, iov: [*]const iovec, count: usize) usize { @@ -226,11 +241,26 @@ pub fn writev(fd: i32, iov: [*]const iovec_const, count: usize) usize { } pub fn pwritev(fd: i32, iov: [*]const iovec_const, count: usize, offset: u64) usize { - return syscall4(SYS_pwritev, @bitCast(usize, isize(fd)), @ptrToInt(iov), count, offset); + return syscall5( + SYS_pwritev, + @bitCast(usize, isize(fd)), + @ptrToInt(iov), + count, + @truncate(usize, offset), + @truncate(usize, offset >> 32), + ); } pub fn pwritev2(fd: i32, iov: [*]const iovec_const, count: usize, offset: u64, flags: kernel_rwf) usize { - return syscall5(SYS_pwritev2, @bitCast(usize, isize(fd)), @ptrToInt(iov), count, offset, flags); + return syscall6( + SYS_pwritev2, + @bitCast(usize, isize(fd)), + @ptrToInt(iov), + count, + @truncate(usize, offset), + @truncate(usize, offset >> 32), + flags + ); } // TODO https://github.com/ziglang/zig/issues/265 @@ -503,9 +533,9 @@ pub fn setgid(gid: u32) usize { pub fn setreuid(ruid: u32, euid: u32) usize { if (@hasDecl(@This(), "SYS_setreuid32")) { - return syscall2(SYS_setreuid32, ruid, euid)); + return syscall2(SYS_setreuid32, ruid, euid); } else { - return syscall2(SYS_setreuid, ruid, euid)); + return syscall2(SYS_setreuid, ruid, euid); } } -- cgit v1.2.3