From bcf41c859430301fe8117514b90e2610ae107276 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Fri, 16 Aug 2024 11:07:48 +0200 Subject: [PATCH 01/10] std.os.linux: Fix E definition for mips64. --- lib/std/os/linux.zig | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/std/os/linux.zig b/lib/std/os/linux.zig index 54ad53fe06..78a938fcc5 100644 --- a/lib/std/os/linux.zig +++ b/lib/std/os/linux.zig @@ -2272,7 +2272,7 @@ pub fn fadvise(fd: fd_t, offset: i64, len: i64, advice: usize) usize { length_halves[0], length_halves[1], ); - } else if (comptime native_arch == .mips or native_arch == .mipsel) { + } else if (native_arch.isMIPS32()) { // MIPS O32 does not deal with the register alignment issue, so pass a dummy value. const offset_halves = splitValue64(offset); @@ -2382,7 +2382,7 @@ pub fn map_shadow_stack(addr: u64, size: u64, flags: u32) usize { } pub const E = switch (native_arch) { - .mips, .mipsel => enum(u16) { + .mips, .mipsel, .mips64, .mips64el => enum(u16) { /// No error occurred. SUCCESS = 0, From d4973c992203ed6fb761d3f3b871dd9849541b5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Fri, 16 Aug 2024 11:09:52 +0200 Subject: [PATCH 02/10] std.os.linux: Fix syscall errno value handling for mips. The kernel sets r7 to 0 (success) or -1 (error), and stores the result in r2. When r7 is -1 and the result is positive, it needs to be negated to get the errno value that higher-level code, such as errnoFromSyscall(), expects to see. The old code was missing the check that r2 is positive, but was also doing the r7 check incorrectly; since it can only be set to 0 or -1, the blez instruction would always branch. In practice, this fix is necessary for e.g. the ENOSYS error to be interpreted correctly. This manifested as hitting an unreachable branch when calling process_vm_readv() in std.debug.MemoryAccessor. --- lib/std/os/linux/mips.zig | 26 +++++++++++++++++--------- lib/std/os/linux/mips64.zig | 27 ++++++++++++++++++--------- 2 files changed, 35 insertions(+), 18 deletions(-) diff --git a/lib/std/os/linux/mips.zig b/lib/std/os/linux/mips.zig index aa02841926..5fe5337f22 100644 --- a/lib/std/os/linux/mips.zig +++ b/lib/std/os/linux/mips.zig @@ -14,7 +14,8 @@ const timespec = linux.timespec; pub fn syscall0(number: SYS) usize { return asm volatile ( \\ syscall - \\ blez $7, 1f + \\ beq $7, $zero, 1f + \\ blez $2, 1f \\ subu $2, $0, $2 \\ 1: : [ret] "={$2}" (-> usize), @@ -28,7 +29,7 @@ pub fn syscall_pipe(fd: *[2]i32) usize { \\ .set noat \\ .set noreorder \\ syscall - \\ blez $7, 1f + \\ beq $7, $zero, 1f \\ nop \\ b 2f \\ subu $2, $0, $2 @@ -46,7 +47,8 @@ pub fn syscall_pipe(fd: *[2]i32) usize { pub fn syscall1(number: SYS, arg1: usize) usize { return asm volatile ( \\ syscall - \\ blez $7, 1f + \\ beq $7, $zero, 1f + \\ blez $2, 1f \\ subu $2, $0, $2 \\ 1: : [ret] "={$2}" (-> usize), @@ -59,7 +61,8 @@ pub fn syscall1(number: SYS, arg1: usize) usize { pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize { return asm volatile ( \\ syscall - \\ blez $7, 1f + \\ beq $7, $zero, 1f + \\ blez $2, 1f \\ subu $2, $0, $2 \\ 1: : [ret] "={$2}" (-> usize), @@ -73,7 +76,8 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize { pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize { return asm volatile ( \\ syscall - \\ blez $7, 1f + \\ beq $7, $zero, 1f + \\ blez $2, 1f \\ subu $2, $0, $2 \\ 1: : [ret] "={$2}" (-> usize), @@ -88,7 +92,8 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize { pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize { return asm volatile ( \\ syscall - \\ blez $7, 1f + \\ beq $7, $zero, 1f + \\ blez $2, 1f \\ subu $2, $0, $2 \\ 1: : [ret] "={$2}" (-> usize), @@ -108,7 +113,8 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, \\ sw %[arg5], 16($sp) \\ syscall \\ addu $sp, $sp, 24 - \\ blez $7, 1f + \\ beq $7, $zero, 1f + \\ blez $2, 1f \\ subu $2, $0, $2 \\ 1: : [ret] "={$2}" (-> usize), @@ -141,7 +147,8 @@ pub fn syscall6( \\ sw %[arg6], 20($sp) \\ syscall \\ addu $sp, $sp, 24 - \\ blez $7, 1f + \\ beq $7, $zero, 1f + \\ blez $2, 1f \\ subu $2, $0, $2 \\ 1: : [ret] "={$2}" (-> usize), @@ -174,7 +181,8 @@ pub fn syscall7( \\ sw %[arg7], 24($sp) \\ syscall \\ addu $sp, $sp, 32 - \\ blez $7, 1f + \\ beq $7, $zero, 1f + \\ blez $2, 1f \\ subu $2, $0, $2 \\ 1: : [ret] "={$2}" (-> usize), diff --git a/lib/std/os/linux/mips64.zig b/lib/std/os/linux/mips64.zig index 579d41ca75..068e15d8db 100644 --- a/lib/std/os/linux/mips64.zig +++ b/lib/std/os/linux/mips64.zig @@ -14,7 +14,8 @@ const timespec = linux.timespec; pub fn syscall0(number: SYS) usize { return asm volatile ( \\ syscall - \\ blez $7, 1f + \\ beq $7, $zero, 1f + \\ blez $2, 1f \\ dsubu $2, $0, $2 \\ 1: : [ret] "={$2}" (-> usize), @@ -28,7 +29,7 @@ pub fn syscall_pipe(fd: *[2]i32) usize { \\ .set noat \\ .set noreorder \\ syscall - \\ blez $7, 1f + \\ beq $7, $zero, 1f \\ nop \\ b 2f \\ subu $2, $0, $2 @@ -46,7 +47,9 @@ pub fn syscall_pipe(fd: *[2]i32) usize { pub fn syscall1(number: SYS, arg1: usize) usize { return asm volatile ( \\ syscall - \\ blez $7, 1f + \\ beq $7, $zero, 1f + \\ blez $2, 1f + \\ nop \\ dsubu $2, $0, $2 \\ 1: : [ret] "={$2}" (-> usize), @@ -59,7 +62,8 @@ pub fn syscall1(number: SYS, arg1: usize) usize { pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize { return asm volatile ( \\ syscall - \\ blez $7, 1f + \\ beq $7, $zero, 1f + \\ blez $2, 1f \\ dsubu $2, $0, $2 \\ 1: : [ret] "={$2}" (-> usize), @@ -73,7 +77,8 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize { pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize { return asm volatile ( \\ syscall - \\ blez $7, 1f + \\ beq $7, $zero, 1f + \\ blez $2, 1f \\ dsubu $2, $0, $2 \\ 1: : [ret] "={$2}" (-> usize), @@ -88,7 +93,8 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize { pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize { return asm volatile ( \\ syscall - \\ blez $7, 1f + \\ beq $7, $zero, 1f + \\ blez $2, 1f \\ dsubu $2, $0, $2 \\ 1: : [ret] "={$2}" (-> usize), @@ -104,7 +110,8 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize { return asm volatile ( \\ syscall - \\ blez $7, 1f + \\ beq $7, $zero, 1f + \\ blez $2, 1f \\ dsubu $2, $0, $2 \\ 1: : [ret] "={$2}" (-> usize), @@ -129,7 +136,8 @@ pub fn syscall6( ) usize { return asm volatile ( \\ syscall - \\ blez $7, 1f + \\ beq $7, $zero, 1f + \\ blez $2, 1f \\ dsubu $2, $0, $2 \\ 1: : [ret] "={$2}" (-> usize), @@ -156,7 +164,8 @@ pub fn syscall7( ) usize { return asm volatile ( \\ syscall - \\ blez $7, 1f + \\ beq $7, $zero, 1f + \\ blez $2, 1f \\ dsubu $2, $0, $2 \\ 1: : [ret] "={$2}" (-> usize), From ed9a502dffa8db45ef2f73edcbd20c52e26c548f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Fri, 16 Aug 2024 11:08:56 +0200 Subject: [PATCH 03/10] std.os.linux: Fix rlimit_resource for mips64; move out of arch bits. It is usually generic, so no point having it in arch bits. --- lib/std/os/linux.zig | 205 +++++++++++++++++++++++++++-------- lib/std/os/linux/mips.zig | 60 ---------- lib/std/os/linux/mips64.zig | 60 ---------- lib/std/os/linux/sparc64.zig | 60 ---------- 4 files changed, 159 insertions(+), 226 deletions(-) diff --git a/lib/std/os/linux.zig b/lib/std/os/linux.zig index 78a938fcc5..903ce29c8d 100644 --- a/lib/std/os/linux.zig +++ b/lib/std/os/linux.zig @@ -6817,53 +6817,166 @@ pub const ifreq = extern struct { }; // doc comments copied from musl -pub const rlimit_resource = if (native_arch.isMIPS() or native_arch.isSPARC()) - arch_bits.rlimit_resource -else - enum(c_int) { - /// Per-process CPU limit, in seconds. - CPU, - /// Largest file that can be created, in bytes. - FSIZE, - /// Maximum size of data segment, in bytes. - DATA, - /// Maximum size of stack segment, in bytes. - STACK, - /// Largest core file that can be created, in bytes. - CORE, - /// Largest resident set size, in bytes. - /// This affects swapping; processes that are exceeding their - /// resident set size will be more likely to have physical memory - /// taken from them. - RSS, - /// Number of processes. - NPROC, - /// Number of open files. - NOFILE, - /// Locked-in-memory address space. - MEMLOCK, - /// Address space limit. - AS, - /// Maximum number of file locks. - LOCKS, - /// Maximum number of pending signals. - SIGPENDING, - /// Maximum bytes in POSIX message queues. - MSGQUEUE, - /// Maximum nice priority allowed to raise to. - /// Nice levels 19 .. -20 correspond to 0 .. 39 - /// values of this resource limit. - NICE, - /// Maximum realtime priority allowed for non-privileged - /// processes. - RTPRIO, - /// Maximum CPU time in µs that a process scheduled under a real-time - /// scheduling policy may consume without making a blocking system - /// call before being forcibly descheduled. - RTTIME, +pub const rlimit_resource = if (native_arch.isMIPS()) enum(c_int) { + /// Per-process CPU limit, in seconds. + CPU = 0, - _, - }; + /// Largest file that can be created, in bytes. + FSIZE = 1, + + /// Maximum size of data segment, in bytes. + DATA = 2, + + /// Maximum size of stack segment, in bytes. + STACK = 3, + + /// Largest core file that can be created, in bytes. + CORE = 4, + + /// Number of open files. + NOFILE = 5, + + /// Address space limit. + AS = 6, + + /// Largest resident set size, in bytes. + /// This affects swapping; processes that are exceeding their + /// resident set size will be more likely to have physical memory + /// taken from them. + RSS = 7, + + /// Number of processes. + NPROC = 8, + + /// Locked-in-memory address space. + MEMLOCK = 9, + + /// Maximum number of file locks. + LOCKS = 10, + + /// Maximum number of pending signals. + SIGPENDING = 11, + + /// Maximum bytes in POSIX message queues. + MSGQUEUE = 12, + + /// Maximum nice priority allowed to raise to. + /// Nice levels 19 .. -20 correspond to 0 .. 39 + /// values of this resource limit. + NICE = 13, + + /// Maximum realtime priority allowed for non-privileged + /// processes. + RTPRIO = 14, + + /// Maximum CPU time in µs that a process scheduled under a real-time + /// scheduling policy may consume without making a blocking system + /// call before being forcibly descheduled. + RTTIME = 15, + + _, +} else if (native_arch.isSPARC()) enum(c_int) { + /// Per-process CPU limit, in seconds. + CPU = 0, + + /// Largest file that can be created, in bytes. + FSIZE = 1, + + /// Maximum size of data segment, in bytes. + DATA = 2, + + /// Maximum size of stack segment, in bytes. + STACK = 3, + + /// Largest core file that can be created, in bytes. + CORE = 4, + + /// Largest resident set size, in bytes. + /// This affects swapping; processes that are exceeding their + /// resident set size will be more likely to have physical memory + /// taken from them. + RSS = 5, + + /// Number of open files. + NOFILE = 6, + + /// Number of processes. + NPROC = 7, + + /// Locked-in-memory address space. + MEMLOCK = 8, + + /// Address space limit. + AS = 9, + + /// Maximum number of file locks. + LOCKS = 10, + + /// Maximum number of pending signals. + SIGPENDING = 11, + + /// Maximum bytes in POSIX message queues. + MSGQUEUE = 12, + + /// Maximum nice priority allowed to raise to. + /// Nice levels 19 .. -20 correspond to 0 .. 39 + /// values of this resource limit. + NICE = 13, + + /// Maximum realtime priority allowed for non-privileged + /// processes. + RTPRIO = 14, + + /// Maximum CPU time in µs that a process scheduled under a real-time + /// scheduling policy may consume without making a blocking system + /// call before being forcibly descheduled. + RTTIME = 15, + + _, +} else enum(c_int) { + /// Per-process CPU limit, in seconds. + CPU = 0, + /// Largest file that can be created, in bytes. + FSIZE = 1, + /// Maximum size of data segment, in bytes. + DATA = 2, + /// Maximum size of stack segment, in bytes. + STACK = 3, + /// Largest core file that can be created, in bytes. + CORE = 4, + /// Largest resident set size, in bytes. + /// This affects swapping; processes that are exceeding their + /// resident set size will be more likely to have physical memory + /// taken from them. + RSS = 5, + /// Number of processes. + NPROC = 6, + /// Number of open files. + NOFILE = 7, + /// Locked-in-memory address space. + MEMLOCK = 8, + /// Address space limit. + AS = 9, + /// Maximum number of file locks. + LOCKS = 10, + /// Maximum number of pending signals. + SIGPENDING = 11, + /// Maximum bytes in POSIX message queues. + MSGQUEUE = 12, + /// Maximum nice priority allowed to raise to. + /// Nice levels 19 .. -20 correspond to 0 .. 39 + /// values of this resource limit. + NICE = 13, + /// Maximum realtime priority allowed for non-privileged + /// processes. + RTPRIO = 14, + /// Maximum CPU time in µs that a process scheduled under a real-time + /// scheduling policy may consume without making a blocking system + /// call before being forcibly descheduled. + RTTIME = 15, + + _, +}; pub const rlim_t = u64; diff --git a/lib/std/os/linux/mips.zig b/lib/std/os/linux/mips.zig index 5fe5337f22..5075e813bf 100644 --- a/lib/std/os/linux/mips.zig +++ b/lib/std/os/linux/mips.zig @@ -376,66 +376,6 @@ pub const timezone = extern struct { pub const Elf_Symndx = u32; -pub const rlimit_resource = enum(c_int) { - /// Per-process CPU limit, in seconds. - CPU, - - /// Largest file that can be created, in bytes. - FSIZE, - - /// Maximum size of data segment, in bytes. - DATA, - - /// Maximum size of stack segment, in bytes. - STACK, - - /// Largest core file that can be created, in bytes. - CORE, - - /// Number of open files. - NOFILE, - - /// Address space limit. - AS, - - /// Largest resident set size, in bytes. - /// This affects swapping; processes that are exceeding their - /// resident set size will be more likely to have physical memory - /// taken from them. - RSS, - - /// Number of processes. - NPROC, - - /// Locked-in-memory address space. - MEMLOCK, - - /// Maximum number of file locks. - LOCKS, - - /// Maximum number of pending signals. - SIGPENDING, - - /// Maximum bytes in POSIX message queues. - MSGQUEUE, - - /// Maximum nice priority allowed to raise to. - /// Nice levels 19 .. -20 correspond to 0 .. 39 - /// values of this resource limit. - NICE, - - /// Maximum realtime priority allowed for non-privileged - /// processes. - RTPRIO, - - /// Maximum CPU time in µs that a process scheduled under a real-time - /// scheduling policy may consume without making a blocking system - /// call before being forcibly descheduled. - RTTIME, - - _, -}; - /// TODO pub const ucontext_t = void; diff --git a/lib/std/os/linux/mips64.zig b/lib/std/os/linux/mips64.zig index 068e15d8db..d3cf7b143b 100644 --- a/lib/std/os/linux/mips64.zig +++ b/lib/std/os/linux/mips64.zig @@ -355,66 +355,6 @@ pub const timezone = extern struct { pub const Elf_Symndx = u32; -pub const rlimit_resource = enum(c_int) { - /// Per-process CPU limit, in seconds. - CPU, - - /// Largest file that can be created, in bytes. - FSIZE, - - /// Maximum size of data segment, in bytes. - DATA, - - /// Maximum size of stack segment, in bytes. - STACK, - - /// Largest core file that can be created, in bytes. - CORE, - - /// Number of open files. - NOFILE, - - /// Address space limit. - AS, - - /// Largest resident set size, in bytes. - /// This affects swapping; processes that are exceeding their - /// resident set size will be more likely to have physical memory - /// taken from them. - RSS, - - /// Number of processes. - NPROC, - - /// Locked-in-memory address space. - MEMLOCK, - - /// Maximum number of file locks. - LOCKS, - - /// Maximum number of pending signals. - SIGPENDING, - - /// Maximum bytes in POSIX message queues. - MSGQUEUE, - - /// Maximum nice priority allowed to raise to. - /// Nice levels 19 .. -20 correspond to 0 .. 39 - /// values of this resource limit. - NICE, - - /// Maximum realtime priority allowed for non-privileged - /// processes. - RTPRIO, - - /// Maximum CPU time in µs that a process scheduled under a real-time - /// scheduling policy may consume without making a blocking system - /// call before being forcibly descheduled. - RTTIME, - - _, -}; - /// TODO pub const ucontext_t = void; diff --git a/lib/std/os/linux/sparc64.zig b/lib/std/os/linux/sparc64.zig index a705b58fb6..b30f001000 100644 --- a/lib/std/os/linux/sparc64.zig +++ b/lib/std/os/linux/sparc64.zig @@ -448,63 +448,3 @@ pub const ucontext_t = extern struct { /// TODO pub const getcontext = {}; - -pub const rlimit_resource = enum(c_int) { - /// Per-process CPU limit, in seconds. - CPU, - - /// Largest file that can be created, in bytes. - FSIZE, - - /// Maximum size of data segment, in bytes. - DATA, - - /// Maximum size of stack segment, in bytes. - STACK, - - /// Largest core file that can be created, in bytes. - CORE, - - /// Largest resident set size, in bytes. - /// This affects swapping; processes that are exceeding their - /// resident set size will be more likely to have physical memory - /// taken from them. - RSS, - - /// Number of open files. - NOFILE, - - /// Number of processes. - NPROC, - - /// Locked-in-memory address space. - MEMLOCK, - - /// Address space limit. - AS, - - /// Maximum number of file locks. - LOCKS, - - /// Maximum number of pending signals. - SIGPENDING, - - /// Maximum bytes in POSIX message queues. - MSGQUEUE, - - /// Maximum nice priority allowed to raise to. - /// Nice levels 19 .. -20 correspond to 0 .. 39 - /// values of this resource limit. - NICE, - - /// Maximum realtime priority allowed for non-privileged - /// processes. - RTPRIO, - - /// Maximum CPU time in µs that a process scheduled under a real-time - /// scheduling policy may consume without making a blocking system - /// call before being forcibly descheduled. - RTTIME, - - _, -}; From ea38009f3d0476867d945c3f14f5053206ec87f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Fri, 16 Aug 2024 11:23:02 +0200 Subject: [PATCH 04/10] std.os.linux: Fix Stat struct for mips/mips64. --- lib/std/os/linux/mips.zig | 37 ++++++++++++++++++++++++------------- lib/std/os/linux/mips64.zig | 35 +++++++++++++++++++++++------------ 2 files changed, 47 insertions(+), 25 deletions(-) diff --git a/lib/std/os/linux/mips.zig b/lib/std/os/linux/mips.zig index 5075e813bf..e6cb5f7900 100644 --- a/lib/std/os/linux/mips.zig +++ b/lib/std/os/linux/mips.zig @@ -322,7 +322,7 @@ pub const msghdr_const = extern struct { flags: i32, }; -pub const blksize_t = i32; +pub const blksize_t = u32; pub const nlink_t = u32; pub const time_t = i32; pub const mode_t = u32; @@ -331,36 +331,47 @@ pub const ino_t = u64; pub const dev_t = u64; pub const blkcnt_t = i64; -// The `stat` definition used by the Linux kernel. +// The `stat64` definition used by the Linux kernel. pub const Stat = extern struct { - dev: u32, - __pad0: [3]u32, // Reserved for st_dev expansion + dev: dev_t, + __pad0: [2]u32, // -1 because our dev_t is u64 (kernel dev_t is really u32). ino: ino_t, mode: mode_t, nlink: nlink_t, uid: uid_t, gid: gid_t, - rdev: u32, - __pad1: [3]u32, + rdev: dev_t, + __pad1: [2]u32, // -1 because our dev_t is u64 (kernel dev_t is really u32). size: off_t, - atim: timespec, - mtim: timespec, - ctim: timespec, + atim: i32, + atim_nsec: u32, + mtim: i32, + mtim_nsec: u32, + ctim: i32, + ctim_nsec: u32, blksize: blksize_t, __pad3: u32, blocks: blkcnt_t, - __pad4: [14]usize, pub fn atime(self: @This()) timespec { - return self.atim; + return .{ + .sec = self.atim, + .nsec = self.atim_nsec, + }; } pub fn mtime(self: @This()) timespec { - return self.mtim; + return .{ + .sec = self.mtim, + .nsec = self.mtim_nsec, + }; } pub fn ctime(self: @This()) timespec { - return self.ctim; + return .{ + .sec = self.ctim, + .nsec = self.ctim_nsec, + }; } }; diff --git a/lib/std/os/linux/mips64.zig b/lib/std/os/linux/mips64.zig index d3cf7b143b..5e6661eae5 100644 --- a/lib/std/os/linux/mips64.zig +++ b/lib/std/os/linux/mips64.zig @@ -301,7 +301,7 @@ pub const msghdr_const = extern struct { flags: i32, }; -pub const blksize_t = i32; +pub const blksize_t = u32; pub const nlink_t = u32; pub const time_t = i32; pub const mode_t = u32; @@ -312,34 +312,45 @@ pub const blkcnt_t = i64; // The `stat` definition used by the Linux kernel. pub const Stat = extern struct { - dev: u32, - __pad0: [3]u32, // Reserved for st_dev expansion + dev: dev_t, + __pad0: [2]u32, // -1 because our dev_t is u64 (kernel dev_t is really u32). ino: ino_t, mode: mode_t, nlink: nlink_t, uid: uid_t, gid: gid_t, - rdev: u32, - __pad1: [3]u32, + rdev: dev_t, + __pad1: [2]u32, // -1 because our dev_t is u64 (kernel dev_t is really u32). size: off_t, - atim: timespec, - mtim: timespec, - ctim: timespec, + atim: u32, + atim_nsec: u32, + mtim: u32, + mtim_nsec: u32, + ctim: u32, + ctim_nsec: u32, blksize: blksize_t, __pad3: u32, blocks: blkcnt_t, - __pad4: [14]usize, pub fn atime(self: @This()) timespec { - return self.atim; + return .{ + .sec = self.atim, + .nsec = self.atim_nsec, + }; } pub fn mtime(self: @This()) timespec { - return self.mtim; + return .{ + .sec = self.mtim, + .nsec = self.mtim_nsec, + }; } pub fn ctime(self: @This()) timespec { - return self.ctim; + return .{ + .sec = self.ctim, + .nsec = self.ctim_nsec, + }; } }; From e2a4d7acfcf063a66ee1bb6be59a57835caf3193 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Fri, 16 Aug 2024 11:07:01 +0200 Subject: [PATCH 05/10] std.c: Fix Stat struct for mips/mips64 on linux. --- lib/std/c.zig | 98 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 95 insertions(+), 3 deletions(-) diff --git a/lib/std/c.zig b/lib/std/c.zig index 92d36dd135..3533c96e8f 100644 --- a/lib/std/c.zig +++ b/lib/std/c.zig @@ -6326,16 +6326,46 @@ pub const Stat = switch (native_os) { return self.ctim; } }, - .mips, .mipsel => extern struct { + .mips, .mipsel => if (builtin.target.isMusl()) extern struct { dev: dev_t, - __pad0: [2]u32, + __pad0: [2]i32, ino: ino_t, mode: mode_t, nlink: nlink_t, uid: uid_t, gid: gid_t, rdev: dev_t, - __pad1: [2]u32, + __pad1: [2]i32, + size: off_t, + atim: timespec, + mtim: timespec, + ctim: timespec, + blksize: blksize_t, + __pad3: i32, + blocks: blkcnt_t, + __pad4: [14]i32, + + pub fn atime(self: @This()) timespec { + return self.atim; + } + + pub fn mtime(self: @This()) timespec { + return self.mtim; + } + + pub fn ctime(self: @This()) timespec { + return self.ctim; + } + } else extern struct { + dev: dev_t, + __pad0: [3]u32, + ino: ino_t, + mode: mode_t, + nlink: nlink_t, + uid: uid_t, + gid: gid_t, + rdev: dev_t, + __pad1: [3]u32, size: off_t, atim: timespec, mtim: timespec, @@ -6357,6 +6387,68 @@ pub const Stat = switch (native_os) { return self.ctim; } }, + .mips64, .mips64el => if (builtin.target.isMusl()) extern struct { + dev: dev_t, + __pad0: [3]i32, + ino: ino_t, + mode: mode_t, + nlink: nlink_t, + uid: uid_t, + gid: gid_t, + rdev: dev_t, + __pad1: [2]u32, + size: off_t, + __pad2: i32, + atim: timespec, + mtim: timespec, + ctim: timespec, + blksize: blksize_t, + __pad3: u32, + blocks: blkcnt_t, + __pad4: [14]i32, + + pub fn atime(self: @This()) timespec { + return self.atim; + } + + pub fn mtime(self: @This()) timespec { + return self.mtim; + } + + pub fn ctime(self: @This()) timespec { + return self.ctim; + } + } else extern struct { + dev: dev_t, + __pad0: [3]u32, + ino: ino_t, + mode: mode_t, + nlink: nlink_t, + uid: uid_t, + gid: gid_t, + rdev: dev_t, + __pad1: [3]u32, + size: off_t, + atim: timespec, + mtim: timespec, + ctim: timespec, + blksize: blksize_t, + __pad3: u32, + blocks: blkcnt_t, + __pad4: [14]i32, + + pub fn atime(self: @This()) timespec { + return self.atim; + } + + pub fn mtime(self: @This()) timespec { + return self.mtim; + } + + pub fn ctime(self: @This()) timespec { + return self.ctim; + } + }, else => std.os.linux.Stat, // libc stat is the same as kernel stat. }, From 812a444d55e01b155a675aa70688aadcc9914387 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Sat, 17 Aug 2024 15:12:06 +0200 Subject: [PATCH 06/10] std.c: Fix Sigaction struct for glibc on mips/mips64. --- lib/std/c.zig | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/lib/std/c.zig b/lib/std/c.zig index 3533c96e8f..d430cf6a83 100644 --- a/lib/std/c.zig +++ b/lib/std/c.zig @@ -2722,7 +2722,39 @@ pub const SYS = switch (native_os) { }; /// Renamed from `sigaction` to `Sigaction` to avoid conflict with function name. pub const Sigaction = switch (native_os) { - .linux => linux.Sigaction, + .linux => switch (native_arch) { + .mips, + .mipsel, + .mips64, + .mips64el, + => if (builtin.target.isMusl()) + linux.Sigaction + else if (builtin.target.ptrBitWidth() == 64) extern struct { + pub const handler_fn = *align(1) const fn (i32) callconv(.C) void; + pub const sigaction_fn = *const fn (i32, *const siginfo_t, ?*anyopaque) callconv(.C) void; + + flags: c_uint, + handler: extern union { + handler: ?handler_fn, + sigaction: ?sigaction_fn, + }, + mask: sigset_t, + restorer: ?*const fn () callconv(.C) void = null, + } else extern struct { + pub const handler_fn = *align(1) const fn (i32) callconv(.C) void; + pub const sigaction_fn = *const fn (i32, *const siginfo_t, ?*anyopaque) callconv(.C) void; + + flags: c_uint, + handler: extern union { + handler: ?handler_fn, + sigaction: ?sigaction_fn, + }, + mask: sigset_t, + restorer: ?*const fn () callconv(.C) void = null, + __resv: [1]c_int = .{0}, + }, + else => linux.Sigaction, + }, .emscripten => emscripten.Sigaction, .netbsd, .macos, .ios, .tvos, .watchos, .visionos => extern struct { pub const handler_fn = *align(1) const fn (i32) callconv(.C) void; From 4320611e6dfecad9819281fb945ab2bfe5e182bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Fri, 16 Aug 2024 11:07:18 +0200 Subject: [PATCH 07/10] std.debug: Also disable stack traces on mips64. --- lib/std/debug.zig | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/std/debug.zig b/lib/std/debug.zig index 08ee3b7cde..826978abe4 100644 --- a/lib/std/debug.zig +++ b/lib/std/debug.zig @@ -56,6 +56,8 @@ pub const sys_can_stack_trace = switch (builtin.cpu.arch) { // TODO: Make this work. .mips, .mipsel, + .mips64, + .mips64el, => false, // `@returnAddress()` in LLVM 10 gives From d4d6b23d642a12b76c28e4e1e8e33c4a6e97ea75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Fri, 16 Aug 2024 11:23:51 +0200 Subject: [PATCH 08/10] test: Disable `@min/max for floats` on mips64. https://github.com/ziglang/zig/issues/21090 --- test/behavior/maximum_minimum.zig | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/behavior/maximum_minimum.zig b/test/behavior/maximum_minimum.zig index d08bc82828..ab1803c5b1 100644 --- a/test/behavior/maximum_minimum.zig +++ b/test/behavior/maximum_minimum.zig @@ -146,6 +146,8 @@ test "@min/max for floats" { }; inline for (.{ f16, f32, f64, f80, f128, c_longdouble }) |T| { + if (T == c_longdouble and builtin.cpu.arch.isMIPS64()) return error.SkipZigTest; // https://github.com/ziglang/zig/issues/21090 + try S.doTheTest(T); try comptime S.doTheTest(T); } From ecbc701376c944e201ccaa24910ba1dfdcc7a4b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Fri, 16 Aug 2024 11:24:34 +0200 Subject: [PATCH 09/10] test: Disable `vector reduce operation` on mips64. https://github.com/ziglang/zig/issues/21091 --- test/behavior/vector.zig | 1 + 1 file changed, 1 insertion(+) diff --git a/test/behavior/vector.zig b/test/behavior/vector.zig index c4e00d9b0c..214fda28d6 100644 --- a/test/behavior/vector.zig +++ b/test/behavior/vector.zig @@ -773,6 +773,7 @@ test "vector reduce operation" { if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; if (builtin.zig_backend == .stage2_c and comptime builtin.cpu.arch.isArmOrThumb()) return error.SkipZigTest; if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; + if (builtin.cpu.arch.isMIPS64()) return error.SkipZigTest; // https://github.com/ziglang/zig/issues/21091 const S = struct { fn testReduce(comptime op: std.builtin.ReduceOp, x: anytype, expected: anytype) !void { From 3e8ac8e23fce5f8468f54209dc9cc97c878edb9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Fri, 16 Aug 2024 11:24:48 +0200 Subject: [PATCH 10/10] test: Add `mips64(el)-linux-(none,musl,gnuabi64)` targets. These take 3-4 minutes to run on my machine, i.e. they're not affected by the LLVM compilation speed bug that affects mips32. --- test/tests.zig | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/test/tests.zig b/test/tests.zig index 6b044e91ba..73934950db 100644 --- a/test/tests.zig +++ b/test/tests.zig @@ -365,6 +365,54 @@ const test_targets = blk: { .slow_backend = true, }, + .{ + .target = .{ + .cpu_arch = .mips64, + .os_tag = .linux, + .abi = .none, + }, + }, + .{ + .target = .{ + .cpu_arch = .mips64, + .os_tag = .linux, + .abi = .musl, + }, + .link_libc = true, + }, + .{ + .target = .{ + .cpu_arch = .mips64, + .os_tag = .linux, + .abi = .gnuabi64, + }, + .link_libc = true, + }, + + .{ + .target = .{ + .cpu_arch = .mips64el, + .os_tag = .linux, + .abi = .none, + }, + }, + .{ + .target = .{ + .cpu_arch = .mips64el, + .os_tag = .linux, + .abi = .musl, + }, + .link_libc = true, + }, + .{ + .target = .{ + .cpu_arch = .mips64el, + .os_tag = .linux, + .abi = .gnuabi64, + }, + .link_libc = true, + }, + .{ .target = .{ .cpu_arch = .powerpc,