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,
.sh,
.sheb,
.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,
}
The native operating system's
ucontext_tas 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.xforaarch64-linuxandaarch64-freebsdeven 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.