1*8d67ca89SAndroid Build Coastguard Worker /* $OpenBSD: setjmp.h,v 1.5 2005/12/13 00:35:22 millert Exp $ */ 2*8d67ca89SAndroid Build Coastguard Worker /* $NetBSD: setjmp.h,v 1.11 1994/12/20 10:35:44 cgd Exp $ */ 3*8d67ca89SAndroid Build Coastguard Worker 4*8d67ca89SAndroid Build Coastguard Worker /*- 5*8d67ca89SAndroid Build Coastguard Worker * Copyright (c) 1990, 1993 6*8d67ca89SAndroid Build Coastguard Worker * The Regents of the University of California. All rights reserved. 7*8d67ca89SAndroid Build Coastguard Worker * (c) UNIX System Laboratories, Inc. 8*8d67ca89SAndroid Build Coastguard Worker * All or some portions of this file are derived from material licensed 9*8d67ca89SAndroid Build Coastguard Worker * to the University of California by American Telephone and Telegraph 10*8d67ca89SAndroid Build Coastguard Worker * Co. or Unix System Laboratories, Inc. and are reproduced herein with 11*8d67ca89SAndroid Build Coastguard Worker * the permission of UNIX System Laboratories, Inc. 12*8d67ca89SAndroid Build Coastguard Worker * 13*8d67ca89SAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without 14*8d67ca89SAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions 15*8d67ca89SAndroid Build Coastguard Worker * are met: 16*8d67ca89SAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the above copyright 17*8d67ca89SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer. 18*8d67ca89SAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright 19*8d67ca89SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer in the 20*8d67ca89SAndroid Build Coastguard Worker * documentation and/or other materials provided with the distribution. 21*8d67ca89SAndroid Build Coastguard Worker * 3. Neither the name of the University nor the names of its contributors 22*8d67ca89SAndroid Build Coastguard Worker * may be used to endorse or promote products derived from this software 23*8d67ca89SAndroid Build Coastguard Worker * without specific prior written permission. 24*8d67ca89SAndroid Build Coastguard Worker * 25*8d67ca89SAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 26*8d67ca89SAndroid Build Coastguard Worker * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 27*8d67ca89SAndroid Build Coastguard Worker * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 28*8d67ca89SAndroid Build Coastguard Worker * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 29*8d67ca89SAndroid Build Coastguard Worker * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 30*8d67ca89SAndroid Build Coastguard Worker * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 31*8d67ca89SAndroid Build Coastguard Worker * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 32*8d67ca89SAndroid Build Coastguard Worker * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 33*8d67ca89SAndroid Build Coastguard Worker * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 34*8d67ca89SAndroid Build Coastguard Worker * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 35*8d67ca89SAndroid Build Coastguard Worker * SUCH DAMAGE. 36*8d67ca89SAndroid Build Coastguard Worker * 37*8d67ca89SAndroid Build Coastguard Worker * @(#)setjmp.h 8.2 (Berkeley) 1/21/94 38*8d67ca89SAndroid Build Coastguard Worker */ 39*8d67ca89SAndroid Build Coastguard Worker 40*8d67ca89SAndroid Build Coastguard Worker #pragma once 41*8d67ca89SAndroid Build Coastguard Worker 42*8d67ca89SAndroid Build Coastguard Worker /** 43*8d67ca89SAndroid Build Coastguard Worker * @file setjmp.h 44*8d67ca89SAndroid Build Coastguard Worker * @brief Non-local jumps. 45*8d67ca89SAndroid Build Coastguard Worker */ 46*8d67ca89SAndroid Build Coastguard Worker 47*8d67ca89SAndroid Build Coastguard Worker #include <sys/cdefs.h> 48*8d67ca89SAndroid Build Coastguard Worker 49*8d67ca89SAndroid Build Coastguard Worker #if defined(__aarch64__) 50*8d67ca89SAndroid Build Coastguard Worker /** 51*8d67ca89SAndroid Build Coastguard Worker * The size in words of an arm64 jmp_buf. Room for callee-saved registers, 52*8d67ca89SAndroid Build Coastguard Worker * including floating point, stack pointer and program counter, various 53*8d67ca89SAndroid Build Coastguard Worker * internal implementation details, and leaving some free space. 54*8d67ca89SAndroid Build Coastguard Worker * 55*8d67ca89SAndroid Build Coastguard Worker * Coincidentally matches OpenBSD, though they also save/restore the 56*8d67ca89SAndroid Build Coastguard Worker * floating point status register too. 57*8d67ca89SAndroid Build Coastguard Worker */ 58*8d67ca89SAndroid Build Coastguard Worker #define _JBLEN 32 59*8d67ca89SAndroid Build Coastguard Worker #elif defined(__arm__) 60*8d67ca89SAndroid Build Coastguard Worker /** The size in words of an arm32 jmp_buf. Inherited from OpenBSD. */ 61*8d67ca89SAndroid Build Coastguard Worker #define _JBLEN 64 62*8d67ca89SAndroid Build Coastguard Worker #elif defined(__i386__) 63*8d67ca89SAndroid Build Coastguard Worker /** The size in words of an x86 jmp_buf. Inherited from OpenBSD. */ 64*8d67ca89SAndroid Build Coastguard Worker #define _JBLEN 10 65*8d67ca89SAndroid Build Coastguard Worker #elif defined(__riscv) 66*8d67ca89SAndroid Build Coastguard Worker /** 67*8d67ca89SAndroid Build Coastguard Worker * The size in words of a riscv64 jmp_buf. Room for callee-saved registers, 68*8d67ca89SAndroid Build Coastguard Worker * including floating point, stack pointer and program counter, various 69*8d67ca89SAndroid Build Coastguard Worker * internal implementation details, and leaving lots of free space. 70*8d67ca89SAndroid Build Coastguard Worker * 71*8d67ca89SAndroid Build Coastguard Worker * Deliberately very large given the uncertainty around the final form of 72*8d67ca89SAndroid Build Coastguard Worker * hardware shadow stack, and the fact that x86-64 glibc needed to steal 73*8d67ca89SAndroid Build Coastguard Worker * space from their enormous sigset_t (which we don't have) to be able to 74*8d67ca89SAndroid Build Coastguard Worker * implement the CET shadow stack. 75*8d67ca89SAndroid Build Coastguard Worker */ 76*8d67ca89SAndroid Build Coastguard Worker #define _JBLEN 64 77*8d67ca89SAndroid Build Coastguard Worker #elif defined(__x86_64__) 78*8d67ca89SAndroid Build Coastguard Worker /** The size in words of an x86-64 jmp_buf. Inherited from OpenBSD. */ 79*8d67ca89SAndroid Build Coastguard Worker #define _JBLEN 11 80*8d67ca89SAndroid Build Coastguard Worker #endif 81*8d67ca89SAndroid Build Coastguard Worker 82*8d67ca89SAndroid Build Coastguard Worker /** The type of the buffer used by sigsetjmp()/siglongjmp(). */ 83*8d67ca89SAndroid Build Coastguard Worker typedef long sigjmp_buf[_JBLEN + 1]; 84*8d67ca89SAndroid Build Coastguard Worker 85*8d67ca89SAndroid Build Coastguard Worker /** The type of the buffer used by setjmp()/longjmp(). */ 86*8d67ca89SAndroid Build Coastguard Worker typedef long jmp_buf[_JBLEN]; 87*8d67ca89SAndroid Build Coastguard Worker 88*8d67ca89SAndroid Build Coastguard Worker #undef _JBLEN 89*8d67ca89SAndroid Build Coastguard Worker 90*8d67ca89SAndroid Build Coastguard Worker __BEGIN_DECLS 91*8d67ca89SAndroid Build Coastguard Worker 92*8d67ca89SAndroid Build Coastguard Worker /** 93*8d67ca89SAndroid Build Coastguard Worker * Equivalent to sigsetjmp() with the second argument 0, so that the signal 94*8d67ca89SAndroid Build Coastguard Worker * mask is not saved. 95*8d67ca89SAndroid Build Coastguard Worker */ 96*8d67ca89SAndroid Build Coastguard Worker int _setjmp(jmp_buf __env) __returns_twice; 97*8d67ca89SAndroid Build Coastguard Worker 98*8d67ca89SAndroid Build Coastguard Worker /** Equivalent to siglongjmp(). */ 99*8d67ca89SAndroid Build Coastguard Worker __noreturn void _longjmp(jmp_buf __env, int __value); 100*8d67ca89SAndroid Build Coastguard Worker 101*8d67ca89SAndroid Build Coastguard Worker /** 102*8d67ca89SAndroid Build Coastguard Worker * Equivalent to sigsetjmp() with the second argument 1, so that the signal 103*8d67ca89SAndroid Build Coastguard Worker * mask is saved. 104*8d67ca89SAndroid Build Coastguard Worker */ 105*8d67ca89SAndroid Build Coastguard Worker int setjmp(jmp_buf __env) __returns_twice; 106*8d67ca89SAndroid Build Coastguard Worker 107*8d67ca89SAndroid Build Coastguard Worker /** C11 says setjmp() must be a macro, but Android already had a function. */ 108*8d67ca89SAndroid Build Coastguard Worker #define setjmp(__env) setjmp(__env) 109*8d67ca89SAndroid Build Coastguard Worker 110*8d67ca89SAndroid Build Coastguard Worker /** Equivalent to siglongjmp(). */ 111*8d67ca89SAndroid Build Coastguard Worker __noreturn void longjmp(jmp_buf __env, int __value); 112*8d67ca89SAndroid Build Coastguard Worker 113*8d67ca89SAndroid Build Coastguard Worker /** 114*8d67ca89SAndroid Build Coastguard Worker * [sigsetjmp(3)](https://man7.org/linux/man-pages/man3/sigsetjmp.3.html) 115*8d67ca89SAndroid Build Coastguard Worker * sets the target of a future siglongjmp() call, saving or not saving the 116*8d67ca89SAndroid Build Coastguard Worker * current signal mask based on the second argument. 117*8d67ca89SAndroid Build Coastguard Worker * 118*8d67ca89SAndroid Build Coastguard Worker * Returns 0 when first called, and returns the value passed to siglongjmp() 119*8d67ca89SAndroid Build Coastguard Worker * when returning here as a result of a siglongjmp() call. 120*8d67ca89SAndroid Build Coastguard Worker */ 121*8d67ca89SAndroid Build Coastguard Worker int sigsetjmp(sigjmp_buf __env, int __save_signal_mask) __returns_twice; 122*8d67ca89SAndroid Build Coastguard Worker 123*8d67ca89SAndroid Build Coastguard Worker /** 124*8d67ca89SAndroid Build Coastguard Worker * [siglongjmp(3)](https://man7.org/linux/man-pages/man3/siglongjmp.3.html) 125*8d67ca89SAndroid Build Coastguard Worker * transfers control back to the site of the sigsetjmp() call that initialized 126*8d67ca89SAndroid Build Coastguard Worker * the given jump buffer, returning the given value. 127*8d67ca89SAndroid Build Coastguard Worker * 128*8d67ca89SAndroid Build Coastguard Worker * Does not return. 129*8d67ca89SAndroid Build Coastguard Worker */ 130*8d67ca89SAndroid Build Coastguard Worker __noreturn void siglongjmp(sigjmp_buf __env, int __value); 131*8d67ca89SAndroid Build Coastguard Worker 132*8d67ca89SAndroid Build Coastguard Worker __END_DECLS 133