libkernaux/libc/src/asm/x86_64/setjmp.S

29 lines
722 B
ArmAsm

/**
* The code was taken from musl libc.
*
* Copyright (c) 2011 Nicholas J. Kain
* Copyright (c) 2011-2012 Rich Felker
* Copyright (c) 2022 Alexander Monakov
* Copyright (c) 2022 Alex Kotov
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
.global setjmp
.type setjmp, @function
setjmp:
mov %rbx , (%rdi) /* rdi is jmp_buf, move registers onto it */
mov %rbp , 8(%rdi)
mov %r12 , 16(%rdi)
mov %r13 , 24(%rdi)
mov %r14 , 32(%rdi)
mov %r15 , 40(%rdi)
lea 8(%rsp) , %rdx /* this is our rsp WITHOUT current ret addr */
mov %rdx , 48(%rdi)
mov (%rsp) , %rdx /* save return addr ptr for new rip */
mov %rdx , 56(%rdi)
xor %eax , %eax /* always return 0 */
ret