1#include <compiler/core.h>
2#include <setjmp.h>
3#include <stdint.h>
4
5/*
6 * Offsets:
7 * 0: RBX
8 * 1: RBP
9 * 2: R12
10 * 3: R13
11 * 4: R14
12 * 5: R15
13 * 6: RSP
14 * 7: RIP
15 */
16
17cc_naked int setjmp(jmp_buf cc_unused env) {
18 asm volatile("movq %rbx, (%rdi)\n\t"
19 "movq %rbp, 8(%rdi)\n\t"
20 "movq %r12, 16(%rdi)\n\t"
21 "movq %r13, 24(%rdi)\n\t"
22 "movq %r14, 32(%rdi)\n\t"
23 "movq %r15, 40(%rdi)\n\t"
24
25 "leaq 8(%rsp), %rax\n\t"
26 "movq %rax, 48(%rdi)\n\t"
27
28 "movq (%rsp), %rax\n\t"
29 "movq %rax, 56(%rdi)\n\t"
30
31 "xorq %rax, %rax\n\t"
32 "retq");
33}
34
35cc_naked void longjmp(jmp_buf cc_unused env, int cc_unused val) {
36 asm volatile("movq (%rdi), %rbx\n\t"
37 "movq 8(%rdi), %rbp\n\t"
38 "movq 16(%rdi), %r12\n\t"
39 "movq 24(%rdi), %r13\n\t"
40 "movq 32(%rdi), %r14\n\t"
41 "movq 40(%rdi), %r15\n\t"
42
43 "movq 48(%rdi), %rsp\n\t"
44
45 "movq 56(%rdi), %rdx\n\t"
46
47 "movl %esi, %eax\n\t"
48 "testl %eax, %eax\n\t"
49 "jne 1f\n\t"
50 "movl $1, %eax\n\t"
51
52 "1:\n\t"
53 "jmp *%rdx\n\t");
54}
55