mirror of
https://github.com/SerenityOS/serenity
synced 2024-09-06 17:06:31 +00:00
LibC: Implement setjmp() and longjmp().
I think this is correct. The following registers are saved and restored: EBX, ESI, EDI, EBP, ESP and EIP.
This commit is contained in:
parent
f34c0e414b
commit
57fb027216
|
@ -2,13 +2,32 @@
|
|||
#include <assert.h>
|
||||
#include <Kernel/Syscall.h>
|
||||
|
||||
int setjmp(jmp_buf)
|
||||
{
|
||||
//assert(false);
|
||||
return 0;
|
||||
}
|
||||
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\
|
||||
");
|
||||
|
||||
void longjmp(jmp_buf, int)
|
||||
{
|
||||
assert(false);
|
||||
}
|
||||
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\
|
||||
");
|
||||
|
|
Loading…
Reference in a new issue