mirror of
https://github.com/SerenityOS/serenity.git
synced 2026-11-07 04:29:30 -10:00
84 lines
2.2 KiB
ArmAsm
84 lines
2.2 KiB
ArmAsm
/*
|
|
* Copyright (c) 2021, Nico Weber <thakis@chromium.org>
|
|
* Copyright (c) 2025, Sönke Holz <sholz8530@gmail.com>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
//
|
|
// /!\ Read setjmp.h before modifying this file!
|
|
//
|
|
|
|
#define DID_SAVE_SIGNAL_MASK_SLOT (21 * 8)
|
|
#define SAVED_SIGNAL_MASK_SLOT (21 * 8 + 4)
|
|
|
|
// https://pubs.opengroup.org/onlinepubs/9699919799/functions/setjmp.html
|
|
// int setjmp(jmp_buf env)
|
|
// int _setjmp(jmp_buf env)
|
|
.global _setjmp
|
|
.global setjmp
|
|
_setjmp:
|
|
setjmp:
|
|
mov x1, #0 // Set savemask argument to 0
|
|
|
|
// https://pubs.opengroup.org/onlinepubs/9699919799/functions/sigsetjmp.html
|
|
// int sigsetjmp(sigjmp_buf env, int savemask)
|
|
.global sigsetjmp
|
|
sigsetjmp:
|
|
str w1, [x0, #DID_SAVE_SIGNAL_MASK_SLOT] // Store savemask into did_save_signal_mask
|
|
str wzr, [x0, #SAVED_SIGNAL_MASK_SLOT] // Clear saved_signal_mask
|
|
cbz w1, .Lsaveregs
|
|
|
|
stp x0, lr, [sp, #-16]! // Prepare ABI-compliant call to sigprocmask
|
|
|
|
add x2, x0, #SAVED_SIGNAL_MASK_SLOT // Set argument oldset
|
|
mov x1, #0 // Set argument set
|
|
mov x0, #0 // Set argument how
|
|
bl sigprocmask
|
|
|
|
ldp x0, lr, [sp], #16
|
|
|
|
.Lsaveregs:
|
|
stp x19, x20, [x0, #(0 * 8)] // Save registers
|
|
stp x21, x22, [x0, #(2 * 8)]
|
|
stp x23, x24, [x0, #(4 * 8)]
|
|
stp x25, x26, [x0, #(6 * 8)]
|
|
stp x27, x28, [x0, #(8 * 8)]
|
|
stp x29, x30, [x0, #(10 * 8)]
|
|
|
|
stp d8, d9, [x0, #(12 * 8)]
|
|
stp d10, d11, [x0, #(14 * 8)]
|
|
stp d12, d13, [x0, #(16 * 8)]
|
|
stp d14, d15, [x0, #(18 * 8)]
|
|
|
|
mov x1, sp
|
|
str x1, [x0, #(20 * 8)]
|
|
|
|
mov x0, #0
|
|
ret
|
|
|
|
.global _longjmp
|
|
.global longjmp
|
|
_longjmp:
|
|
longjmp:
|
|
ldp x19, x20, [x0, #(0 * 8)] // Restore registers
|
|
ldp x21, x22, [x0, #(2 * 8)]
|
|
ldp x23, x24, [x0, #(4 * 8)]
|
|
ldp x25, x26, [x0, #(6 * 8)]
|
|
ldp x27, x28, [x0, #(8 * 8)]
|
|
ldp x29, x30, [x0, #(10 * 8)]
|
|
|
|
ldp d8, d9, [x0, #(12 * 8)]
|
|
ldp d10, d11, [x0, #(14 * 8)]
|
|
ldp d12, d13, [x0, #(16 * 8)]
|
|
ldp d14, d15, [x0, #(18 * 8)]
|
|
|
|
ldr x2, [x0, #(20 * 8)]
|
|
mov sp, x2
|
|
|
|
mov x0, x1
|
|
cbnz x0, .Lnonzero
|
|
mov x0, #1
|
|
.Lnonzero:
|
|
ret
|