mirror of
https://github.com/ziglang/zig.git
synced 2024-11-26 22:30:22 +00:00
Merge pull request #21095 from alexrp/mips64-tests
Get `mips64(el)-linux` working and start testing it
This commit is contained in:
commit
ee84deda98
132
lib/std/c.zig
132
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;
|
||||
@ -6326,16 +6358,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 +6419,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.
|
||||
},
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
|
||||
@ -7068,53 +7068,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;
|
||||
|
||||
|
@ -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),
|
||||
@ -314,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;
|
||||
@ -323,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,
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
@ -368,66 +387,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;
|
||||
|
||||
|
@ -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),
|
||||
@ -292,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;
|
||||
@ -303,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,
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
@ -346,66 +366,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;
|
||||
|
||||
|
@ -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,
|
||||
|
||||
_,
|
||||
};
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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 {
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user