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