mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
55 lines
1.0 KiB
55 lines
1.0 KiB
/* SPDX-License-Identifier: GPL-2.0 */ |
|
# |
|
# arch/x86_64/setjmp.S |
|
# |
|
# setjmp/longjmp for the x86-64 architecture |
|
# |
|
|
|
# |
|
# The jmp_buf is assumed to contain the following, in order: |
|
# %rbx |
|
# %rsp (post-return) |
|
# %rbp |
|
# %r12 |
|
# %r13 |
|
# %r14 |
|
# %r15 |
|
# <return address> |
|
# |
|
|
|
.text |
|
.align 4 |
|
.globl kernel_setjmp |
|
.type kernel_setjmp, @function |
|
kernel_setjmp: |
|
pop %rsi # Return address, and adjust the stack |
|
xorl %eax,%eax # Return value |
|
movq %rbx,(%rdi) |
|
movq %rsp,8(%rdi) # Post-return %rsp! |
|
push %rsi # Make the call/return stack happy |
|
movq %rbp,16(%rdi) |
|
movq %r12,24(%rdi) |
|
movq %r13,32(%rdi) |
|
movq %r14,40(%rdi) |
|
movq %r15,48(%rdi) |
|
movq %rsi,56(%rdi) # Return address |
|
ret |
|
|
|
.size kernel_setjmp,.-kernel_setjmp |
|
|
|
.text |
|
.align 4 |
|
.globl kernel_longjmp |
|
.type kernel_longjmp, @function |
|
kernel_longjmp: |
|
movl %esi,%eax # Return value (int) |
|
movq (%rdi),%rbx |
|
movq 8(%rdi),%rsp |
|
movq 16(%rdi),%rbp |
|
movq 24(%rdi),%r12 |
|
movq 32(%rdi),%r13 |
|
movq 40(%rdi),%r14 |
|
movq 48(%rdi),%r15 |
|
jmp *56(%rdi) |
|
|
|
.size kernel_longjmp,.-kernel_longjmp
|
|
|