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;