-rw-r--r-- 2308 saferewrite-20250228/setjmp.s raw
/* Copyright 2011-2012 Nicholas J. Kain, licensed under standard MIT license */
// 2025-02-24: some tweaks from djb
.global ___longjmp
.global __longjmp
.global _longjmp
.global longjmp
.type ___longjmp,@function
.type __longjmp,@function
.type _longjmp,@function
.type longjmp,@function
___longjmp:
__longjmp:
_longjmp:
longjmp:
mov %rsi,%rax /* val will be longjmp return */
test %rax,%rax
jnz 1f
inc %rax /* if val==0, val=1 per longjmp semantics */
1:
movq (%rdi),%rbx /* rdi is the jmp_buf, restore regs from it */
movq 8(%rdi),%rbp
movq 16(%rdi),%r12
movq 24(%rdi),%r13
movq 32(%rdi),%r14
movq 40(%rdi),%r15
movq 48(%rdi),%rdx /* this ends up being the stack pointer */
movq %rdx,%rsp
movq 56(%rdi),%rdx /* this is the instruction pointer */
jmp *%rdx /* goto saved address without altering rsp */
.global ___setjmp
.global __setjmp
.global _setjmp
.global setjmp
.type ___setjmp,@function
.type __setjmp,@function
.type _setjmp,@function
.type setjmp,@function
___setjmp:
__setjmp:
_setjmp:
setjmp:
movq %rbx,(%rdi) /* rdi is jmp_buf, move registers onto it */
movq %rbp,8(%rdi)
movq %r12,16(%rdi)
movq %r13,24(%rdi)
movq %r14,32(%rdi)
movq %r15,40(%rdi)
leaq 8(%rsp),%rdx /* this is our rsp WITHOUT current ret addr */
movq %rdx,48(%rdi)
movq (%rsp),%rdx /* save return addr ptr for new rip */
movq %rdx,56(%rdi)
xorq %rax,%rax /* always return 0 */
ret
.global ___sigsetjmp
.global __sigsetjmp
.global _sigsetjmp
.global sigsetjmp
.type ___sigsetjmp,@function
.type __sigsetjmp,@function
.type _sigsetjmp,@function
.type sigsetjmp,@function
___sigsetjmp:
__sigsetjmp:
_sigsetjmp:
sigsetjmp:
test %rsi,%rsi
movq %rsi,64(%rdi)
jz 1f
pushq %rdi
leaq 72(%rdi),%rdx
xorq %rsi,%rsi
movq $2,%rdi
call sigprocmask
popq %rdi
1: jmp setjmp
.global ___siglongjmp
.global __siglongjmp
.global _siglongjmp
.global siglongjmp
.type ___siglongjmp,@function
.type __siglongjmp,@function
.type _siglongjmp,@function
.type siglongjmp,@function
___siglongjmp:
__siglongjmp:
_siglongjmp:
siglongjmp:
movq 64(%rdi),%rdx
test %rdx,%rdx
jz 1f
pushq %rdi
leaq 72(%rdi),%rsi
xorq %rdx,%rdx
movq $2,%rdi
call sigprocmask
popq %rdi
1: jmp longjmp
.section .note.GNU-stack,"",@progbits