xref: /aosp_15_r20/bionic/libc/arch-arm64/bionic/setjmp.S (revision 8d67ca893c1523eb926b9080dbe4e2ffd2a27ba1)
1*8d67ca89SAndroid Build Coastguard Worker/*
2*8d67ca89SAndroid Build Coastguard Worker * Copyright (C) 2013 The Android Open Source Project
3*8d67ca89SAndroid Build Coastguard Worker * All rights reserved.
4*8d67ca89SAndroid Build Coastguard Worker *
5*8d67ca89SAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without
6*8d67ca89SAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions
7*8d67ca89SAndroid Build Coastguard Worker * are met:
8*8d67ca89SAndroid Build Coastguard Worker *  * Redistributions of source code must retain the above copyright
9*8d67ca89SAndroid Build Coastguard Worker *    notice, this list of conditions and the following disclaimer.
10*8d67ca89SAndroid Build Coastguard Worker *  * Redistributions in binary form must reproduce the above copyright
11*8d67ca89SAndroid Build Coastguard Worker *    notice, this list of conditions and the following disclaimer in
12*8d67ca89SAndroid Build Coastguard Worker *    the documentation and/or other materials provided with the
13*8d67ca89SAndroid Build Coastguard Worker *    distribution.
14*8d67ca89SAndroid Build Coastguard Worker *
15*8d67ca89SAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16*8d67ca89SAndroid Build Coastguard Worker * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17*8d67ca89SAndroid Build Coastguard Worker * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
18*8d67ca89SAndroid Build Coastguard Worker * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
19*8d67ca89SAndroid Build Coastguard Worker * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
20*8d67ca89SAndroid Build Coastguard Worker * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21*8d67ca89SAndroid Build Coastguard Worker * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
22*8d67ca89SAndroid Build Coastguard Worker * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23*8d67ca89SAndroid Build Coastguard Worker * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24*8d67ca89SAndroid Build Coastguard Worker * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
25*8d67ca89SAndroid Build Coastguard Worker * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26*8d67ca89SAndroid Build Coastguard Worker * SUCH DAMAGE.
27*8d67ca89SAndroid Build Coastguard Worker */
28*8d67ca89SAndroid Build Coastguard Worker
29*8d67ca89SAndroid Build Coastguard Worker#include <private/bionic_asm.h>
30*8d67ca89SAndroid Build Coastguard Worker#include <private/bionic_constants.h>
31*8d67ca89SAndroid Build Coastguard Worker
32*8d67ca89SAndroid Build Coastguard Worker// According to AARCH64 PCS document we need to save the following
33*8d67ca89SAndroid Build Coastguard Worker// registers:
34*8d67ca89SAndroid Build Coastguard Worker//
35*8d67ca89SAndroid Build Coastguard Worker// Core     x19 - x30, sp (see section 5.1.1)
36*8d67ca89SAndroid Build Coastguard Worker// VFP      d8 - d15 (see section 5.1.2)
37*8d67ca89SAndroid Build Coastguard Worker//
38*8d67ca89SAndroid Build Coastguard Worker// NOTE: All the registers saved here will have 64 bit vales.
39*8d67ca89SAndroid Build Coastguard Worker//       AAPCS mandates that the higher part of q registers do not need to
40*8d67ca89SAndroid Build Coastguard Worker//       be saved by the callee.
41*8d67ca89SAndroid Build Coastguard Worker//
42*8d67ca89SAndroid Build Coastguard Worker// The internal structure of a jmp_buf is totally private.
43*8d67ca89SAndroid Build Coastguard Worker// Current layout (changes from release to release):
44*8d67ca89SAndroid Build Coastguard Worker//
45*8d67ca89SAndroid Build Coastguard Worker// word   name            description
46*8d67ca89SAndroid Build Coastguard Worker// 0      sigflag/cookie  setjmp cookie in top 31 bits, signal mask flag in low bit
47*8d67ca89SAndroid Build Coastguard Worker// 1      sigmask         signal mask (not used with _setjmp / _longjmp)
48*8d67ca89SAndroid Build Coastguard Worker// 2      core_base       base of core registers (x18-x30, sp)
49*8d67ca89SAndroid Build Coastguard Worker// 16     float_base      base of float registers (d8-d15)
50*8d67ca89SAndroid Build Coastguard Worker// 24     checksum        checksum of core registers
51*8d67ca89SAndroid Build Coastguard Worker// 25     reserved        reserved entries (room to grow)
52*8d67ca89SAndroid Build Coastguard Worker// 32
53*8d67ca89SAndroid Build Coastguard Worker
54*8d67ca89SAndroid Build Coastguard Worker#define _JB_SIGFLAG     0
55*8d67ca89SAndroid Build Coastguard Worker#define _JB_SIGMASK     (_JB_SIGFLAG + 1)
56*8d67ca89SAndroid Build Coastguard Worker#define _JB_X30_SP      (_JB_SIGMASK + 1)
57*8d67ca89SAndroid Build Coastguard Worker#define _JB_X28_X29     (_JB_X30_SP  + 2)
58*8d67ca89SAndroid Build Coastguard Worker#define _JB_X26_X27     (_JB_X28_X29 + 2)
59*8d67ca89SAndroid Build Coastguard Worker#define _JB_X24_X25     (_JB_X26_X27 + 2)
60*8d67ca89SAndroid Build Coastguard Worker#define _JB_X22_X23     (_JB_X24_X25 + 2)
61*8d67ca89SAndroid Build Coastguard Worker#define _JB_X20_X21     (_JB_X22_X23 + 2)
62*8d67ca89SAndroid Build Coastguard Worker#define _JB_SCS_X19     (_JB_X20_X21 + 2)
63*8d67ca89SAndroid Build Coastguard Worker#define _JB_D14_D15     (_JB_SCS_X19 + 2)
64*8d67ca89SAndroid Build Coastguard Worker#define _JB_D12_D13     (_JB_D14_D15 + 2)
65*8d67ca89SAndroid Build Coastguard Worker#define _JB_D10_D11     (_JB_D12_D13 + 2)
66*8d67ca89SAndroid Build Coastguard Worker#define _JB_D8_D9       (_JB_D10_D11 + 2)
67*8d67ca89SAndroid Build Coastguard Worker#define _JB_CHECKSUM    (_JB_D8_D9 + 2)
68*8d67ca89SAndroid Build Coastguard Worker
69*8d67ca89SAndroid Build Coastguard Worker.macro m_mangle_registers reg, sp_reg
70*8d67ca89SAndroid Build Coastguard Worker  eor x3, x3, \reg
71*8d67ca89SAndroid Build Coastguard Worker  eor x19, x19, \reg
72*8d67ca89SAndroid Build Coastguard Worker  eor x20, x20, \reg
73*8d67ca89SAndroid Build Coastguard Worker  eor x21, x21, \reg
74*8d67ca89SAndroid Build Coastguard Worker  eor x22, x22, \reg
75*8d67ca89SAndroid Build Coastguard Worker  eor x23, x23, \reg
76*8d67ca89SAndroid Build Coastguard Worker  eor x24, x24, \reg
77*8d67ca89SAndroid Build Coastguard Worker  eor x25, x25, \reg
78*8d67ca89SAndroid Build Coastguard Worker  eor x26, x26, \reg
79*8d67ca89SAndroid Build Coastguard Worker  eor x27, x27, \reg
80*8d67ca89SAndroid Build Coastguard Worker  eor x28, x28, \reg
81*8d67ca89SAndroid Build Coastguard Worker  eor x29, x29, \reg
82*8d67ca89SAndroid Build Coastguard Worker  eor x30, x30, \reg
83*8d67ca89SAndroid Build Coastguard Worker  eor \sp_reg, \sp_reg, \reg
84*8d67ca89SAndroid Build Coastguard Worker.endm
85*8d67ca89SAndroid Build Coastguard Worker
86*8d67ca89SAndroid Build Coastguard Worker.macro m_calculate_checksum dst, src, scratch
87*8d67ca89SAndroid Build Coastguard Worker  mov \dst, #0
88*8d67ca89SAndroid Build Coastguard Worker  .irp i,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23
89*8d67ca89SAndroid Build Coastguard Worker    ldr \scratch, [\src, #(\i * 8)]
90*8d67ca89SAndroid Build Coastguard Worker    eor \dst, \dst, \scratch
91*8d67ca89SAndroid Build Coastguard Worker  .endr
92*8d67ca89SAndroid Build Coastguard Worker.endm
93*8d67ca89SAndroid Build Coastguard Worker
94*8d67ca89SAndroid Build Coastguard Worker.macro m_unmangle_registers reg, sp_reg
95*8d67ca89SAndroid Build Coastguard Worker  m_mangle_registers \reg, sp_reg=\sp_reg
96*8d67ca89SAndroid Build Coastguard Worker.endm
97*8d67ca89SAndroid Build Coastguard Worker
98*8d67ca89SAndroid Build Coastguard WorkerENTRY_WEAK_FOR_NATIVE_BRIDGE(setjmp)
99*8d67ca89SAndroid Build Coastguard Worker  mov w1, #1
100*8d67ca89SAndroid Build Coastguard Worker  b sigsetjmp
101*8d67ca89SAndroid Build Coastguard WorkerEND(setjmp)
102*8d67ca89SAndroid Build Coastguard Worker
103*8d67ca89SAndroid Build Coastguard WorkerENTRY_WEAK_FOR_NATIVE_BRIDGE(_setjmp)
104*8d67ca89SAndroid Build Coastguard Worker  mov w1, #0
105*8d67ca89SAndroid Build Coastguard Worker  b sigsetjmp
106*8d67ca89SAndroid Build Coastguard WorkerEND(_setjmp)
107*8d67ca89SAndroid Build Coastguard Worker
108*8d67ca89SAndroid Build Coastguard Worker// int sigsetjmp(sigjmp_buf env, int save_signal_mask);
109*8d67ca89SAndroid Build Coastguard WorkerENTRY_WEAK_FOR_NATIVE_BRIDGE(sigsetjmp)
110*8d67ca89SAndroid Build Coastguard Worker  paciasp
111*8d67ca89SAndroid Build Coastguard Worker  .cfi_negate_ra_state
112*8d67ca89SAndroid Build Coastguard Worker  stp x0, x30, [sp, #-16]!
113*8d67ca89SAndroid Build Coastguard Worker  .cfi_def_cfa_offset 16
114*8d67ca89SAndroid Build Coastguard Worker  .cfi_rel_offset x0, 0
115*8d67ca89SAndroid Build Coastguard Worker  .cfi_rel_offset x30, 8
116*8d67ca89SAndroid Build Coastguard Worker
117*8d67ca89SAndroid Build Coastguard Worker  // Get the cookie and store it along with the signal flag.
118*8d67ca89SAndroid Build Coastguard Worker  mov x0, x1
119*8d67ca89SAndroid Build Coastguard Worker  bl __bionic_setjmp_cookie_get
120*8d67ca89SAndroid Build Coastguard Worker  mov x1, x0
121*8d67ca89SAndroid Build Coastguard Worker  ldr x0, [sp, #0]
122*8d67ca89SAndroid Build Coastguard Worker  str x1, [x0, #(_JB_SIGFLAG * 8)]
123*8d67ca89SAndroid Build Coastguard Worker
124*8d67ca89SAndroid Build Coastguard Worker  // Do we need to save the signal mask?
125*8d67ca89SAndroid Build Coastguard Worker  tbz w1, #0, 1f
126*8d67ca89SAndroid Build Coastguard Worker
127*8d67ca89SAndroid Build Coastguard Worker  // Save the cookie for later.
128*8d67ca89SAndroid Build Coastguard Worker  stp x1, xzr, [sp, #-16]!
129*8d67ca89SAndroid Build Coastguard Worker  .cfi_adjust_cfa_offset 16
130*8d67ca89SAndroid Build Coastguard Worker
131*8d67ca89SAndroid Build Coastguard Worker  // Save current signal mask.
132*8d67ca89SAndroid Build Coastguard Worker  // The 'how' argument is ignored if new_mask is NULL.
133*8d67ca89SAndroid Build Coastguard Worker  mov x1, #0 // NULL.
134*8d67ca89SAndroid Build Coastguard Worker  add x2, x0, #(_JB_SIGMASK * 8) // old_mask.
135*8d67ca89SAndroid Build Coastguard Worker  bl sigprocmask
136*8d67ca89SAndroid Build Coastguard Worker
137*8d67ca89SAndroid Build Coastguard Worker  ldp x1, xzr, [sp], #16
138*8d67ca89SAndroid Build Coastguard Worker  .cfi_adjust_cfa_offset -16
139*8d67ca89SAndroid Build Coastguard Worker
140*8d67ca89SAndroid Build Coastguard Worker1:
141*8d67ca89SAndroid Build Coastguard Worker  // Restore original x0 and lr.
142*8d67ca89SAndroid Build Coastguard Worker  ldp x0, x30, [sp], #16
143*8d67ca89SAndroid Build Coastguard Worker  .cfi_adjust_cfa_offset -16
144*8d67ca89SAndroid Build Coastguard Worker  .cfi_restore x0
145*8d67ca89SAndroid Build Coastguard Worker  .cfi_restore x30
146*8d67ca89SAndroid Build Coastguard Worker
147*8d67ca89SAndroid Build Coastguard Worker  // Mask off the signal flag bit.
148*8d67ca89SAndroid Build Coastguard Worker  bic x1, x1, #1
149*8d67ca89SAndroid Build Coastguard Worker
150*8d67ca89SAndroid Build Coastguard Worker  // Mask off the high bits of the shadow call stack pointer.
151*8d67ca89SAndroid Build Coastguard Worker  // We only store the low bits of x18 to avoid leaking the
152*8d67ca89SAndroid Build Coastguard Worker  // shadow call stack address into memory.
153*8d67ca89SAndroid Build Coastguard Worker  // See the SCS commentary in pthread_internal.h for more detail.
154*8d67ca89SAndroid Build Coastguard Worker  and x3, x18, #SCS_MASK
155*8d67ca89SAndroid Build Coastguard Worker
156*8d67ca89SAndroid Build Coastguard Worker  // Save core registers.
157*8d67ca89SAndroid Build Coastguard Worker  mov x10, sp
158*8d67ca89SAndroid Build Coastguard Worker  m_mangle_registers x1, sp_reg=x10
159*8d67ca89SAndroid Build Coastguard Worker  stp x30, x10, [x0, #(_JB_X30_SP  * 8)]
160*8d67ca89SAndroid Build Coastguard Worker  stp x28, x29, [x0, #(_JB_X28_X29 * 8)]
161*8d67ca89SAndroid Build Coastguard Worker  stp x26, x27, [x0, #(_JB_X26_X27 * 8)]
162*8d67ca89SAndroid Build Coastguard Worker  stp x24, x25, [x0, #(_JB_X24_X25 * 8)]
163*8d67ca89SAndroid Build Coastguard Worker  stp x22, x23, [x0, #(_JB_X22_X23 * 8)]
164*8d67ca89SAndroid Build Coastguard Worker  stp x20, x21, [x0, #(_JB_X20_X21 * 8)]
165*8d67ca89SAndroid Build Coastguard Worker  stp x3,  x19, [x0, #(_JB_SCS_X19 * 8)]
166*8d67ca89SAndroid Build Coastguard Worker  m_unmangle_registers x1, sp_reg=x10
167*8d67ca89SAndroid Build Coastguard Worker
168*8d67ca89SAndroid Build Coastguard Worker  // Save floating point registers.
169*8d67ca89SAndroid Build Coastguard Worker  stp d14, d15, [x0, #(_JB_D14_D15 * 8)]
170*8d67ca89SAndroid Build Coastguard Worker  stp d12, d13, [x0, #(_JB_D12_D13 * 8)]
171*8d67ca89SAndroid Build Coastguard Worker  stp d10, d11, [x0, #(_JB_D10_D11 * 8)]
172*8d67ca89SAndroid Build Coastguard Worker  stp d8,  d9,  [x0, #(_JB_D8_D9   * 8)]
173*8d67ca89SAndroid Build Coastguard Worker
174*8d67ca89SAndroid Build Coastguard Worker  // Calculate the checksum.
175*8d67ca89SAndroid Build Coastguard Worker  m_calculate_checksum x12, x0, x2
176*8d67ca89SAndroid Build Coastguard Worker  str x12, [x0, #(_JB_CHECKSUM * 8)]
177*8d67ca89SAndroid Build Coastguard Worker
178*8d67ca89SAndroid Build Coastguard Worker  mov w0, #0
179*8d67ca89SAndroid Build Coastguard Worker  autiasp
180*8d67ca89SAndroid Build Coastguard Worker  .cfi_negate_ra_state
181*8d67ca89SAndroid Build Coastguard Worker  ret
182*8d67ca89SAndroid Build Coastguard WorkerEND(sigsetjmp)
183*8d67ca89SAndroid Build Coastguard Worker
184*8d67ca89SAndroid Build Coastguard Worker// void siglongjmp(sigjmp_buf env, int value);
185*8d67ca89SAndroid Build Coastguard WorkerENTRY_WEAK_FOR_NATIVE_BRIDGE(siglongjmp)
186*8d67ca89SAndroid Build Coastguard Worker  // Check the checksum before doing anything.
187*8d67ca89SAndroid Build Coastguard Worker  m_calculate_checksum x12, x0, x2
188*8d67ca89SAndroid Build Coastguard Worker  ldr x2, [x0, #(_JB_CHECKSUM * 8)]
189*8d67ca89SAndroid Build Coastguard Worker  cmp x2, x12
190*8d67ca89SAndroid Build Coastguard Worker  bne __bionic_setjmp_checksum_mismatch
191*8d67ca89SAndroid Build Coastguard Worker
192*8d67ca89SAndroid Build Coastguard Worker  // Update stack memory tags (MTE + hwasan).
193*8d67ca89SAndroid Build Coastguard Worker  stp x0, x30, [sp, #-16]!
194*8d67ca89SAndroid Build Coastguard Worker  .cfi_adjust_cfa_offset 16
195*8d67ca89SAndroid Build Coastguard Worker  .cfi_rel_offset x0, 0
196*8d67ca89SAndroid Build Coastguard Worker  .cfi_rel_offset x30, 8
197*8d67ca89SAndroid Build Coastguard Worker  mov x19, x1 // Save 'value'.
198*8d67ca89SAndroid Build Coastguard Worker
199*8d67ca89SAndroid Build Coastguard Worker  // load and unmangle destination SP
200*8d67ca89SAndroid Build Coastguard Worker  ldr x2, [x0, #(_JB_SIGFLAG * 8)]
201*8d67ca89SAndroid Build Coastguard Worker  bic x2, x2, #1
202*8d67ca89SAndroid Build Coastguard Worker  ldr x0, [x0, #(_JB_X30_SP  * 8 + 8)]
203*8d67ca89SAndroid Build Coastguard Worker  eor x0, x0, x2
204*8d67ca89SAndroid Build Coastguard Worker  add x1, sp, #16
205*8d67ca89SAndroid Build Coastguard Worker  bl memtag_handle_longjmp
206*8d67ca89SAndroid Build Coastguard Worker
207*8d67ca89SAndroid Build Coastguard Worker  mov x1, x19 // Restore 'value'.
208*8d67ca89SAndroid Build Coastguard Worker  // Restore original x0 and lr.
209*8d67ca89SAndroid Build Coastguard Worker  ldp x0, x30, [sp], #16
210*8d67ca89SAndroid Build Coastguard Worker  .cfi_adjust_cfa_offset -16
211*8d67ca89SAndroid Build Coastguard Worker  .cfi_restore x0
212*8d67ca89SAndroid Build Coastguard Worker  .cfi_restore x30
213*8d67ca89SAndroid Build Coastguard Worker
214*8d67ca89SAndroid Build Coastguard Worker  // Do we need to restore the signal mask?
215*8d67ca89SAndroid Build Coastguard Worker  ldr x2, [x0, #(_JB_SIGFLAG * 8)]
216*8d67ca89SAndroid Build Coastguard Worker  tbz w2, #0, 1f
217*8d67ca89SAndroid Build Coastguard Worker
218*8d67ca89SAndroid Build Coastguard Worker  stp x0, x30, [sp, #-16]!
219*8d67ca89SAndroid Build Coastguard Worker  .cfi_adjust_cfa_offset 16
220*8d67ca89SAndroid Build Coastguard Worker  .cfi_rel_offset x0, 0
221*8d67ca89SAndroid Build Coastguard Worker  .cfi_rel_offset x30, 8
222*8d67ca89SAndroid Build Coastguard Worker
223*8d67ca89SAndroid Build Coastguard Worker  // Restore signal mask.
224*8d67ca89SAndroid Build Coastguard Worker  mov x19, x1 // Save 'value'.
225*8d67ca89SAndroid Build Coastguard Worker
226*8d67ca89SAndroid Build Coastguard Worker  mov x2, x0
227*8d67ca89SAndroid Build Coastguard Worker  mov x0, #2 // SIG_SETMASK
228*8d67ca89SAndroid Build Coastguard Worker  add x1, x2, #(_JB_SIGMASK * 8) // new_mask.
229*8d67ca89SAndroid Build Coastguard Worker  mov x2, #0 // NULL.
230*8d67ca89SAndroid Build Coastguard Worker  bl sigprocmask
231*8d67ca89SAndroid Build Coastguard Worker  mov x1, x19 // Restore 'value'.
232*8d67ca89SAndroid Build Coastguard Worker
233*8d67ca89SAndroid Build Coastguard Worker  // Restore original x0 and lr.
234*8d67ca89SAndroid Build Coastguard Worker  ldp x0, x30, [sp], #16
235*8d67ca89SAndroid Build Coastguard Worker  .cfi_adjust_cfa_offset -16
236*8d67ca89SAndroid Build Coastguard Worker  .cfi_restore x0
237*8d67ca89SAndroid Build Coastguard Worker  .cfi_restore x30
238*8d67ca89SAndroid Build Coastguard Worker
239*8d67ca89SAndroid Build Coastguard Worker  ldr x2, [x0, #(_JB_SIGFLAG * 8)]
240*8d67ca89SAndroid Build Coastguard Worker1:
241*8d67ca89SAndroid Build Coastguard Worker  // Restore core registers.
242*8d67ca89SAndroid Build Coastguard Worker  bic x2, x2, #1
243*8d67ca89SAndroid Build Coastguard Worker  // x30 was saved with PAC to jmp_buf in sigsetjmp().
244*8d67ca89SAndroid Build Coastguard Worker  ldp x30, x10, [x0, #(_JB_X30_SP  * 8)]
245*8d67ca89SAndroid Build Coastguard Worker  .cfi_negate_ra_state
246*8d67ca89SAndroid Build Coastguard Worker  ldp x28, x29, [x0, #(_JB_X28_X29 * 8)]
247*8d67ca89SAndroid Build Coastguard Worker  ldp x26, x27, [x0, #(_JB_X26_X27 * 8)]
248*8d67ca89SAndroid Build Coastguard Worker  ldp x24, x25, [x0, #(_JB_X24_X25 * 8)]
249*8d67ca89SAndroid Build Coastguard Worker  ldp x22, x23, [x0, #(_JB_X22_X23 * 8)]
250*8d67ca89SAndroid Build Coastguard Worker  ldp x20, x21, [x0, #(_JB_X20_X21 * 8)]
251*8d67ca89SAndroid Build Coastguard Worker  ldp x3,  x19, [x0, #(_JB_SCS_X19 * 8)]
252*8d67ca89SAndroid Build Coastguard Worker  m_unmangle_registers x2, sp_reg=x10
253*8d67ca89SAndroid Build Coastguard Worker  mov sp, x10
254*8d67ca89SAndroid Build Coastguard Worker
255*8d67ca89SAndroid Build Coastguard Worker  // Restore the low bits of the shadow call stack pointer.
256*8d67ca89SAndroid Build Coastguard Worker  and x18, x18, #~SCS_MASK
257*8d67ca89SAndroid Build Coastguard Worker  orr x18, x3, x18
258*8d67ca89SAndroid Build Coastguard Worker
259*8d67ca89SAndroid Build Coastguard Worker  stp x0, x1, [sp, #-16]!
260*8d67ca89SAndroid Build Coastguard Worker  .cfi_adjust_cfa_offset 16
261*8d67ca89SAndroid Build Coastguard Worker  .cfi_rel_offset x0, 0
262*8d67ca89SAndroid Build Coastguard Worker  .cfi_rel_offset x1, 8
263*8d67ca89SAndroid Build Coastguard Worker  stp x30, xzr, [sp, #-16]!
264*8d67ca89SAndroid Build Coastguard Worker  .cfi_adjust_cfa_offset 16
265*8d67ca89SAndroid Build Coastguard Worker  .cfi_rel_offset x30, 0
266*8d67ca89SAndroid Build Coastguard Worker  ldr x0, [x0, #(_JB_SIGFLAG * 8)]
267*8d67ca89SAndroid Build Coastguard Worker  bl __bionic_setjmp_cookie_check
268*8d67ca89SAndroid Build Coastguard Worker  ldp x30, xzr, [sp], #16
269*8d67ca89SAndroid Build Coastguard Worker  .cfi_adjust_cfa_offset -16
270*8d67ca89SAndroid Build Coastguard Worker  .cfi_restore x30
271*8d67ca89SAndroid Build Coastguard Worker  ldp x0, x1, [sp], #16
272*8d67ca89SAndroid Build Coastguard Worker  .cfi_adjust_cfa_offset -16
273*8d67ca89SAndroid Build Coastguard Worker  .cfi_restore x0
274*8d67ca89SAndroid Build Coastguard Worker  .cfi_restore x1
275*8d67ca89SAndroid Build Coastguard Worker
276*8d67ca89SAndroid Build Coastguard Worker  // Restore floating point registers.
277*8d67ca89SAndroid Build Coastguard Worker  ldp d14, d15, [x0, #(_JB_D14_D15 * 8)]
278*8d67ca89SAndroid Build Coastguard Worker  ldp d12, d13, [x0, #(_JB_D12_D13 * 8)]
279*8d67ca89SAndroid Build Coastguard Worker  ldp d10, d11, [x0, #(_JB_D10_D11 * 8)]
280*8d67ca89SAndroid Build Coastguard Worker  ldp d8,  d9,  [x0, #(_JB_D8_D9   * 8)]
281*8d67ca89SAndroid Build Coastguard Worker
282*8d67ca89SAndroid Build Coastguard Worker  // Set return value.
283*8d67ca89SAndroid Build Coastguard Worker  cmp w1, wzr
284*8d67ca89SAndroid Build Coastguard Worker  csinc w0, w1, wzr, ne
285*8d67ca89SAndroid Build Coastguard Worker  autiasp
286*8d67ca89SAndroid Build Coastguard Worker  .cfi_negate_ra_state
287*8d67ca89SAndroid Build Coastguard Worker  ret
288*8d67ca89SAndroid Build Coastguard WorkerEND(siglongjmp)
289*8d67ca89SAndroid Build Coastguard Worker
290*8d67ca89SAndroid Build Coastguard WorkerALIAS_SYMBOL_WEAK_FOR_NATIVE_BRIDGE(longjmp, siglongjmp)
291*8d67ca89SAndroid Build Coastguard WorkerALIAS_SYMBOL_WEAK_FOR_NATIVE_BRIDGE(_longjmp, siglongjmp)
292*8d67ca89SAndroid Build Coastguard Worker
293*8d67ca89SAndroid Build Coastguard WorkerNOTE_GNU_PROPERTY()
294