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