authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2024-08-22 20:09:08-07:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2024-08-22 20:09:08-07:00
logee84deda988afb36f24ecd35ebea40221c1b80d8
treeb4044553d6cf49cbf69dd20f617260161f2527ac
parentc262061129f0c19a276779e4102da99eca58536a
parent3e8ac8e23fce5f8468f54209dc9cc97c878edb9e
signaturebadge-check Signed by PGP key B5690EEEBB952194

Merge pull request #21095 from alexrp/mips64-tests

Get `mips64(el)-linux` working and start testing it

9 files changed, 424 insertions(+), 275 deletions(-)

lib/std/c.zig+128-4
......@@ -2722,7 +2722,39 @@ pub const SYS = switch (native_os) {
27222722};
27232723/// Renamed from `sigaction` to `Sigaction` to avoid conflict with function name.
27242724pub const Sigaction = switch (native_os) {
2725 .linux => linux.Sigaction,
2725 .linux => switch (native_arch) {
2726 .mips,
2727 .mipsel,
2728 .mips64,
2729 .mips64el,
2730 => if (builtin.target.isMusl())
2731 linux.Sigaction
2732 else if (builtin.target.ptrBitWidth() == 64) extern struct {
2733 pub const handler_fn = *align(1) const fn (i32) callconv(.C) void;
2734 pub const sigaction_fn = *const fn (i32, *const siginfo_t, ?*anyopaque) callconv(.C) void;
2735
2736 flags: c_uint,
2737 handler: extern union {
2738 handler: ?handler_fn,
2739 sigaction: ?sigaction_fn,
2740 },
2741 mask: sigset_t,
2742 restorer: ?*const fn () callconv(.C) void = null,
2743 } else extern struct {
2744 pub const handler_fn = *align(1) const fn (i32) callconv(.C) void;
2745 pub const sigaction_fn = *const fn (i32, *const siginfo_t, ?*anyopaque) callconv(.C) void;
2746
2747 flags: c_uint,
2748 handler: extern union {
2749 handler: ?handler_fn,
2750 sigaction: ?sigaction_fn,
2751 },
2752 mask: sigset_t,
2753 restorer: ?*const fn () callconv(.C) void = null,
2754 __resv: [1]c_int = .{0},
2755 },
2756 else => linux.Sigaction,
2757 },
27262758 .emscripten => emscripten.Sigaction,
27272759 .netbsd, .macos, .ios, .tvos, .watchos, .visionos => extern struct {
27282760 pub const handler_fn = *align(1) const fn (i32) callconv(.C) void;
......@@ -6326,16 +6358,46 @@ pub const Stat = switch (native_os) {
63266358 return self.ctim;
63276359 }
63286360 },
6329 .mips, .mipsel => extern struct {
6361 .mips, .mipsel => if (builtin.target.isMusl()) extern struct {
63306362 dev: dev_t,
6331 __pad0: [2]u32,
6363 __pad0: [2]i32,
63326364 ino: ino_t,
63336365 mode: mode_t,
63346366 nlink: nlink_t,
63356367 uid: uid_t,
63366368 gid: gid_t,
63376369 rdev: dev_t,
6338 __pad1: [2]u32,
6370 __pad1: [2]i32,
6371 size: off_t,
6372 atim: timespec,
6373 mtim: timespec,
6374 ctim: timespec,
6375 blksize: blksize_t,
6376 __pad3: i32,
6377 blocks: blkcnt_t,
6378 __pad4: [14]i32,
6379
6380 pub fn atime(self: @This()) timespec {
6381 return self.atim;
6382 }
6383
6384 pub fn mtime(self: @This()) timespec {
6385 return self.mtim;
6386 }
6387
6388 pub fn ctime(self: @This()) timespec {
6389 return self.ctim;
6390 }
6391 } else extern struct {
6392 dev: dev_t,
6393 __pad0: [3]u32,
6394 ino: ino_t,
6395 mode: mode_t,
6396 nlink: nlink_t,
6397 uid: uid_t,
6398 gid: gid_t,
6399 rdev: dev_t,
6400 __pad1: [3]u32,
63396401 size: off_t,
63406402 atim: timespec,
63416403 mtim: timespec,
......@@ -6357,6 +6419,68 @@ pub const Stat = switch (native_os) {
63576419 return self.ctim;
63586420 }
63596421 },
6422 .mips64, .mips64el => if (builtin.target.isMusl()) extern struct {
6423 dev: dev_t,
6424 __pad0: [3]i32,
6425 ino: ino_t,
6426 mode: mode_t,
6427 nlink: nlink_t,
6428 uid: uid_t,
6429 gid: gid_t,
6430 rdev: dev_t,
6431 __pad1: [2]u32,
6432 size: off_t,
6433 __pad2: i32,
6434 atim: timespec,
6435 mtim: timespec,
6436 ctim: timespec,
6437 blksize: blksize_t,
6438 __pad3: u32,
6439 blocks: blkcnt_t,
6440 __pad4: [14]i32,
6441
6442 pub fn atime(self: @This()) timespec {
6443 return self.atim;
6444 }
6445
6446 pub fn mtime(self: @This()) timespec {
6447 return self.mtim;
6448 }
6449
6450 pub fn ctime(self: @This()) timespec {
6451 return self.ctim;
6452 }
6453 } else extern struct {
6454 dev: dev_t,
6455 __pad0: [3]u32,
6456 ino: ino_t,
6457 mode: mode_t,
6458 nlink: nlink_t,
6459 uid: uid_t,
6460 gid: gid_t,
6461 rdev: dev_t,
6462 __pad1: [3]u32,
6463 size: off_t,
6464 atim: timespec,
6465 mtim: timespec,
6466 ctim: timespec,
6467 blksize: blksize_t,
6468 __pad3: u32,
6469 blocks: blkcnt_t,
6470 __pad4: [14]i32,
6471
6472 pub fn atime(self: @This()) timespec {
6473 return self.atim;
6474 }
6475
6476 pub fn mtime(self: @This()) timespec {
6477 return self.mtim;
6478 }
6479
6480 pub fn ctime(self: @This()) timespec {
6481 return self.ctim;
6482 }
6483 },
63606484
63616485 else => std.os.linux.Stat, // libc stat is the same as kernel stat.
63626486 },
lib/std/debug.zig+2
......@@ -56,6 +56,8 @@ pub const sys_can_stack_trace = switch (builtin.cpu.arch) {
5656 // TODO: Make this work.
5757 .mips,
5858 .mipsel,
59 .mips64,
60 .mips64el,
5961 => false,
6062
6163 // `@returnAddress()` in LLVM 10 gives
lib/std/os/linux.zig+161-48
......@@ -2272,7 +2272,7 @@ pub fn fadvise(fd: fd_t, offset: i64, len: i64, advice: usize) usize {
22722272 length_halves[0],
22732273 length_halves[1],
22742274 );
2275 } else if (comptime native_arch == .mips or native_arch == .mipsel) {
2275 } else if (native_arch.isMIPS32()) {
22762276 // MIPS O32 does not deal with the register alignment issue, so pass a dummy value.
22772277
22782278 const offset_halves = splitValue64(offset);
......@@ -2382,7 +2382,7 @@ pub fn map_shadow_stack(addr: u64, size: u64, flags: u32) usize {
23822382}
23832383
23842384pub const E = switch (native_arch) {
2385 .mips, .mipsel => enum(u16) {
2385 .mips, .mipsel, .mips64, .mips64el => enum(u16) {
23862386 /// No error occurred.
23872387 SUCCESS = 0,
23882388
......@@ -7068,53 +7068,166 @@ pub const ifreq = extern struct {
70687068};
70697069
70707070// doc comments copied from musl
7071pub const rlimit_resource = if (native_arch.isMIPS() or native_arch.isSPARC())
7072 arch_bits.rlimit_resource
7073else
7074 enum(c_int) {
7075 /// Per-process CPU limit, in seconds.
7076 CPU,
7077 /// Largest file that can be created, in bytes.
7078 FSIZE,
7079 /// Maximum size of data segment, in bytes.
7080 DATA,
7081 /// Maximum size of stack segment, in bytes.
7082 STACK,
7083 /// Largest core file that can be created, in bytes.
7084 CORE,
7085 /// Largest resident set size, in bytes.
7086 /// This affects swapping; processes that are exceeding their
7087 /// resident set size will be more likely to have physical memory
7088 /// taken from them.
7089 RSS,
7090 /// Number of processes.
7091 NPROC,
7092 /// Number of open files.
7093 NOFILE,
7094 /// Locked-in-memory address space.
7095 MEMLOCK,
7096 /// Address space limit.
7097 AS,
7098 /// Maximum number of file locks.
7099 LOCKS,
7100 /// Maximum number of pending signals.
7101 SIGPENDING,
7102 /// Maximum bytes in POSIX message queues.
7103 MSGQUEUE,
7104 /// Maximum nice priority allowed to raise to.
7105 /// Nice levels 19 .. -20 correspond to 0 .. 39
7106 /// values of this resource limit.
7107 NICE,
7108 /// Maximum realtime priority allowed for non-privileged
7109 /// processes.
7110 RTPRIO,
7111 /// Maximum CPU time in µs that a process scheduled under a real-time
7112 /// scheduling policy may consume without making a blocking system
7113 /// call before being forcibly descheduled.
7114 RTTIME,
7071pub const rlimit_resource = if (native_arch.isMIPS()) enum(c_int) {
7072 /// Per-process CPU limit, in seconds.
7073 CPU = 0,
71157074
7116 _,
7117 };
7075 /// Largest file that can be created, in bytes.
7076 FSIZE = 1,
7077
7078 /// Maximum size of data segment, in bytes.
7079 DATA = 2,
7080
7081 /// Maximum size of stack segment, in bytes.
7082 STACK = 3,
7083
7084 /// Largest core file that can be created, in bytes.
7085 CORE = 4,
7086
7087 /// Number of open files.
7088 NOFILE = 5,
7089
7090 /// Address space limit.
7091 AS = 6,
7092
7093 /// Largest resident set size, in bytes.
7094 /// This affects swapping; processes that are exceeding their
7095 /// resident set size will be more likely to have physical memory
7096 /// taken from them.
7097 RSS = 7,
7098
7099 /// Number of processes.
7100 NPROC = 8,
7101
7102 /// Locked-in-memory address space.
7103 MEMLOCK = 9,
7104
7105 /// Maximum number of file locks.
7106 LOCKS = 10,
7107
7108 /// Maximum number of pending signals.
7109 SIGPENDING = 11,
7110
7111 /// Maximum bytes in POSIX message queues.
7112 MSGQUEUE = 12,
7113
7114 /// Maximum nice priority allowed to raise to.
7115 /// Nice levels 19 .. -20 correspond to 0 .. 39
7116 /// values of this resource limit.
7117 NICE = 13,
7118
7119 /// Maximum realtime priority allowed for non-privileged
7120 /// processes.
7121 RTPRIO = 14,
7122
7123 /// Maximum CPU time in µs that a process scheduled under a real-time
7124 /// scheduling policy may consume without making a blocking system
7125 /// call before being forcibly descheduled.
7126 RTTIME = 15,
7127
7128 _,
7129} else if (native_arch.isSPARC()) enum(c_int) {
7130 /// Per-process CPU limit, in seconds.
7131 CPU = 0,
7132
7133 /// Largest file that can be created, in bytes.
7134 FSIZE = 1,
7135
7136 /// Maximum size of data segment, in bytes.
7137 DATA = 2,
7138
7139 /// Maximum size of stack segment, in bytes.
7140 STACK = 3,
7141
7142 /// Largest core file that can be created, in bytes.
7143 CORE = 4,
7144
7145 /// Largest resident set size, in bytes.
7146 /// This affects swapping; processes that are exceeding their
7147 /// resident set size will be more likely to have physical memory
7148 /// taken from them.
7149 RSS = 5,
7150
7151 /// Number of open files.
7152 NOFILE = 6,
7153
7154 /// Number of processes.
7155 NPROC = 7,
7156
7157 /// Locked-in-memory address space.
7158 MEMLOCK = 8,
7159
7160 /// Address space limit.
7161 AS = 9,
7162
7163 /// Maximum number of file locks.
7164 LOCKS = 10,
7165
7166 /// Maximum number of pending signals.
7167 SIGPENDING = 11,
7168
7169 /// Maximum bytes in POSIX message queues.
7170 MSGQUEUE = 12,
7171
7172 /// Maximum nice priority allowed to raise to.
7173 /// Nice levels 19 .. -20 correspond to 0 .. 39
7174 /// values of this resource limit.
7175 NICE = 13,
7176
7177 /// Maximum realtime priority allowed for non-privileged
7178 /// processes.
7179 RTPRIO = 14,
7180
7181 /// Maximum CPU time in µs that a process scheduled under a real-time
7182 /// scheduling policy may consume without making a blocking system
7183 /// call before being forcibly descheduled.
7184 RTTIME = 15,
7185
7186 _,
7187} else enum(c_int) {
7188 /// Per-process CPU limit, in seconds.
7189 CPU = 0,
7190 /// Largest file that can be created, in bytes.
7191 FSIZE = 1,
7192 /// Maximum size of data segment, in bytes.
7193 DATA = 2,
7194 /// Maximum size of stack segment, in bytes.
7195 STACK = 3,
7196 /// Largest core file that can be created, in bytes.
7197 CORE = 4,
7198 /// Largest resident set size, in bytes.
7199 /// This affects swapping; processes that are exceeding their
7200 /// resident set size will be more likely to have physical memory
7201 /// taken from them.
7202 RSS = 5,
7203 /// Number of processes.
7204 NPROC = 6,
7205 /// Number of open files.
7206 NOFILE = 7,
7207 /// Locked-in-memory address space.
7208 MEMLOCK = 8,
7209 /// Address space limit.
7210 AS = 9,
7211 /// Maximum number of file locks.
7212 LOCKS = 10,
7213 /// Maximum number of pending signals.
7214 SIGPENDING = 11,
7215 /// Maximum bytes in POSIX message queues.
7216 MSGQUEUE = 12,
7217 /// Maximum nice priority allowed to raise to.
7218 /// Nice levels 19 .. -20 correspond to 0 .. 39
7219 /// values of this resource limit.
7220 NICE = 13,
7221 /// Maximum realtime priority allowed for non-privileged
7222 /// processes.
7223 RTPRIO = 14,
7224 /// Maximum CPU time in µs that a process scheduled under a real-time
7225 /// scheduling policy may consume without making a blocking system
7226 /// call before being forcibly descheduled.
7227 RTTIME = 15,
7228
7229 _,
7230};
71187231
71197232pub const rlim_t = u64;
71207233
lib/std/os/linux/mips.zig+41-82
......@@ -14,7 +14,8 @@ const timespec = linux.timespec;
1414pub fn syscall0(number: SYS) usize {
1515 return asm volatile (
1616 \\ syscall
17 \\ blez $7, 1f
17 \\ beq $7, $zero, 1f
18 \\ blez $2, 1f
1819 \\ subu $2, $0, $2
1920 \\ 1:
2021 : [ret] "={$2}" (-> usize),
......@@ -28,7 +29,7 @@ pub fn syscall_pipe(fd: *[2]i32) usize {
2829 \\ .set noat
2930 \\ .set noreorder
3031 \\ syscall
31 \\ blez $7, 1f
32 \\ beq $7, $zero, 1f
3233 \\ nop
3334 \\ b 2f
3435 \\ subu $2, $0, $2
......@@ -46,7 +47,8 @@ pub fn syscall_pipe(fd: *[2]i32) usize {
4647pub fn syscall1(number: SYS, arg1: usize) usize {
4748 return asm volatile (
4849 \\ syscall
49 \\ blez $7, 1f
50 \\ beq $7, $zero, 1f
51 \\ blez $2, 1f
5052 \\ subu $2, $0, $2
5153 \\ 1:
5254 : [ret] "={$2}" (-> usize),
......@@ -59,7 +61,8 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
5961pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
6062 return asm volatile (
6163 \\ syscall
62 \\ blez $7, 1f
64 \\ beq $7, $zero, 1f
65 \\ blez $2, 1f
6366 \\ subu $2, $0, $2
6467 \\ 1:
6568 : [ret] "={$2}" (-> usize),
......@@ -73,7 +76,8 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
7376pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
7477 return asm volatile (
7578 \\ syscall
76 \\ blez $7, 1f
79 \\ beq $7, $zero, 1f
80 \\ blez $2, 1f
7781 \\ subu $2, $0, $2
7882 \\ 1:
7983 : [ret] "={$2}" (-> usize),
......@@ -88,7 +92,8 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
8892pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
8993 return asm volatile (
9094 \\ syscall
91 \\ blez $7, 1f
95 \\ beq $7, $zero, 1f
96 \\ blez $2, 1f
9297 \\ subu $2, $0, $2
9398 \\ 1:
9499 : [ret] "={$2}" (-> usize),
......@@ -108,7 +113,8 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
108113 \\ sw %[arg5], 16($sp)
109114 \\ syscall
110115 \\ addu $sp, $sp, 24
111 \\ blez $7, 1f
116 \\ beq $7, $zero, 1f
117 \\ blez $2, 1f
112118 \\ subu $2, $0, $2
113119 \\ 1:
114120 : [ret] "={$2}" (-> usize),
......@@ -141,7 +147,8 @@ pub fn syscall6(
141147 \\ sw %[arg6], 20($sp)
142148 \\ syscall
143149 \\ addu $sp, $sp, 24
144 \\ blez $7, 1f
150 \\ beq $7, $zero, 1f
151 \\ blez $2, 1f
145152 \\ subu $2, $0, $2
146153 \\ 1:
147154 : [ret] "={$2}" (-> usize),
......@@ -174,7 +181,8 @@ pub fn syscall7(
174181 \\ sw %[arg7], 24($sp)
175182 \\ syscall
176183 \\ addu $sp, $sp, 32
177 \\ blez $7, 1f
184 \\ beq $7, $zero, 1f
185 \\ blez $2, 1f
178186 \\ subu $2, $0, $2
179187 \\ 1:
180188 : [ret] "={$2}" (-> usize),
......@@ -314,7 +322,7 @@ pub const msghdr_const = extern struct {
314322 flags: i32,
315323};
316324
317pub const blksize_t = i32;
325pub const blksize_t = u32;
318326pub const nlink_t = u32;
319327pub const time_t = i32;
320328pub const mode_t = u32;
......@@ -323,36 +331,47 @@ pub const ino_t = u64;
323331pub const dev_t = u64;
324332pub const blkcnt_t = i64;
325333
326// The `stat` definition used by the Linux kernel.
334// The `stat64` definition used by the Linux kernel.
327335pub const Stat = extern struct {
328 dev: u32,
329 __pad0: [3]u32, // Reserved for st_dev expansion
336 dev: dev_t,
337 __pad0: [2]u32, // -1 because our dev_t is u64 (kernel dev_t is really u32).
330338 ino: ino_t,
331339 mode: mode_t,
332340 nlink: nlink_t,
333341 uid: uid_t,
334342 gid: gid_t,
335 rdev: u32,
336 __pad1: [3]u32,
343 rdev: dev_t,
344 __pad1: [2]u32, // -1 because our dev_t is u64 (kernel dev_t is really u32).
337345 size: off_t,
338 atim: timespec,
339 mtim: timespec,
340 ctim: timespec,
346 atim: i32,
347 atim_nsec: u32,
348 mtim: i32,
349 mtim_nsec: u32,
350 ctim: i32,
351 ctim_nsec: u32,
341352 blksize: blksize_t,
342353 __pad3: u32,
343354 blocks: blkcnt_t,
344 __pad4: [14]usize,
345355
346356 pub fn atime(self: @This()) timespec {
347 return self.atim;
357 return .{
358 .sec = self.atim,
359 .nsec = self.atim_nsec,
360 };
348361 }
349362
350363 pub fn mtime(self: @This()) timespec {
351 return self.mtim;
364 return .{
365 .sec = self.mtim,
366 .nsec = self.mtim_nsec,
367 };
352368 }
353369
354370 pub fn ctime(self: @This()) timespec {
355 return self.ctim;
371 return .{
372 .sec = self.ctim,
373 .nsec = self.ctim_nsec,
374 };
356375 }
357376};
358377
......@@ -368,66 +387,6 @@ pub const timezone = extern struct {
368387
369388pub const Elf_Symndx = u32;
370389
371pub const rlimit_resource = enum(c_int) {
372 /// Per-process CPU limit, in seconds.
373 CPU,
374
375 /// Largest file that can be created, in bytes.
376 FSIZE,
377
378 /// Maximum size of data segment, in bytes.
379 DATA,
380
381 /// Maximum size of stack segment, in bytes.
382 STACK,
383
384 /// Largest core file that can be created, in bytes.
385 CORE,
386
387 /// Number of open files.
388 NOFILE,
389
390 /// Address space limit.
391 AS,
392
393 /// Largest resident set size, in bytes.
394 /// This affects swapping; processes that are exceeding their
395 /// resident set size will be more likely to have physical memory
396 /// taken from them.
397 RSS,
398
399 /// Number of processes.
400 NPROC,
401
402 /// Locked-in-memory address space.
403 MEMLOCK,
404
405 /// Maximum number of file locks.
406 LOCKS,
407
408 /// Maximum number of pending signals.
409 SIGPENDING,
410
411 /// Maximum bytes in POSIX message queues.
412 MSGQUEUE,
413
414 /// Maximum nice priority allowed to raise to.
415 /// Nice levels 19 .. -20 correspond to 0 .. 39
416 /// values of this resource limit.
417 NICE,
418
419 /// Maximum realtime priority allowed for non-privileged
420 /// processes.
421 RTPRIO,
422
423 /// Maximum CPU time in µs that a process scheduled under a real-time
424 /// scheduling policy may consume without making a blocking system
425 /// call before being forcibly descheduled.
426 RTTIME,
427
428 _,
429};
430
431390/// TODO
432391pub const ucontext_t = void;
433392
lib/std/os/linux/mips64.zig+41-81
......@@ -14,7 +14,8 @@ const timespec = linux.timespec;
1414pub fn syscall0(number: SYS) usize {
1515 return asm volatile (
1616 \\ syscall
17 \\ blez $7, 1f
17 \\ beq $7, $zero, 1f
18 \\ blez $2, 1f
1819 \\ dsubu $2, $0, $2
1920 \\ 1:
2021 : [ret] "={$2}" (-> usize),
......@@ -28,7 +29,7 @@ pub fn syscall_pipe(fd: *[2]i32) usize {
2829 \\ .set noat
2930 \\ .set noreorder
3031 \\ syscall
31 \\ blez $7, 1f
32 \\ beq $7, $zero, 1f
3233 \\ nop
3334 \\ b 2f
3435 \\ subu $2, $0, $2
......@@ -46,7 +47,9 @@ pub fn syscall_pipe(fd: *[2]i32) usize {
4647pub fn syscall1(number: SYS, arg1: usize) usize {
4748 return asm volatile (
4849 \\ syscall
49 \\ blez $7, 1f
50 \\ beq $7, $zero, 1f
51 \\ blez $2, 1f
52 \\ nop
5053 \\ dsubu $2, $0, $2
5154 \\ 1:
5255 : [ret] "={$2}" (-> usize),
......@@ -59,7 +62,8 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
5962pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
6063 return asm volatile (
6164 \\ syscall
62 \\ blez $7, 1f
65 \\ beq $7, $zero, 1f
66 \\ blez $2, 1f
6367 \\ dsubu $2, $0, $2
6468 \\ 1:
6569 : [ret] "={$2}" (-> usize),
......@@ -73,7 +77,8 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
7377pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
7478 return asm volatile (
7579 \\ syscall
76 \\ blez $7, 1f
80 \\ beq $7, $zero, 1f
81 \\ blez $2, 1f
7782 \\ dsubu $2, $0, $2
7883 \\ 1:
7984 : [ret] "={$2}" (-> usize),
......@@ -88,7 +93,8 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
8893pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
8994 return asm volatile (
9095 \\ syscall
91 \\ blez $7, 1f
96 \\ beq $7, $zero, 1f
97 \\ blez $2, 1f
9298 \\ dsubu $2, $0, $2
9399 \\ 1:
94100 : [ret] "={$2}" (-> usize),
......@@ -104,7 +110,8 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
104110pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
105111 return asm volatile (
106112 \\ syscall
107 \\ blez $7, 1f
113 \\ beq $7, $zero, 1f
114 \\ blez $2, 1f
108115 \\ dsubu $2, $0, $2
109116 \\ 1:
110117 : [ret] "={$2}" (-> usize),
......@@ -129,7 +136,8 @@ pub fn syscall6(
129136) usize {
130137 return asm volatile (
131138 \\ syscall
132 \\ blez $7, 1f
139 \\ beq $7, $zero, 1f
140 \\ blez $2, 1f
133141 \\ dsubu $2, $0, $2
134142 \\ 1:
135143 : [ret] "={$2}" (-> usize),
......@@ -156,7 +164,8 @@ pub fn syscall7(
156164) usize {
157165 return asm volatile (
158166 \\ syscall
159 \\ blez $7, 1f
167 \\ beq $7, $zero, 1f
168 \\ blez $2, 1f
160169 \\ dsubu $2, $0, $2
161170 \\ 1:
162171 : [ret] "={$2}" (-> usize),
......@@ -292,7 +301,7 @@ pub const msghdr_const = extern struct {
292301 flags: i32,
293302};
294303
295pub const blksize_t = i32;
304pub const blksize_t = u32;
296305pub const nlink_t = u32;
297306pub const time_t = i32;
298307pub const mode_t = u32;
......@@ -303,34 +312,45 @@ pub const blkcnt_t = i64;
303312
304313// The `stat` definition used by the Linux kernel.
305314pub const Stat = extern struct {
306 dev: u32,
307 __pad0: [3]u32, // Reserved for st_dev expansion
315 dev: dev_t,
316 __pad0: [2]u32, // -1 because our dev_t is u64 (kernel dev_t is really u32).
308317 ino: ino_t,
309318 mode: mode_t,
310319 nlink: nlink_t,
311320 uid: uid_t,
312321 gid: gid_t,
313 rdev: u32,
314 __pad1: [3]u32,
322 rdev: dev_t,
323 __pad1: [2]u32, // -1 because our dev_t is u64 (kernel dev_t is really u32).
315324 size: off_t,
316 atim: timespec,
317 mtim: timespec,
318 ctim: timespec,
325 atim: u32,
326 atim_nsec: u32,
327 mtim: u32,
328 mtim_nsec: u32,
329 ctim: u32,
330 ctim_nsec: u32,
319331 blksize: blksize_t,
320332 __pad3: u32,
321333 blocks: blkcnt_t,
322 __pad4: [14]usize,
323334
324335 pub fn atime(self: @This()) timespec {
325 return self.atim;
336 return .{
337 .sec = self.atim,
338 .nsec = self.atim_nsec,
339 };
326340 }
327341
328342 pub fn mtime(self: @This()) timespec {
329 return self.mtim;
343 return .{
344 .sec = self.mtim,
345 .nsec = self.mtim_nsec,
346 };
330347 }
331348
332349 pub fn ctime(self: @This()) timespec {
333 return self.ctim;
350 return .{
351 .sec = self.ctim,
352 .nsec = self.ctim_nsec,
353 };
334354 }
335355};
336356
......@@ -346,66 +366,6 @@ pub const timezone = extern struct {
346366
347367pub const Elf_Symndx = u32;
348368
349pub const rlimit_resource = enum(c_int) {
350 /// Per-process CPU limit, in seconds.
351 CPU,
352
353 /// Largest file that can be created, in bytes.
354 FSIZE,
355
356 /// Maximum size of data segment, in bytes.
357 DATA,
358
359 /// Maximum size of stack segment, in bytes.
360 STACK,
361
362 /// Largest core file that can be created, in bytes.
363 CORE,
364
365 /// Number of open files.
366 NOFILE,
367
368 /// Address space limit.
369 AS,
370
371 /// Largest resident set size, in bytes.
372 /// This affects swapping; processes that are exceeding their
373 /// resident set size will be more likely to have physical memory
374 /// taken from them.
375 RSS,
376
377 /// Number of processes.
378 NPROC,
379
380 /// Locked-in-memory address space.
381 MEMLOCK,
382
383 /// Maximum number of file locks.
384 LOCKS,
385
386 /// Maximum number of pending signals.
387 SIGPENDING,
388
389 /// Maximum bytes in POSIX message queues.
390 MSGQUEUE,
391
392 /// Maximum nice priority allowed to raise to.
393 /// Nice levels 19 .. -20 correspond to 0 .. 39
394 /// values of this resource limit.
395 NICE,
396
397 /// Maximum realtime priority allowed for non-privileged
398 /// processes.
399 RTPRIO,
400
401 /// Maximum CPU time in µs that a process scheduled under a real-time
402 /// scheduling policy may consume without making a blocking system
403 /// call before being forcibly descheduled.
404 RTTIME,
405
406 _,
407};
408
409369/// TODO
410370pub const ucontext_t = void;
411371
lib/std/os/linux/sparc64.zig-60
......@@ -448,63 +448,3 @@ pub const ucontext_t = extern struct {
448448
449449/// TODO
450450pub const getcontext = {};
451
452pub const rlimit_resource = enum(c_int) {
453 /// Per-process CPU limit, in seconds.
454 CPU,
455
456 /// Largest file that can be created, in bytes.
457 FSIZE,
458
459 /// Maximum size of data segment, in bytes.
460 DATA,
461
462 /// Maximum size of stack segment, in bytes.
463 STACK,
464
465 /// Largest core file that can be created, in bytes.
466 CORE,
467
468 /// Largest resident set size, in bytes.
469 /// This affects swapping; processes that are exceeding their
470 /// resident set size will be more likely to have physical memory
471 /// taken from them.
472 RSS,
473
474 /// Number of open files.
475 NOFILE,
476
477 /// Number of processes.
478 NPROC,
479
480 /// Locked-in-memory address space.
481 MEMLOCK,
482
483 /// Address space limit.
484 AS,
485
486 /// Maximum number of file locks.
487 LOCKS,
488
489 /// Maximum number of pending signals.
490 SIGPENDING,
491
492 /// Maximum bytes in POSIX message queues.
493 MSGQUEUE,
494
495 /// Maximum nice priority allowed to raise to.
496 /// Nice levels 19 .. -20 correspond to 0 .. 39
497 /// values of this resource limit.
498 NICE,
499
500 /// Maximum realtime priority allowed for non-privileged
501 /// processes.
502 RTPRIO,
503
504 /// Maximum CPU time in µs that a process scheduled under a real-time
505 /// scheduling policy may consume without making a blocking system
506 /// call before being forcibly descheduled.
507 RTTIME,
508
509 _,
510};
test/behavior/maximum_minimum.zig+2
......@@ -146,6 +146,8 @@ test "@min/max for floats" {
146146 };
147147
148148 inline for (.{ f16, f32, f64, f80, f128, c_longdouble }) |T| {
149 if (T == c_longdouble and builtin.cpu.arch.isMIPS64()) return error.SkipZigTest; // https://github.com/ziglang/zig/issues/21090
150
149151 try S.doTheTest(T);
150152 try comptime S.doTheTest(T);
151153 }
test/behavior/vector.zig+1
......@@ -773,6 +773,7 @@ test "vector reduce operation" {
773773 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
774774 if (builtin.zig_backend == .stage2_c and comptime builtin.cpu.arch.isArmOrThumb()) return error.SkipZigTest;
775775 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
776 if (builtin.cpu.arch.isMIPS64()) return error.SkipZigTest; // https://github.com/ziglang/zig/issues/21091
776777
777778 const S = struct {
778779 fn testReduce(comptime op: std.builtin.ReduceOp, x: anytype, expected: anytype) !void {
test/tests.zig+48
......@@ -365,6 +365,54 @@ const test_targets = blk: {
365365 .slow_backend = true,
366366 },
367367
368 .{
369 .target = .{
370 .cpu_arch = .mips64,
371 .os_tag = .linux,
372 .abi = .none,
373 },
374 },
375 .{
376 .target = .{
377 .cpu_arch = .mips64,
378 .os_tag = .linux,
379 .abi = .musl,
380 },
381 .link_libc = true,
382 },
383 .{
384 .target = .{
385 .cpu_arch = .mips64,
386 .os_tag = .linux,
387 .abi = .gnuabi64,
388 },
389 .link_libc = true,
390 },
391
392 .{
393 .target = .{
394 .cpu_arch = .mips64el,
395 .os_tag = .linux,
396 .abi = .none,
397 },
398 },
399 .{
400 .target = .{
401 .cpu_arch = .mips64el,
402 .os_tag = .linux,
403 .abi = .musl,
404 },
405 .link_libc = true,
406 },
407 .{
408 .target = .{
409 .cpu_arch = .mips64el,
410 .os_tag = .linux,
411 .abi = .gnuabi64,
412 },
413 .link_libc = true,
414 },
415
368416 .{
369417 .target = .{
370418 .cpu_arch = .powerpc,