54 lines
1.1 KiB
ArmAsm
54 lines
1.1 KiB
ArmAsm
/*
|
|
* ====================================================
|
|
* Copyright (C) 2007 by Ellips BV. All rights reserved.
|
|
*
|
|
* Permission to use, copy, modify, and distribute this
|
|
* software is freely granted, provided that this notice
|
|
* is preserved.
|
|
* ====================================================
|
|
*/
|
|
|
|
/*
|
|
** jmp_buf:
|
|
** rbx rbp r12 r13 r14 r15 rsp rip
|
|
** 0 8 16 24 32 40 48 56
|
|
*/
|
|
.global setjmp
|
|
.global longjmp
|
|
.type setjmp,@function
|
|
.type longjmp,@function
|
|
|
|
setjmp:
|
|
movq %rbx, 0 (%rdi)
|
|
movq %rbp, 8 (%rdi)
|
|
movq %r12, 16 (%rdi)
|
|
movq %r13, 24 (%rdi)
|
|
movq %r14, 32 (%rdi)
|
|
movq %r15, 40 (%rdi)
|
|
leaq 8 (%rsp), %rax
|
|
movq %rax, 48 (%rdi)
|
|
movq (%rsp), %rax
|
|
movq %rax, 56 (%rdi)
|
|
movq $0, %rax
|
|
ret
|
|
|
|
longjmp:
|
|
movq %rsi, %rax /* Return value */
|
|
test %rax, %rax
|
|
jnz L0
|
|
inc %rax /* if 0 was passed, send back 1 instead */
|
|
L0:
|
|
movq 8 (%rdi), %rbp
|
|
|
|
cli
|
|
movq 48 (%rdi), %rsp
|
|
pushq 56 (%rdi)
|
|
movq 0 (%rdi), %rbx
|
|
movq 16 (%rdi), %r12
|
|
movq 24 (%rdi), %r13
|
|
movq 32 (%rdi), %r14
|
|
movq 40 (%rdi), %r15
|
|
sti
|
|
|
|
ret
|