macro_rules! asm_func {
($offset:expr) => {
std::arch::global_asm! {
".text",
".global crash_context_getcontext",
".hidden crash_context_getcontext",
".align 4",
".type crash_context_getcontext, @function",
"crash_context_getcontext:",
"movl 4(%esp), %eax",
"movl %ecx, 0x3c(%eax)",
"movl %edx, 0x38(%eax)",
"movl %ebx, 0x34(%eax)",
"movl %edi, 0x24(%eax)",
"movl %esi, 0x28(%eax)",
"movl %ebp, 0x2c(%eax)",
"movl (%esp), %edx",
"lea 4(%esp), %ecx",
"mov %edx, 0x4c(%eax)",
"mov %ecx, 0x30(%eax)",
"xorl %ecx, %ecx",
"movw %fs, %cx",
"mov %ecx, 0x18(%eax)",
"movl $0, 0x40(%eax)",
stringify!(leal $offset(%eax),%ecx),
"fnstenv (%ecx)",
"fldenv (%ecx)",
"mov %ecx, 0x60(%eax)",
"leal 0x6c(%eax), %edx",
"xorl %ecx, %ecx",
"push %edx",
"push %ecx",
"push %ecx",
"call sigprocmask@PLT",
"addl $12, %esp",
"movl $0, %eax",
"ret",
".size crash_context_getcontext, . - crash_context_getcontext",
options(att_syntax)
}
};
}
#[cfg(target_os = "linux")]
asm_func!(0xec);
#[cfg(target_os = "android")]
asm_func!(0x74);