#include <machine/asm.h>
#include "assym.h"
#if defined(__i386__)
ENTRY(breakpoint)
pushl %ebp
movl %esp, %ebp
int $0x03
popl %ebp
ret
END(breakpoint)
#elif defined(__amd64__)
ENTRY(breakpoint)
.byte 0xcc
ret
ENTRY(setjmp)
movq %rdi,%rax
movq %rbx,(%rax)
movq %rsp,8(%rax)
movq %rbp,16(%rax)
movq %r12,24(%rax)
movq %r13,32(%rax)
movq %r14,40(%rax)
movq %r15,48(%rax)
movq (%rsp),%rdx
movq %rdx,56(%rax)
xorl %eax,%eax
ret
END(setjmp)
ENTRY(longjmp)
movq %rdi,%rax
movq (%rax),%rbx
movq 8(%rax),%rsp
movq 16(%rax),%rbp
movq 24(%rax),%r12
movq 32(%rax),%r13
movq 40(%rax),%r14
movq 48(%rax),%r15
movq 56(%rax),%rdx
movq %rdx,(%rsp)
movl $1,%eax
ret
END(longjmp)
#elif defined(__arm__)
ENTRY(breakpoint)
BKPT_ASM
mov pc, lr
#error implement setjmp/longjmp for arm32
#else
#error port me
#endif