The native operating system's ucontext_t as seen in the third argument to signal handlers.
These are dramatically simplified since we only need general-purpose registers and don't care about all the complicated extension state (floating point, vector, etc). This means that these structures are almost all shorter than the real ones, which is safe because we only access them through a pointer.
Some effort is made to have structures for the same architecture use the same access pattern,
e.g. uc.mcontext.x for aarch64-linux and aarch64-freebsd even though that's not quite how
they're declared and spelled in the C headers for both targets. Similarly, registers are typed
as unsigned everywhere even if that's not how they're declared in the C headers.
const signal_ucontext_t = switch (native_os)
const signal_ucontext_t = switch (native_os) {
.linux => switch (native_arch) {
// https://github.com/torvalds/linux/blob/cd5a0afbdf8033dc83786315d63f8b325bdba2fd/arch/alpha/include/asm/ucontext.h
.alpha => extern struct {
_flags: u64,
_link: ?*signal_ucontext_t,
_osf_sigmask: u64,
_stack: std.os.linux.stack_t,
// https://github.com/torvalds/linux/blob/cd5a0afbdf8033dc83786315d63f8b325bdba2fd/arch/alpha/include/uapi/asm/sigcontext.h
mcontext: extern struct {
_onstack: i64,
_mask: i64,
pc: u64,
_ps: i64,
r: [32]u64,
},
},
// https://github.com/torvalds/linux/blob/cd5a0afbdf8033dc83786315d63f8b325bdba2fd/arch/arm64/include/uapi/asm/ucontext.h
.aarch64,
.aarch64_be,
// https://github.com/torvalds/linux/blob/cd5a0afbdf8033dc83786315d63f8b325bdba2fd/arch/loongarch/include/uapi/asm/ucontext.h
.loongarch32,
.loongarch64,
// https://github.com/torvalds/linux/blob/cd5a0afbdf8033dc83786315d63f8b325bdba2fd/arch/powerpc/include/uapi/asm/ucontext.h
.powerpc64,
.powerpc64le,
// https://github.com/torvalds/linux/blob/cd5a0afbdf8033dc83786315d63f8b325bdba2fd/arch/riscv/include/uapi/asm/ucontext.h
.riscv32,
.riscv64,
=> extern struct {
_flags: usize,
_link: ?*signal_ucontext_t,
_stack: std.os.linux.stack_t,
_sigmask: std.os.linux.sigset_t,
_unused: [120]u8,
mcontext: switch (native_arch) {
// https://github.com/torvalds/linux/blob/cd5a0afbdf8033dc83786315d63f8b325bdba2fd/arch/arm64/include/uapi/asm/sigcontext.h
.aarch64, .aarch64_be => extern struct {
_fault_address: u64 align(16),
x: [30]u64,
lr: u64,
sp: u64,
pc: u64,
},
// https://github.com/torvalds/linux/blob/cd5a0afbdf8033dc83786315d63f8b325bdba2fd/arch/loongarch/include/uapi/asm/sigcontext.h
.loongarch32, .loongarch64 => extern struct {
pc: u64 align(16),
r: [32]u64,
},
// https://github.com/torvalds/linux/blob/cd5a0afbdf8033dc83786315d63f8b325bdba2fd/arch/powerpc/include/uapi/asm/sigcontext.h
.powerpc64, .powerpc64le => extern struct {
_unused: [4]u64,
_signal: i32,
_pad: i32,
_handler: u64,
_oldmask: u64,
_regs: ?*anyopaque,
r: [32]u64,
pc: u64,
_msr: u64,
_orig_r3: u64,
_ctr: u64,
lr: u64,
},
// https://github.com/torvalds/linux/blob/cd5a0afbdf8033dc83786315d63f8b325bdba2fd/arch/riscv/include/uapi/asm/sigcontext.h
.riscv32, .riscv64 => extern struct {
pc: usize align(16),
ra_sp_gp_tp: [4]usize,
t0_2: [3]usize,
s0_1: [2]usize,
a: [8]usize,
s2_11: [10]usize,
t3_6: [4]usize,
},
else => unreachable,
},
},
// https://github.com/torvalds/linux/blob/cd5a0afbdf8033dc83786315d63f8b325bdba2fd/include/uapi/asm-generic/ucontext.h
.arc,
.arceb,
.arm,
.armeb,
.thumb,
.thumbeb,
.csky,
.hexagon,
.hppa,
.hppa64,
.m68k,
.mips,
.mipsel,
.mips64,
.mips64el,
.or1k,
.s390x,
.x86,
.x86_64,
.xtensa,
.xtensaeb,
=> extern struct {
_flags: usize,
_link: ?*signal_ucontext_t,
_stack: std.os.linux.stack_t,
mcontext: switch (native_arch) {
// https://github.com/torvalds/linux/blob/cd5a0afbdf8033dc83786315d63f8b325bdba2fd/arch/arc/include/uapi/asm/sigcontext.h
.arc, .arceb => extern struct {
_pad1: u32,
_bta: u32,
_lp: extern struct {
_start: u32,
_end: u32,
_count: u32,
},
_status32: u32,
pcl: u32,
r31: u32,
r27_26: [2]u32,
r12_0: [13]u32,
r28: u32,
_pad2: u32,
r25_13: [13]u32,
_efa: u32,
_stop_pc: u32,
r30: u32,
},
// https://github.com/torvalds/linux/blob/cd5a0afbdf8033dc83786315d63f8b325bdba2fd/arch/arm/include/uapi/asm/sigcontext.h
.arm, .armeb, .thumb, .thumbeb => extern struct {
_trap_no: u32,
_error_code: u32,
_oldmask: u32,
r: [15]u32,
pc: u32,
},
// https://github.com/torvalds/linux/blob/cd5a0afbdf8033dc83786315d63f8b325bdba2fd/arch/csky/include/uapi/asm/sigcontext.h
.csky => extern struct {
r31: u32,
r15: u32,
pc: u32,
_sr: u32,
r14: u32,
_orig_a0: u32,
r0_13: [14]u32,
r16_30: [15]u32,
},
// https://github.com/torvalds/linux/blob/cd5a0afbdf8033dc83786315d63f8b325bdba2fd/arch/hexagon/include/uapi/asm/sigcontext.h
.hexagon => extern struct {
r: [32]u32 align(8),
_salc: [2]extern struct {
_sa: u32,
_lc: u32,
},
_m: [2]u32,
_usr: u32,
_p: u32,
_gp: u32,
_ugp: u32,
pc: u32,
},
// https://github.com/torvalds/linux/blob/cd5a0afbdf8033dc83786315d63f8b325bdba2fd/arch/parisc/include/uapi/asm/sigcontext.h
.hppa, .hppa64 => extern struct {
_flags: usize,
_psw: usize,
r1_19: [19]usize,
r20: usize,
r21: usize,
r22: usize,
r23_29: [7]usize,
r30: usize,
r31: usize,
_fr: [32]f64,
_iasq: [2]usize,
iaoq: [2]usize,
},
// https://github.com/torvalds/linux/blob/cd5a0afbdf8033dc83786315d63f8b325bdba2fd/arch/m68k/include/asm/ucontext.h
.m68k => extern struct {
_version: i32,
d: [8]u32,
a: [8]u32,
pc: u32,
},
// https://github.com/torvalds/linux/blob/cd5a0afbdf8033dc83786315d63f8b325bdba2fd/arch/microblaze/include/uapi/asm/sigcontext.h
.microblaze, .microblazeel => extern struct {
r: [32]u32,
pc: u32,
},
// https://github.com/torvalds/linux/blob/cd5a0afbdf8033dc83786315d63f8b325bdba2fd/arch/mips/include/uapi/asm/sigcontext.h
.mips, .mipsel => extern struct {
_regmask: u32,
_status: u32,
// ??? A spectacularly failed attempt to be future-proof?
pc: u64,
r: [32]u64,
},
// https://github.com/torvalds/linux/blob/cd5a0afbdf8033dc83786315d63f8b325bdba2fd/arch/mips/include/uapi/asm/sigcontext.h
.mips64, .mips64el => extern struct {
r: [32]u64,
_fpregs: [32]u64,
_hi: [4]u64,
_lo: [4]u64,
pc: u64,
},
// https://github.com/torvalds/linux/blob/cd5a0afbdf8033dc83786315d63f8b325bdba2fd/arch/openrisc/include/uapi/asm/sigcontext.h
.or1k => extern struct {
r: [32]u32,
pc: u32,
},
// https://github.com/torvalds/linux/blob/cd5a0afbdf8033dc83786315d63f8b325bdba2fd/arch/s390/include/uapi/asm/sigcontext.h
.s390x => extern struct {
psw: extern struct {
mask: u64,
addr: u64,
},
r: [16]u64,
},
// https://github.com/torvalds/linux/blob/cd5a0afbdf8033dc83786315d63f8b325bdba2fd/arch/sh/include/uapi/asm/sigcontext.h
.sh, .sheb => extern struct {
_oldmask: u32,
r: [16]u32,
pc: u32,
pr: u32,
},
// https://github.com/torvalds/linux/blob/cd5a0afbdf8033dc83786315d63f8b325bdba2fd/arch/x86/include/uapi/asm/sigcontext.h
.x86 => extern struct {
_gs: u32,
_fs: u32,
_es: u32,
_ds: u32,
edi: u32,
esi: u32,
ebp: u32,
esp: u32,
ebx: u32,
edx: u32,
ecx: u32,
eax: u32,
_trapno: u32,
_err: u32,
eip: u32,
},
// https://github.com/torvalds/linux/blob/cd5a0afbdf8033dc83786315d63f8b325bdba2fd/arch/x86/include/uapi/asm/sigcontext.h
.x86_64 => extern struct {
r8: u64,
r9: u64,
r10: u64,
r11: u64,
r12: u64,
r13: u64,
r14: u64,
r15: u64,
rdi: u64,
rsi: u64,
rbp: u64,
rbx: u64,
rdx: u64,
rax: u64,
rcx: u64,
rsp: u64,
rip: u64,
},
// https://github.com/torvalds/linux/blob/cd5a0afbdf8033dc83786315d63f8b325bdba2fd/arch/xtensa/include/uapi/asm/sigcontext.h
.xtensa, .xtensaeb => extern struct {
pc: u32,
_ps: u32,
_l: extern struct {
_beg: u32,
_end: u32,
_count: u32,
},
_sar: u32,
_acc: extern struct {
_lo: u32,
_hi: u32,
},
a: [16]u32,
},
else => unreachable,
},
},
// https://github.com/torvalds/linux/blob/cd5a0afbdf8033dc83786315d63f8b325bdba2fd/arch/powerpc/include/uapi/asm/ucontext.h
.powerpc, .powerpcle => extern struct {
_flags: u32,
_link: ?*signal_ucontext_t,
_stack: std.os.linux.stack_t,
_pad1: [7]i32,
_regs: ?*anyopaque,
_sigmask: std.os.linux.sigset_t,
_unused: [120]u8,
_pad2: [3]i32,
mcontext: extern struct {
r: [32]u32 align(16),
pc: u32,
_msr: u32,
_orig_r3: u32,
_ctr: u32,
lr: u32,
},
},
// https://github.com/torvalds/linux/blob/cd5a0afbdf8033dc83786315d63f8b325bdba2fd/arch/sparc/kernel/signal_32.c#L48-L49
.sparc => extern struct {
// Not actually a `ucontext_t` at all because, uh, reasons?
_info: std.os.linux.siginfo_t,
mcontext: extern struct {
_psr: u32,
pc: u32,
_npc: u32,
_y: u32,
g: [8]u32,
o: [8]u32,
},
},
// https://github.com/torvalds/linux/blob/cd5a0afbdf8033dc83786315d63f8b325bdba2fd/arch/sparc/kernel/signal_64.c#L247-L248
.sparc64 => extern struct {
// Ditto...
_info: std.os.linux.siginfo_t,
mcontext: extern struct {
g: [8]u64,
o: [8]u64,
_tstate: u64,
pc: u64,
},
},
else => unreachable,
},
// https://github.com/freebsd/freebsd-src/blob/55c28005f544282b984ae0e15dacd0c108d8ab12/sys/sys/_ucontext.h
.freebsd => extern struct {
_sigmask: std.c.sigset_t,
mcontext: switch (native_arch) {
// https://github.com/freebsd/freebsd-src/blob/55c28005f544282b984ae0e15dacd0c108d8ab12/sys/arm64/include/ucontext.h
.aarch64 => extern struct {
x: [30]u64 align(16),
lr: u64,
sp: u64,
pc: u64,
},
// https://github.com/freebsd/freebsd-src/blob/55c28005f544282b984ae0e15dacd0c108d8ab12/sys/arm/include/ucontext.h
.arm => extern struct {
r: [15]u32,
pc: u32,
},
// https://github.com/freebsd/freebsd-src/blob/55c28005f544282b984ae0e15dacd0c108d8ab12/sys/powerpc/include/ucontext.h
.powerpc64, .powerpc64le => extern struct {
_vers: i32 align(16),
_flags: i32,
_onstack: i32,
_len: i32,
_avec: [32 * 2]u64,
_av: [2]u32,
r: [32]u64,
lr: u64,
_cr: u64,
_xer: u64,
_ctr: u64,
pc: u64,
},
// https://github.com/freebsd/freebsd-src/blob/55c28005f544282b984ae0e15dacd0c108d8ab12/sys/riscv/include/ucontext.h
.riscv64 => extern struct {
ra_sp_gp_tp: [4]u64,
t0_2: [3]u64,
t3_6: [4]u64,
s0_1: [2]u64,
s2_11: [10]u64,
a: [8]u64,
pc: u64,
},
// https://github.com/freebsd/freebsd-src/blob/55c28005f544282b984ae0e15dacd0c108d8ab12/sys/x86/include/ucontext.h
.x86 => extern struct {
_onstack: i32 align(16),
_gs: i32,
_fs: i32,
_es: i32,
_ds: i32,
edi: u32,
esi: u32,
ebp: u32,
_isp: i32,
ebx: u32,
edx: u32,
ecx: u32,
eax: u32,
_trapno: i32,
_err: i32,
eip: u32,
_cs: i32,
_eflags: i32,
esp: u32,
},
// https://github.com/freebsd/freebsd-src/blob/55c28005f544282b984ae0e15dacd0c108d8ab12/sys/x86/include/ucontext.h
.x86_64 => extern struct {
_onstack: i64 align(16),
rdi: u64,
rsi: u64,
rdx: u64,
rcx: u64,
r8: u64,
r9: u64,
rax: u64,
rbx: u64,
rbp: u64,
r10: u64,
r11: u64,
r12: u64,
r13: u64,
r14: u64,
r15: u64,
_trapno: i32,
_fs: i16,
_gs: i16,
_addr: i64,
_flags: i32,
_es: i16,
_ds: i16,
_err: i64,
rip: u64,
_cs: i64,
_rflags: i64,
rsp: u64,
},
else => unreachable,
},
},
// https://github.com/ziglang/zig/blob/60be67d3c0ba6ae15fa7115596734ab1e74fbcd3/lib/libc/include/any-macos-any/sys/_types/_ucontext.h
.driverkit, .ios, .maccatalyst, .macos, .tvos, .watchos, .visionos => extern struct {
_onstack: i32,
_sigmask: std.c.sigset_t,
_stack: std.c.stack_t,
_link: ?*signal_ucontext_t,
_mcsize: u64,
mcontext: *switch (native_arch) {
// https://github.com/ziglang/zig/blob/60be67d3c0ba6ae15fa7115596734ab1e74fbcd3/lib/libc/include/any-macos-any/arm/_mcontext.h
// https://github.com/ziglang/zig/blob/60be67d3c0ba6ae15fa7115596734ab1e74fbcd3/lib/libc/include/any-macos-any/mach/arm/_structs.h
.aarch64 => extern struct {
_far: u64 align(16),
_esr: u64,
x: [30]u64,
lr: u64,
sp: u64,
pc: u64,
},
// https://github.com/ziglang/zig/blob/60be67d3c0ba6ae15fa7115596734ab1e74fbcd3/lib/libc/include/any-macos-any/i386/_mcontext.h
// https://github.com/ziglang/zig/blob/60be67d3c0ba6ae15fa7115596734ab1e74fbcd3/lib/libc/include/any-macos-any/mach/i386/_structs.h
.x86_64 => extern struct {
_trapno: u16,
_cpu: u16,
_err: u32,
_faultvaddr: u64,
rax: u64,
rbx: u64,
rcx: u64,
rdx: u64,
rdi: u64,
rsi: u64,
rbp: u64,
rsp: u64,
r8: u64,
r9: u64,
r10: u64,
r11: u64,
r12: u64,
r13: u64,
r14: u64,
r15: u64,
rip: u64,
},
else => unreachable,
},
},
// https://github.com/illumos/illumos-gate/blob/d4ce137bba3bd16823db6374d9e9a643264ce245/usr/src/uts/intel/sys/ucontext.h
.illumos => extern struct {
_flags: usize,
_link: ?*signal_ucontext_t,
_sigmask: std.c.sigset_t,
_stack: std.c.stack_t,
mcontext: switch (native_arch) {
// https://github.com/illumos/illumos-gate/blob/d4ce137bba3bd16823db6374d9e9a643264ce245/usr/src/uts/intel/sys/mcontext.h
.x86 => extern struct {
_gs: u32,
_fs: u32,
_es: u32,
_ds: u32,
edi: u32,
esi: u32,
ebp: u32,
esp: u32,
ebx: u32,
edx: u32,
ecx: u32,
eax: u32,
_trapno: i32,
_err: i32,
eip: u32,
},
// https://github.com/illumos/illumos-gate/blob/d4ce137bba3bd16823db6374d9e9a643264ce245/usr/src/uts/intel/sys/mcontext.h
.x86_64 => extern struct {
r15: u64 align(16),
r14: u64,
r13: u64,
r12: u64,
r11: u64,
r10: u64,
r9: u64,
r8: u64,
rdi: u64,
rsi: u64,
rbp: u64,
rbx: u64,
rdx: u64,
rcx: u64,
rax: u64,
_trapno: i64,
_err: i64,
rip: u64,
_cs: i64,
_rflags: i64,
rsp: u64,
},
else => unreachable,
},
},
.openbsd => switch (native_arch) {
// https://github.com/openbsd/src/blob/42468faed8369d07ae49ae02dd71ec34f59b66cd/sys/arch/arm64/include/signal.h
.aarch64 => extern struct {
_unused: i32,
_mask: i32,
mcontext: extern struct {
sp: u64,
lr: u64,
pc: u64,
_spsr: u64,
x: [30]u64,
},
},
// https://github.com/openbsd/src/blob/42468faed8369d07ae49ae02dd71ec34f59b66cd/sys/arch/alpha/include/signal.h
.alpha => extern struct {
_cookie: i64,
_mask: i64,
mcontext: extern struct {
pc: u64,
_ps: i64,
r: [32]u64,
},
},
// https://github.com/openbsd/src/blob/42468faed8369d07ae49ae02dd71ec34f59b66cd/sys/arch/arm/include/signal.h
.arm => extern struct {
_cookie: i32,
_mask: i32,
mcontext: extern struct {
_spsr: u32 align(8),
r: [15]u32,
_svc_lr: u32,
pc: u32,
},
},
// https://github.com/openbsd/src/blob/42468faed8369d07ae49ae02dd71ec34f59b66cd/sys/arch/hppa/include/signal.h
.hppa => extern struct {
_unused: u32,
_mask: i32,
_fp: u32,
iaoq: [2]u32,
_resv: [2]u32,
r22: u32,
r21: u32,
r30: u32,
r20: u32,
_sar: u32,
r1_19: [19]u32,
r23_29: [7]u32,
r31: u32,
},
// https://github.com/openbsd/src/blob/42468faed8369d07ae49ae02dd71ec34f59b66cd/sys/arch/m88k/include/signal.h
.m88k => extern struct {
_cookie: i32,
_mask: i32,
mcontext: extern struct {
r: [32]u32,
_epsr: u32,
_fpsr: u32,
_fpcr: u32,
xip: u32,
},
},
// https://github.com/openbsd/src/blob/42468faed8369d07ae49ae02dd71ec34f59b66cd/sys/arch/mips64/include/signal.h
.mips64, .mips64el => extern struct {
_cookie: i64,
_mask: i64,
mcontext: extern struct {
pc: u64,
r: [32]u64,
},
},
// https://github.com/openbsd/src/blob/42468faed8369d07ae49ae02dd71ec34f59b66cd/sys/arch/powerpc/include/signal.h
// https://github.com/openbsd/src/blob/42468faed8369d07ae49ae02dd71ec34f59b66cd/sys/arch/powerpc64/include/signal.h
.powerpc, .powerpc64 => extern struct {
_cookie: isize,
_mask: i32,
mcontext: extern struct {
r: [32]usize,
lr: usize,
_cr: usize,
_xer: usize,
_ctr: usize,
pc: usize,
},
},
// https://github.com/openbsd/src/blob/42468faed8369d07ae49ae02dd71ec34f59b66cd/sys/arch/riscv64/include/signal.h
.riscv64 => extern struct {
_unused: i32,
_mask: i32,
mcontext: extern struct {
ra_sp_gp_tp: [4]u64,
t0_2: [3]u64,
t3_6: [4]u64,
s0_1: [2]u64,
s2_11: [10]u64,
a: [8]u64,
pc: u64,
},
},
// https://github.com/openbsd/src/blob/42468faed8369d07ae49ae02dd71ec34f59b66cd/sys/arch/sparc64/include/signal.h
.sparc64 => @compileError("sparc64-openbsd ucontext_t missing"),
// https://github.com/openbsd/src/blob/42468faed8369d07ae49ae02dd71ec34f59b66cd/sys/arch/sh/include/signal.h
.sh => extern struct {
pc: u32,
_sr: i32,
_gbr: i32,
_macl: i32,
_mach: i32,
pr: u32,
r13_0: [14]u32,
r15: u32,
r14: u32,
},
// https://github.com/openbsd/src/blob/42468faed8369d07ae49ae02dd71ec34f59b66cd/sys/arch/i386/include/signal.h
.x86 => extern struct {
mcontext: extern struct {
_gs: i32,
_fs: i32,
_es: i32,
_ds: i32,
edi: u32,
esi: u32,
ebp: u32,
ebx: u32,
edx: u32,
ecx: u32,
eax: u32,
eip: u32,
_cs: i32,
_eflags: i32,
esp: u32,
},
},
// https://github.com/openbsd/src/blob/42468faed8369d07ae49ae02dd71ec34f59b66cd/sys/arch/amd64/include/signal.h
.x86_64 => extern struct {
mcontext: extern struct {
rdi: u64,
rsi: u64,
rdx: u64,
rcx: u64,
r8: u64,
r9: u64,
r10: u64,
r11: u64,
r12: u64,
r13: u64,
r14: u64,
r15: u64,
rbp: u64,
rbx: u64,
rax: u64,
_gs: i64,
_fs: i64,
_es: i64,
_ds: i64,
_trapno: i64,
_err: i64,
rip: u64,
_cs: i64,
_rflags: i64,
rsp: u64,
},
},
else => unreachable,
},
// https://github.com/NetBSD/src/blob/861008c62187bf7bc0aac4d81e52ed6eee4d0c74/sys/sys/ucontext.h
.netbsd => extern struct {
_flags: u32,
_link: ?*signal_ucontext_t,
_sigmask: std.c.sigset_t,
_stack: std.c.stack_t,
mcontext: switch (native_arch) {
// https://github.com/NetBSD/src/blob/861008c62187bf7bc0aac4d81e52ed6eee4d0c74/sys/arch/arm/include/mcontext.h
.aarch64, .aarch64_be => extern struct {
x: [30]u64 align(16),
lr: u64,
sp: u64,
pc: u64,
},
// https://github.com/NetBSD/src/blob/861008c62187bf7bc0aac4d81e52ed6eee4d0c74/sys/arch/alpha/include/mcontext.h
.alpha => extern struct {
r: [32]u64,
pc: u64,
},
// https://github.com/NetBSD/src/blob/861008c62187bf7bc0aac4d81e52ed6eee4d0c74/sys/arch/arm/include/mcontext.h
.arm, .armeb => extern struct {
r: [15]u32 align(8),
pc: u32,
},
// https://github.com/NetBSD/src/blob/861008c62187bf7bc0aac4d81e52ed6eee4d0c74/sys/arch/hppa/include/mcontext.h
.hppa => extern struct {
r1_19: [19]u32 align(8),
r20: u32,
r21: u32,
r22: u32,
r23_29: [7]u32,
r30: u32,
r31: u32,
_sar: u32,
_pcsqh: u32,
_pcsqt: u32,
iaoq: [2]u32,
},
// https://github.com/NetBSD/src/blob/861008c62187bf7bc0aac4d81e52ed6eee4d0c74/sys/arch/m68k/include/mcontext.h
.m68k => extern struct {
d: [8]u32,
a: [8]u32,
pc: u32,
},
// https://github.com/NetBSD/src/blob/861008c62187bf7bc0aac4d81e52ed6eee4d0c74/sys/arch/mips/include/mcontext.h
.mips, .mipsel => extern struct {
r: [32]u32 align(8),
_lo: i32,
_hi: i32,
_cause: i32,
pc: u32,
},
// https://github.com/NetBSD/src/blob/861008c62187bf7bc0aac4d81e52ed6eee4d0c74/sys/arch/mips/include/mcontext.h
.mips64, .mips64el => @compileError("https://github.com/ziglang/zig/issues/23765#issuecomment-2880386178"),
// https://github.com/NetBSD/src/blob/861008c62187bf7bc0aac4d81e52ed6eee4d0c74/sys/arch/powerpc/include/mcontext.h
.powerpc => extern struct {
r: [32]u32 align(16),
_cr: i32,
lr: u32,
pc: u32,
},
// https://github.com/NetBSD/src/blob/861008c62187bf7bc0aac4d81e52ed6eee4d0c74/sys/arch/riscv/include/mcontext.h
.riscv32, .riscv64 => extern struct {
ra_sp_gp_tp: [4]usize align(8),
t0_2: [3]usize,
s0_1: [2]usize,
a: [8]usize,
s2_11: [10]usize,
t3_6: [4]usize,
pc: usize,
},
// https://github.com/NetBSD/src/blob/861008c62187bf7bc0aac4d81e52ed6eee4d0c74/sys/arch/sparc/include/mcontext.h
.sparc => @compileError("sparc-netbsd mcontext_t missing"),
.sparc64 => @compileError("sparc64-netbsd mcontext_t missing"),
// https://github.com/NetBSD/src/blob/861008c62187bf7bc0aac4d81e52ed6eee4d0c74/sys/arch/sh3/include/mcontext.h
.sh, .sheb => extern struct {
_gbr: i32,
pc: u32,
_sr: i32,
_macl: i32,
_mach: i32,
pr: u32,
r14: u32,
r13_0: [14]u32,
r15: u32,
},
// https://github.com/NetBSD/src/blob/861008c62187bf7bc0aac4d81e52ed6eee4d0c74/sys/arch/i386/include/mcontext.h
.x86 => extern struct {
_gs: i32,
_fs: i32,
_es: i32,
_ds: i32,
edi: u32,
esi: u32,
ebp: u32,
esp: u32,
ebx: u32,
edx: u32,
ecx: u32,
eax: u32,
_trapno: i32,
_err: i32,
eip: u32,
},
// https://github.com/NetBSD/src/blob/861008c62187bf7bc0aac4d81e52ed6eee4d0c74/sys/arch/amd64/include/mcontext.h
.x86_64 => extern struct {
rdi: u64,
rsi: u64,
rdx: u64,
rcx: u64,
r8: u64,
r9: u64,
r10: u64,
r11: u64,
r12: u64,
r13: u64,
r14: u64,
r15: u64,
rbp: u64,
rbx: u64,
rax: u64,
_gs: i64,
_fs: i64,
_es: i64,
_ds: i64,
_trapno: i64,
_err: i64,
rip: u64,
_cs: i64,
_rflags: i64,
rsp: u64,
},
else => unreachable,
},
},
// https://github.com/DragonFlyBSD/DragonFlyBSD/blob/3de1e9d36269616d22237f19d60a737a41271ab5/sys/sys/_ucontext.h
.dragonfly => extern struct {
_sigmask: std.c.sigset_t,
mcontext: switch (native_arch) {
// https://github.com/DragonFlyBSD/DragonFlyBSD/blob/3de1e9d36269616d22237f19d60a737a41271ab5/sys/cpu/x86_64/include/ucontext.h
.x86_64 => extern struct {
_onstack: i64 align(64),
rdi: u64,
rsi: u64,
rdx: u64,
rcx: u64,
r8: u64,
r9: u64,
rax: u64,
rbx: u64,
rbp: u64,
r10: u64,
r11: u64,
r12: u64,
r13: u64,
r14: u64,
r15: u64,
_xflags: i64,
_trapno: i64,
_addr: i64,
_flags: i64,
_err: i64,
rip: u64,
_cs: i64,
_rflags: i64,
rsp: u64,
},
else => unreachable,
},
},
// https://github.com/SerenityOS/serenity/blob/103d6a07de9e28f3c94dfa2351b9af76a49ba6e6/Kernel/API/POSIX/ucontext.h
.serenity => extern struct {
_link: ?*signal_ucontext_t,
_sigmask: std.c.sigset_t,
_stack: std.c.stack_t,
mcontext: switch (native_arch) {
// https://github.com/SerenityOS/serenity/blob/103d6a07de9e28f3c94dfa2351b9af76a49ba6e6/Kernel/Arch/aarch64/mcontext.h
.aarch64 => extern struct {
x: [30]u64,
lr: u64,
sp: u64,
pc: u64,
},
// https://github.com/SerenityOS/serenity/blob/103d6a07de9e28f3c94dfa2351b9af76a49ba6e6/Kernel/Arch/riscv64/mcontext.h
.riscv64 => extern struct {
ra_sp_gp_tp: [4]u64,
t0_2: [3]u64,
s0_1: [2]u64,
a: [8]u64,
s2_11: [10]u64,
t3_6: [4]u64,
pc: u64,
},
// https://github.com/SerenityOS/serenity/blob/103d6a07de9e28f3c94dfa2351b9af76a49ba6e6/Kernel/Arch/x86_64/mcontext.h
.x86_64 => extern struct {
rax: u64,
rcx: u64,
rdx: u64,
rbx: u64,
rsp: u64,
rbp: u64,
rsi: u64,
rdi: u64,
rip: u64,
r8: u64,
r9: u64,
r10: u64,
r11: u64,
r12: u64,
r13: u64,
r14: u64,
r15: u64,
},
else => unreachable,
},
},
// https://github.com/haiku/haiku/blob/47538c534fe0aadc626c09d121773fee8ea10d71/headers/posix/signal.h#L356
.haiku => extern struct {
_link: ?*signal_ucontext_t,
_sigmask: std.c.sigset_t,
_stack: std.c.stack_t,
mcontext: switch (native_arch) {
// https://github.com/haiku/haiku/blob/47538c534fe0aadc626c09d121773fee8ea10d71/headers/posix/arch/arm/signal.h
.arm => extern struct {
r: [15]u32 align(8),
pc: u32,
},
// https://github.com/haiku/haiku/blob/47538c534fe0aadc626c09d121773fee8ea10d71/headers/posix/arch/arm64/signal.h
.aarch64 => extern struct {
x: [30]u64 align(16),
lr: u64,
sp: u64,
pc: u64,
},
// https://github.com/haiku/haiku/blob/47538c534fe0aadc626c09d121773fee8ea10d71/headers/posix/arch/riscv64/signal.h
.riscv64 => extern struct {
ra_sp_gp_tp: [4]u64,
t0_2: [3]u64,
s0_1: [2]u64,
a: [8]u64,
s2_11: [10]u64,
t3_6: [4]u64,
pc: u64,
},
// https://github.com/haiku/haiku/blob/47538c534fe0aadc626c09d121773fee8ea10d71/headers/posix/arch/x86/signal.h
.x86 => extern struct {
eip: u32,
_eflags: u32,
eax: u32,
ecx: u32,
edx: u32,
esp: u32,
ebp: u32,
_reserved: u32,
_xregs: extern struct {
_fp_control: u16,
_fp_status: u16,
_fp_tag: u16,
_fp_opcode: u16,
_fp_eip: u32,
_fp_cs: u16,
_reserved1: u16,
_fp_datap: u32,
_fp_ds: u16,
_reserved2: u16,
_mxcsr: u32,
_mxcsr_mask: u32,
_mmx: [8][16]u8,
_xmmx: [8][16]u8,
_reserved3: [176]u8,
_fault_address: u32,
_error_code: u32,
_cs: u16,
_ds: u16,
_es: u16,
_fs: u16,
_gs: u16,
_ss: u16,
_trap_number: u8,
_reserved4: [27]u8,
_format: u32,
},
edi: u32,
esi: u32,
ebx: u32,
},
// https://github.com/haiku/haiku/blob/47538c534fe0aadc626c09d121773fee8ea10d71/headers/posix/arch/x86_64/signal.h
.x86_64 => extern struct {
rax: u64,
rbx: u64,
rcx: u64,
rdx: u64,
rdi: u64,
rsi: u64,
rbp: u64,
r8: u64,
r9: u64,
r10: u64,
r11: u64,
r12: u64,
r13: u64,
r14: u64,
r15: u64,
rsp: u64,
rip: u64,
},
else => unreachable,
},
},
else => void,
}