diff options
| author | Alex Rønne Petersen <alex@alexrp.com> | 2025-05-01 21:29:23 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-05-01 21:29:23 +0200 |
| commit | ad9cb401124e4b2d59e49bed2736aad7813e4f1d (patch) | |
| tree | 7bafd4a5dac886e67bb8f63ecfa22ae3bb2084c1 /lib/std/os/linux | |
| parent | 971d19a3b2ca97b9acd00d74556a57a335898ed8 (diff) | |
| parent | a55ecd7532e7ae015afe5cb5bc16b89376a4bf56 (diff) | |
| download | zig-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.zig | 2 | ||||
| -rw-r--r-- | lib/std/os/linux/arm.zig | 2 | ||||
| -rw-r--r-- | lib/std/os/linux/loongarch64.zig | 3 | ||||
| -rw-r--r-- | lib/std/os/linux/powerpc.zig | 2 | ||||
| -rw-r--r-- | lib/std/os/linux/powerpc64.zig | 2 | ||||
| -rw-r--r-- | lib/std/os/linux/s390x.zig | 2 | ||||
| -rw-r--r-- | lib/std/os/linux/sparc64.zig | 2 | ||||
| -rw-r--r-- | lib/std/os/linux/test.zig | 49 | ||||
| -rw-r--r-- | lib/std/os/linux/x86.zig | 2 | ||||
| -rw-r--r-- | lib/std/os/linux/x86_64.zig | 14 |
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" ); } |
