zig/lib/std/os
mlugg a18fd41064
std: rework/remove ucontext_t
Our usage of `ucontext_t` in the standard library was kind of
problematic. We unnecessarily mimiced libc-specific structures, and our
`getcontext` implementation was overkill for our use case of stack
tracing.

This commit introduces a new namespace, `std.debug.cpu_context`, which
contains "context" types for various architectures (currently x86,
x86_64, ARM, and AARCH64) containing the general-purpose CPU registers;
the ones needed in practice for stack unwinding. Each implementation has
a function `current` which populates the structure using inline
assembly. The structure is user-overrideable, though that should only be
necessary if the standard library does not have an implementation for
the *architecture*: that is to say, none of this is OS-dependent.

Of course, in POSIX signal handlers, we get a `ucontext_t` from the
kernel. The function `std.debug.cpu_context.fromPosixSignalContext`
converts this to a `std.debug.cpu_context.Native` with a big ol' target
switch.

This functionality is not exposed from `std.c` or `std.posix`, and
neither are `ucontext_t`, `mcontext_t`, or `getcontext`. The rationale
is that these types and functions do not conform to a specific ABI, and
in fact tend to get updated over time based on CPU features and
extensions; in addition, different libcs use different structures which
are "partially compatible" with the kernel structure. Overall, it's a
mess, but all we need is the kernel context, so we can just define a
kernel-compatible structure as long as we don't claim C compatibility by
putting it in `std.c` or `std.posix`.

This change resulted in a few nice `std.debug` simplifications, but
nothing too noteworthy. However, the main benefit of this change is that
DWARF unwinding---sometimes necessary for collecting stack traces
reliably---now requires far less target-specific integration.

Also fix a bug I noticed in `PageAllocator` (I found this due to a bug
in my distro's QEMU distribution; thanks, broken QEMU patch!) and I
think a couple of minor bugs in `std.debug`.

Resolves: #23801
Resolves: #23802
2025-09-30 13:44:54 +01:00
..
linux std: rework/remove ucontext_t 2025-09-30 13:44:54 +01:00
plan9 zig fmt 2025-07-16 10:27:39 -07:00
uefi std.Io: delete GenericReader 2025-08-29 17:14:26 -07:00
windows update format strings in os/windows/test.zig 2025-07-08 08:46:31 -07:00
emscripten.zig sigset_t: sigemptyset() and sigfillset() are functions that return sigset_t 2025-04-30 20:32:04 -07:00
freebsd.zig std: rework/remove ucontext_t 2025-09-30 13:44:54 +01:00
linux.zig std: rework/remove ucontext_t 2025-09-30 13:44:54 +01:00
plan9.zig sigset_t: sigemptyset() and sigfillset() are functions that return sigset_t 2025-04-30 20:32:04 -07:00
uefi.zig std.Io: delete GenericReader 2025-08-29 17:14:26 -07:00
wasi.zig wasi: fix wasm-wasi-musl constants 2025-02-09 09:08:11 +01:00
windows.zig replace usages of old std.debug APIs 2025-09-30 13:44:51 +01:00