lib/sys/src/context.zig
daab053ee43316e1809a84551d573ddd1e5bf3d2
1 const capabilities = @import("capabilities.zig");
2
3 pub const required_capabilities = capabilities.pure();
4
5 pub const stackSwitchSupported = switch (capabilities.current.arch) {
6 .x86_64, .aarch64 => true,
7 else => false,
8 };
9
10 pub const JmpBuf = switch (capabilities.current.arch) {
11 .x86_64 => extern struct {
12 reg_ip: ?*anyopaque,
13 reg_rbx: i64,
14 reg_sp: ?*anyopaque,
15 reg_rbp: ?*anyopaque,
16 reg_r12: i64,
17 reg_r13: i64,
18 reg_r14: i64,
19 reg_r15: i64,
20 reg_mxcrs: u32,
21 reg_fpcr: u16,
22 context_padding: u16,
23 },
24 .aarch64 => extern struct {
25 reg_x18: i64,
26 reg_x19: i64,
27 reg_x20: i64,
28 reg_x21: i64,
29 reg_x22: i64,
30 reg_x23: i64,
31 reg_x24: i64,
32 reg_x25: i64,
33 reg_x26: i64,
34 reg_x27: i64,
35 reg_x28: i64,
36 reg_fp: ?*anyopaque,
37 reg_ip: ?*anyopaque,
38 reg_sp: ?*anyopaque,
39 reg_fpcr: i64,
40 reg_fpsr: i64,
41 reg_d8: i64,
42 reg_d9: i64,
43 reg_d10: i64,
44 reg_d11: i64,
45 reg_d12: i64,
46 reg_d13: i64,
47 reg_d14: i64,
48 reg_d15: i64,
49 },
50 else => extern struct {
51 unsupported: usize,
52 },
53 };
54
55 pub const UnwindFrame = extern struct {
56 ip: ?*anyopaque,
57 };
58
59 pub const StartFn = *const fn (?*anyopaque, ?*UnwindFrame) callconv(.c) void;
60
61 pub extern fn mp_setjmp(save: *JmpBuf) callconv(.c) usize;
62 pub extern fn mp_longjmp(jmp: *JmpBuf) callconv(.c) noreturn;
63 pub extern fn mp_stack_enter(
64 stack_base: [*]u8,
65 stack_commit_limit: [*]u8,
66 stack_limit: [*]u8,
67 return_jmp: **JmpBuf,
68 fun: StartFn,
69 arg: ?*anyopaque,
70 ) callconv(.c) ?*anyopaque;