blob: 64397e038f8d77ad651a3bb9dd2b0c5c0b7121ff [file] [log] [blame]
// Arch specific struct definitions for setjmp/longjmp.
#pragma once
#include <common.h>
#ifdef __x86_64__
struct jmpbuf {
uintptr_t retaddr; // return address
uintreg_t rsp; // post-return rsp
uintreg_t rbp;
};
static inline void __ros_clobber_callee_regs(void)
{
asm volatile ("" : : : "rbx", "r12", "r13", "r14", "r15");
}
static inline uintptr_t jmpbuf_get_pc(struct jmpbuf *jb)
{
return jb->retaddr;
}
static inline uintptr_t jmpbuf_get_fp(struct jmpbuf *jb)
{
return jb->rbp;
}
#else
struct jmpbuf {
uintptr_t retaddr; // return address
uintreg_t esp; // post-return esp
uintreg_t ebp;
};
static inline __ros_clobber_callee_regs(void)
{
asm volatile ("" : : : "ebx", "esi", "edi");
}
static inline uintptr_t jmpbuf_get_pc(struct jmpbuf *jb)
{
return jb->retaddr;
}
static inline uintptr_t jmpbuf_get_fp(struct jmpbuf *jb)
{
return jb->ebp;
}
#endif