aboutsummaryrefslogtreecommitdiff
path: root/lib/std/os/linux
diff options
context:
space:
mode:
authorAlex Rønne Petersen <alex@alexrp.com>2025-05-01 21:29:23 +0200
committerGitHub <noreply@github.com>2025-05-01 21:29:23 +0200
commitad9cb401124e4b2d59e49bed2736aad7813e4f1d (patch)
tree7bafd4a5dac886e67bb8f63ecfa22ae3bb2084c1 /lib/std/os/linux
parent971d19a3b2ca97b9acd00d74556a57a335898ed8 (diff)
parenta55ecd7532e7ae015afe5cb5bc16b89376a4bf56 (diff)
downloadzig-ad9cb401124e4b2d59e49bed2736aad7813e4f1d.tar.gz
zig-ad9cb401124e4b2d59e49bed2736aad7813e4f1d.zip
Merge pull request #23601 from rootbeer/sig-split
Split glibc and linux sigset_t ABIs and the accessor functions
Diffstat (limited to 'lib/std/os/linux')
-rw-r--r--lib/std/os/linux/aarch64.zig2
-rw-r--r--lib/std/os/linux/arm.zig2
-rw-r--r--lib/std/os/linux/loongarch64.zig3
-rw-r--r--lib/std/os/linux/powerpc.zig2
-rw-r--r--lib/std/os/linux/powerpc64.zig2
-rw-r--r--lib/std/os/linux/s390x.zig2
-rw-r--r--lib/std/os/linux/sparc64.zig2
-rw-r--r--lib/std/os/linux/test.zig49
-rw-r--r--lib/std/os/linux/x86.zig2
-rw-r--r--lib/std/os/linux/x86_64.zig14
10 files changed, 59 insertions, 21 deletions
diff --git a/lib/std/os/linux/aarch64.zig b/lib/std/os/linux/aarch64.zig
index 649e474310..ed40145e1b 100644
--- a/lib/std/os/linux/aarch64.zig
+++ b/lib/std/os/linux/aarch64.zig
@@ -289,7 +289,7 @@ pub const ucontext_t = extern struct {
flags: usize,
link: ?*ucontext_t,
stack: stack_t,
- sigmask: sigset_t,
+ sigmask: [1024 / @bitSizeOf(c_ulong)]c_ulong, // Currently a libc-compatible (1024-bit) sigmask
mcontext: mcontext_t,
};
diff --git a/lib/std/os/linux/arm.zig b/lib/std/os/linux/arm.zig
index 8f83bb60a1..8fea30a5da 100644
--- a/lib/std/os/linux/arm.zig
+++ b/lib/std/os/linux/arm.zig
@@ -337,7 +337,7 @@ pub const ucontext_t = extern struct {
link: ?*ucontext_t,
stack: stack_t,
mcontext: mcontext_t,
- sigmask: sigset_t,
+ sigmask: [1024 / @bitSizeOf(c_ulong)]c_ulong, // Currently a libc-compatible (1024-bit) sigmask
regspace: [64]u64,
};
diff --git a/lib/std/os/linux/loongarch64.zig b/lib/std/os/linux/loongarch64.zig
index 9ee8fe229c..50c4664ac8 100644
--- a/lib/std/os/linux/loongarch64.zig
+++ b/lib/std/os/linux/loongarch64.zig
@@ -264,8 +264,7 @@ pub const ucontext_t = extern struct {
flags: c_ulong,
link: ?*ucontext_t,
stack: stack_t,
- sigmask: sigset_t,
- _pad: [1024 / 8 - @sizeOf(sigset_t)]u8,
+ sigmask: [1024 / @bitSizeOf(c_ulong)]c_ulong, // Currently a libc-compatible (1024-bit) sigmask
mcontext: mcontext_t,
};
diff --git a/lib/std/os/linux/powerpc.zig b/lib/std/os/linux/powerpc.zig
index 443a32769a..450cb27c7e 100644
--- a/lib/std/os/linux/powerpc.zig
+++ b/lib/std/os/linux/powerpc.zig
@@ -341,7 +341,7 @@ pub const ucontext_t = extern struct {
stack: stack_t,
pad: [7]i32,
regs: *mcontext_t,
- sigmask: sigset_t,
+ sigmask: [1024 / @bitSizeOf(c_ulong)]c_ulong, // Currently a libc-compatible (1024-bit) sigmask
pad2: [3]i32,
mcontext: mcontext_t,
};
diff --git a/lib/std/os/linux/powerpc64.zig b/lib/std/os/linux/powerpc64.zig
index bb1032fb21..b0a14ff3cb 100644
--- a/lib/std/os/linux/powerpc64.zig
+++ b/lib/std/os/linux/powerpc64.zig
@@ -337,7 +337,7 @@ pub const ucontext_t = extern struct {
flags: u32,
link: ?*ucontext_t,
stack: stack_t,
- sigmask: sigset_t,
+ sigmask: [1024 / @bitSizeOf(c_ulong)]c_ulong, // Currently a libc-compatible (1024-bit) sigmask
mcontext: mcontext_t,
};
diff --git a/lib/std/os/linux/s390x.zig b/lib/std/os/linux/s390x.zig
index 70cf53f6fd..614c33d076 100644
--- a/lib/std/os/linux/s390x.zig
+++ b/lib/std/os/linux/s390x.zig
@@ -273,7 +273,7 @@ pub const ucontext_t = extern struct {
link: ?*ucontext_t,
stack: stack_t,
mcontext: mcontext_t,
- sigmask: sigset_t,
+ sigmask: [1024 / @bitSizeOf(c_ulong)]c_ulong, // Currently a libc-compatible (1024-bit) sigmask
};
pub const mcontext_t = extern struct {
diff --git a/lib/std/os/linux/sparc64.zig b/lib/std/os/linux/sparc64.zig
index 594b11b7ac..34df73fcb1 100644
--- a/lib/std/os/linux/sparc64.zig
+++ b/lib/std/os/linux/sparc64.zig
@@ -454,7 +454,7 @@ pub const ucontext_t = extern struct {
sigmask: u64,
mcontext: mcontext_t,
stack: stack_t,
- sigset: sigset_t,
+ sigset: [1024 / @bitSizeOf(c_ulong)]c_ulong, // Currently a libc-compatible (1024-bit) sigmask
};
/// TODO
diff --git a/lib/std/os/linux/test.zig b/lib/std/os/linux/test.zig
index fa6f822329..7f5deff480 100644
--- a/lib/std/os/linux/test.zig
+++ b/lib/std/os/linux/test.zig
@@ -126,7 +126,9 @@ test "fadvise" {
}
test "sigset_t" {
- var sigset = linux.empty_sigset;
+ std.debug.assert(@sizeOf(linux.sigset_t) == (linux.NSIG / 8));
+
+ var sigset = linux.sigemptyset();
// See that none are set, then set each one, see that they're all set, then
// remove them all, and then see that none are set.
@@ -138,7 +140,6 @@ test "sigset_t" {
}
for (1..linux.NSIG) |i| {
try expectEqual(linux.sigismember(&sigset, @truncate(i)), true);
- try expectEqual(linux.sigismember(&linux.empty_sigset, @truncate(i)), false);
}
for (1..linux.NSIG) |i| {
linux.sigdelset(&sigset, @truncate(i));
@@ -147,22 +148,52 @@ test "sigset_t" {
try expectEqual(linux.sigismember(&sigset, @truncate(i)), false);
}
+ // Kernel sigset_t is either 2+ 32-bit values or 1+ 64-bit value(s).
+ const sigset_len = @typeInfo(linux.sigset_t).array.len;
+ const sigset_elemis64 = 64 == @bitSizeOf(@typeInfo(linux.sigset_t).array.child);
+
linux.sigaddset(&sigset, 1);
try expectEqual(sigset[0], 1);
- try expectEqual(sigset[1], 0);
+ if (sigset_len > 1) {
+ try expectEqual(sigset[1], 0);
+ }
linux.sigaddset(&sigset, 31);
try expectEqual(sigset[0], 0x4000_0001);
- try expectEqual(sigset[1], 0);
+ if (sigset_len > 1) {
+ try expectEqual(sigset[1], 0);
+ }
linux.sigaddset(&sigset, 36);
- try expectEqual(sigset[0], 0x4000_0001);
- try expectEqual(sigset[1], 0x8);
+ if (sigset_elemis64) {
+ try expectEqual(sigset[0], 0x8_4000_0001);
+ } else {
+ try expectEqual(sigset[0], 0x4000_0001);
+ try expectEqual(sigset[1], 0x8);
+ }
linux.sigaddset(&sigset, 64);
- try expectEqual(sigset[0], 0x4000_0001);
- try expectEqual(sigset[1], 0x8000_0008);
- try expectEqual(sigset[2], 0);
+ if (sigset_elemis64) {
+ try expectEqual(sigset[0], 0x8000_0008_4000_0001);
+ } else {
+ try expectEqual(sigset[0], 0x4000_0001);
+ try expectEqual(sigset[1], 0x8000_0008);
+ }
+}
+
+test "sigfillset" {
+ // unlike the C library, all the signals are set in the kernel-level fillset
+ const sigset = linux.sigfillset();
+ for (1..linux.NSIG) |i| {
+ try expectEqual(linux.sigismember(&sigset, @truncate(i)), true);
+ }
+}
+
+test "sigemptyset" {
+ const sigset = linux.sigemptyset();
+ for (1..linux.NSIG) |i| {
+ try expectEqual(linux.sigismember(&sigset, @truncate(i)), false);
+ }
}
test "sysinfo" {
diff --git a/lib/std/os/linux/x86.zig b/lib/std/os/linux/x86.zig
index cef0388206..41e1ec7d99 100644
--- a/lib/std/os/linux/x86.zig
+++ b/lib/std/os/linux/x86.zig
@@ -350,7 +350,7 @@ pub const ucontext_t = extern struct {
link: ?*ucontext_t,
stack: stack_t,
mcontext: mcontext_t,
- sigmask: sigset_t,
+ sigmask: [1024 / @bitSizeOf(c_ulong)]c_ulong, // Currently a libc-compatible (1024-bit) sigmask
regspace: [64]u64,
};
diff --git a/lib/std/os/linux/x86_64.zig b/lib/std/os/linux/x86_64.zig
index 90147876c8..7ef86fdcf8 100644
--- a/lib/std/os/linux/x86_64.zig
+++ b/lib/std/os/linux/x86_64.zig
@@ -369,13 +369,21 @@ pub const mcontext_t = extern struct {
reserved1: [8]usize = undefined,
};
+/// ucontext_t is part of the state pushed on the stack by the kernel for
+/// a signal handler. And also a subset of the state returned from the
+/// makecontext/getcontext/swapcontext POSIX APIs.
+///
+/// Currently this structure matches the glibc/musl layout. It contains a
+/// 1024-bit signal mask, and `fpregs_mem`. This structure should be
+/// split into one for the kernel ABI and c.zig should define a glibc/musl
+/// compatible structure.
pub const ucontext_t = extern struct {
flags: usize,
link: ?*ucontext_t,
stack: stack_t,
mcontext: mcontext_t,
- sigmask: sigset_t,
- fpregs_mem: [64]usize,
+ sigmask: [1024 / @bitSizeOf(c_ulong)]c_ulong, // Currently a glibc-compatible (1024-bit) sigmask.
+ fpregs_mem: [64]usize, // Not part of kernel ABI, only part of glibc ucontext_t
};
fn gpRegisterOffset(comptime reg_index: comptime_int) usize {
@@ -455,7 +463,7 @@ fn getContextInternal() callconv(.naked) usize {
[stack_offset] "i" (@offsetOf(ucontext_t, "stack")),
[sigprocmask] "i" (@intFromEnum(linux.SYS.rt_sigprocmask)),
[sigmask_offset] "i" (@offsetOf(ucontext_t, "sigmask")),
- [sigset_size] "i" (linux.NSIG / 8),
+ [sigset_size] "i" (@sizeOf(sigset_t)),
: "cc", "memory", "rax", "rcx", "rdx", "rdi", "rsi", "r8", "r10", "r11"
);
}