git.cappig.dev / apheleiaOS.git master

1
#define APHELEIA_SETJMP_NO_MACRO
2
3
#include <setjmp.h>
4
5
// clang-format off
6
#if defined(__riscv) && __riscv_xlen == 64
7
__asm__(
8
    ".globl setjmp\n"
9
    "setjmp:\n"
10
    "sd ra, 0(a0)\n"
11
    "sd s0, 8(a0)\n"
12
    "sd s1, 16(a0)\n"
13
    "sd s2, 24(a0)\n"
14
    "sd s3, 32(a0)\n"
15
    "sd s4, 40(a0)\n"
16
    "sd s5, 48(a0)\n"
17
    "sd s6, 56(a0)\n"
18
    "sd s7, 64(a0)\n"
19
    "sd s8, 72(a0)\n"
20
    "sd s9, 80(a0)\n"
21
    "sd s10, 88(a0)\n"
22
    "sd s11, 96(a0)\n"
23
    "sd sp, 104(a0)\n"
24
    "li a0, 0\n"
25
    "ret\n"
26
    "\n"
27
    ".globl longjmp\n"
28
    "longjmp:\n"
29
    "mv t0, a0\n"
30
    "mv t1, a1\n"
31
    "bnez t1, 0f\n"
32
    "li t1, 1\n"
33
    "0:\n"
34
    "ld ra, 0(t0)\n"
35
    "ld s0, 8(t0)\n"
36
    "ld s1, 16(t0)\n"
37
    "ld s2, 24(t0)\n"
38
    "ld s3, 32(t0)\n"
39
    "ld s4, 40(t0)\n"
40
    "ld s5, 48(t0)\n"
41
    "ld s6, 56(t0)\n"
42
    "ld s7, 64(t0)\n"
43
    "ld s8, 72(t0)\n"
44
    "ld s9, 80(t0)\n"
45
    "ld s10, 88(t0)\n"
46
    "ld s11, 96(t0)\n"
47
    "ld sp, 104(t0)\n"
48
    "mv a0, t1\n"
49
    "jr ra\n"
50
);
51
#elif defined(__riscv) && __riscv_xlen == 32
52
__asm__(
53
    ".globl setjmp\n"
54
    "setjmp:\n"
55
    "sw ra, 0(a0)\n"
56
    "sw s0, 4(a0)\n"
57
    "sw s1, 8(a0)\n"
58
    "sw s2, 12(a0)\n"
59
    "sw s3, 16(a0)\n"
60
    "sw s4, 20(a0)\n"
61
    "sw s5, 24(a0)\n"
62
    "sw s6, 28(a0)\n"
63
    "sw s7, 32(a0)\n"
64
    "sw s8, 36(a0)\n"
65
    "sw s9, 40(a0)\n"
66
    "sw s10, 44(a0)\n"
67
    "sw s11, 48(a0)\n"
68
    "sw sp, 52(a0)\n"
69
    "li a0, 0\n"
70
    "ret\n"
71
    "\n"
72
    ".globl longjmp\n"
73
    "longjmp:\n"
74
    "mv t0, a0\n"
75
    "mv t1, a1\n"
76
    "bnez t1, 0f\n"
77
    "li t1, 1\n"
78
    "0:\n"
79
    "lw ra, 0(t0)\n"
80
    "lw s0, 4(t0)\n"
81
    "lw s1, 8(t0)\n"
82
    "lw s2, 12(t0)\n"
83
    "lw s3, 16(t0)\n"
84
    "lw s4, 20(t0)\n"
85
    "lw s5, 24(t0)\n"
86
    "lw s6, 28(t0)\n"
87
    "lw s7, 32(t0)\n"
88
    "lw s8, 36(t0)\n"
89
    "lw s9, 40(t0)\n"
90
    "lw s10, 44(t0)\n"
91
    "lw s11, 48(t0)\n"
92
    "lw sp, 52(t0)\n"
93
    "mv a0, t1\n"
94
    "jr ra\n"
95
);
96
#elif defined(__x86_64__)
97
__asm__(
98
    ".globl setjmp\n"
99
    "setjmp:\n"
100
    "movq %rbx, 0(%rdi)\n"
101
    "movq %rbp, 8(%rdi)\n"
102
    "movq %r12, 16(%rdi)\n"
103
    "movq %r13, 24(%rdi)\n"
104
    "movq %r14, 32(%rdi)\n"
105
    "movq %r15, 40(%rdi)\n"
106
    "movq (%rsp), %rax\n"
107
    "movq %rax, 48(%rdi)\n"
108
    "leaq 8(%rsp), %rax\n"
109
    "movq %rax, 56(%rdi)\n"
110
    "xorl %eax, %eax\n"
111
    "ret\n"
112
    "\n"
113
    ".globl longjmp\n"
114
    "longjmp:\n"
115
    "movq %rdi, %rdx\n"
116
    "movl %esi, %eax\n"
117
    "testl %eax, %eax\n"
118
    "jnz 0f\n"
119
    "movl $1, %eax\n"
120
    "0:\n"
121
    "movq 0(%rdx), %rbx\n"
122
    "movq 8(%rdx), %rbp\n"
123
    "movq 16(%rdx), %r12\n"
124
    "movq 24(%rdx), %r13\n"
125
    "movq 32(%rdx), %r14\n"
126
    "movq 40(%rdx), %r15\n"
127
    "movq 56(%rdx), %rsp\n"
128
    "jmp *48(%rdx)\n"
129
);
130
#elif defined(__i386__)
131
__asm__(
132
    ".globl setjmp\n"
133
    "setjmp:\n"
134
    "movl 4(%esp), %edx\n"
135
    "movl %ebx, 0(%edx)\n"
136
    "movl %esi, 4(%edx)\n"
137
    "movl %edi, 8(%edx)\n"
138
    "movl %ebp, 12(%edx)\n"
139
    "movl (%esp), %eax\n"
140
    "movl %eax, 16(%edx)\n"
141
    "leal 4(%esp), %eax\n"
142
    "movl %eax, 20(%edx)\n"
143
    "xorl %eax, %eax\n"
144
    "ret\n"
145
    "\n"
146
    ".globl longjmp\n"
147
    "longjmp:\n"
148
    "movl 4(%esp), %edx\n"
149
    "movl 8(%esp), %eax\n"
150
    "testl %eax, %eax\n"
151
    "jnz 0f\n"
152
    "movl $1, %eax\n"
153
    "0:\n"
154
    "movl 0(%edx), %ebx\n"
155
    "movl 4(%edx), %esi\n"
156
    "movl 8(%edx), %edi\n"
157
    "movl 12(%edx), %ebp\n"
158
    "movl 20(%edx), %esp\n"
159
    "jmp *16(%edx)\n"
160
);
161
#else
162
#error "Unsupported architecture"
163
#endif
164
// clang-format on