mirror of
https://github.com/BoredDevNL/BoredOS.git
synced 2026-05-15 18:58:40 +00:00
38 lines
1 KiB
C
38 lines
1 KiB
C
#include "setjmp.h"
|
|
|
|
__attribute__((weak)) int setjmp(jmp_buf env) {
|
|
__asm__ volatile(
|
|
"movq %%rbx, 0(%0)\n\t"
|
|
"movq %%rbp, 8(%0)\n\t"
|
|
"movq %%r12, 16(%0)\n\t"
|
|
"movq %%r13, 24(%0)\n\t"
|
|
"movq %%r14, 32(%0)\n\t"
|
|
"movq %%r15, 40(%0)\n\t"
|
|
"leaq 8(%%rsp), %%rax\n\t"
|
|
"movq %%rax, 48(%0)\n\t"
|
|
"movq (%%rsp), %%rax\n\t"
|
|
"movq %%rax, 56(%0)\n\t"
|
|
:
|
|
: "r"(env)
|
|
: "rax", "memory");
|
|
return 0;
|
|
}
|
|
|
|
__attribute__((weak)) void longjmp(jmp_buf env, int val) {
|
|
int r = (val == 0) ? 1 : val;
|
|
__asm__ volatile(
|
|
"movq 0(%0), %%rbx\n\t"
|
|
"movq 8(%0), %%rbp\n\t"
|
|
"movq 16(%0), %%r12\n\t"
|
|
"movq 24(%0), %%r13\n\t"
|
|
"movq 32(%0), %%r14\n\t"
|
|
"movq 40(%0), %%r15\n\t"
|
|
"movq 48(%0), %%rsp\n\t"
|
|
"movl %1, %%eax\n\t"
|
|
"movq 56(%0), %%rdx\n\t"
|
|
"jmp *%%rdx\n\t"
|
|
:
|
|
: "r"(env), "r"(r)
|
|
: "rax", "rdx", "memory");
|
|
__builtin_unreachable();
|
|
}
|