mirror of
https://github.com/RGBCube/serenity
synced 2025-05-23 17:45:07 +00:00

I think this is correct. The following registers are saved and restored: EBX, ESI, EDI, EBP, ESP and EIP.
33 lines
607 B
C++
33 lines
607 B
C++
#include <setjmp.h>
|
|
#include <assert.h>
|
|
#include <Kernel/Syscall.h>
|
|
|
|
asm(
|
|
"setjmp:\n\
|
|
movl %ebx, 0(%eax)\n\
|
|
movl %esi, 4(%eax)\n\
|
|
movl %edi, 8(%eax)\n\
|
|
movl %ebp, 12(%eax)\n\
|
|
movl %esp, 16(%eax)\n\
|
|
movl (%esp), %ecx\n\
|
|
movl %ecx, 20(%eax)\n\
|
|
xorl %eax, %eax\n\
|
|
ret\n\
|
|
");
|
|
|
|
asm(
|
|
"longjmp:\n\
|
|
xchgl %edx, %eax\n\
|
|
test %eax, %eax\n\
|
|
jnz 1f\n\
|
|
incl %eax\n\
|
|
1:\n\
|
|
mov 0(%edx), %ebx\n\
|
|
mov 4(%edx), %esi\n\
|
|
mov 8(%edx), %edi\n\
|
|
mov 12(%edx), %ebp\n\
|
|
mov 16(%edx), %ecx\n\
|
|
mov %ecx, %esp\n\
|
|
mov 20(%edx), %ecx\n\
|
|
jmp *%ecx\n\
|
|
");
|