1d422e6f9SAndrew Turner/*- 2d422e6f9SAndrew Turner * Copyright (c) 2014 Andrew Turner 3d422e6f9SAndrew Turner * Copyright (c) 2014 The FreeBSD Foundation 4d422e6f9SAndrew Turner * 5d422e6f9SAndrew Turner * Portions of this software were developed by Andrew Turner 6d422e6f9SAndrew Turner * under sponsorship from the FreeBSD Foundation 7d422e6f9SAndrew Turner * 8d422e6f9SAndrew Turner * Redistribution and use in source and binary forms, with or without 9d422e6f9SAndrew Turner * modification, are permitted provided that the following conditions 10d422e6f9SAndrew Turner * are met: 11d422e6f9SAndrew Turner * 1. Redistributions of source code must retain the above copyright 12d422e6f9SAndrew Turner * notice, this list of conditions and the following disclaimer. 13d422e6f9SAndrew Turner * 2. Redistributions in binary form must reproduce the above copyright 14d422e6f9SAndrew Turner * notice, this list of conditions and the following disclaimer in the 15d422e6f9SAndrew Turner * documentation and/or other materials provided with the distribution. 16d422e6f9SAndrew Turner * 17d422e6f9SAndrew Turner * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18d422e6f9SAndrew Turner * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19d422e6f9SAndrew Turner * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20d422e6f9SAndrew Turner * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21d422e6f9SAndrew Turner * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22d422e6f9SAndrew Turner * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23d422e6f9SAndrew Turner * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24d422e6f9SAndrew Turner * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25d422e6f9SAndrew Turner * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26d422e6f9SAndrew Turner * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27d422e6f9SAndrew Turner * SUCH DAMAGE. 28d422e6f9SAndrew Turner * 29d422e6f9SAndrew Turner */ 30d422e6f9SAndrew Turner 31d422e6f9SAndrew Turner#include <machine/asm.h> 32d422e6f9SAndrew Turner#include <machine/setjmp.h> 33*fd5aaf2eSAndrew Turner#include <sys/elf_common.h> 34d422e6f9SAndrew Turner 35d422e6f9SAndrew TurnerENTRY(_setjmp) 36d422e6f9SAndrew Turner /* Store the magic value and stack pointer */ 37d422e6f9SAndrew Turner ldr x8, .Lmagic 38d422e6f9SAndrew Turner mov x9, sp 39d422e6f9SAndrew Turner stp x8, x9, [x0], #16 40d422e6f9SAndrew Turner 41d422e6f9SAndrew Turner /* Store the general purpose registers and lr */ 42d422e6f9SAndrew Turner stp x19, x20, [x0], #16 43d422e6f9SAndrew Turner stp x21, x22, [x0], #16 44d422e6f9SAndrew Turner stp x23, x24, [x0], #16 45d422e6f9SAndrew Turner stp x25, x26, [x0], #16 46d422e6f9SAndrew Turner stp x27, x28, [x0], #16 47d422e6f9SAndrew Turner stp x29, lr, [x0], #16 48d422e6f9SAndrew Turner 49d422e6f9SAndrew Turner#ifndef _STANDALONE 50d422e6f9SAndrew Turner /* Store the vfp registers */ 51d422e6f9SAndrew Turner stp d8, d9, [x0], #16 52d422e6f9SAndrew Turner stp d10, d11, [x0], #16 53d422e6f9SAndrew Turner stp d12, d13, [x0], #16 54d422e6f9SAndrew Turner stp d14, d15, [x0] 55d422e6f9SAndrew Turner#endif 56d422e6f9SAndrew Turner 57d422e6f9SAndrew Turner /* Return value */ 58d422e6f9SAndrew Turner mov x0, #0 59d422e6f9SAndrew Turner ret 60d422e6f9SAndrew Turner .align 3 61a998adbbSAndrew Turner.Lmagic: 62d422e6f9SAndrew Turner .quad _JB_MAGIC__SETJMP 63d422e6f9SAndrew TurnerEND(_setjmp) 64d422e6f9SAndrew Turner 65d422e6f9SAndrew TurnerENTRY(_longjmp) 66d422e6f9SAndrew Turner /* Check the magic value */ 67d422e6f9SAndrew Turner ldr x8, [x0], #8 68d422e6f9SAndrew Turner ldr x9, .Lmagic 69d422e6f9SAndrew Turner cmp x8, x9 70d422e6f9SAndrew Turner b.ne botch 71d422e6f9SAndrew Turner 72d422e6f9SAndrew Turner /* Restore the stack pointer */ 73d422e6f9SAndrew Turner ldr x8, [x0], #8 74d422e6f9SAndrew Turner mov sp, x8 75d422e6f9SAndrew Turner 76d422e6f9SAndrew Turner /* Restore the general purpose registers and lr */ 77d422e6f9SAndrew Turner ldp x19, x20, [x0], #16 78d422e6f9SAndrew Turner ldp x21, x22, [x0], #16 79d422e6f9SAndrew Turner ldp x23, x24, [x0], #16 80d422e6f9SAndrew Turner ldp x25, x26, [x0], #16 81d422e6f9SAndrew Turner ldp x27, x28, [x0], #16 82d422e6f9SAndrew Turner ldp x29, lr, [x0], #16 83d422e6f9SAndrew Turner 84d422e6f9SAndrew Turner#ifndef _STANDALONE 85d422e6f9SAndrew Turner /* Restore the vfp registers */ 86d422e6f9SAndrew Turner ldp d8, d9, [x0], #16 87d422e6f9SAndrew Turner ldp d10, d11, [x0], #16 88d422e6f9SAndrew Turner ldp d12, d13, [x0], #16 89d422e6f9SAndrew Turner ldp d14, d15, [x0] 90d422e6f9SAndrew Turner#endif 91d422e6f9SAndrew Turner 92d422e6f9SAndrew Turner /* Load the return value */ 939fb118beSJessica Clarke cmp x1, #0 949fb118beSJessica Clarke csinc x0, x1, xzr, ne 95d422e6f9SAndrew Turner ret 96d422e6f9SAndrew Turner 97d422e6f9SAndrew Turnerbotch: 98d422e6f9SAndrew Turner#ifdef _STANDALONE 99d422e6f9SAndrew Turner b botch 100d422e6f9SAndrew Turner#else 101d422e6f9SAndrew Turner bl _C_LABEL(longjmperror) 102d422e6f9SAndrew Turner bl _C_LABEL(abort) 103d422e6f9SAndrew Turner#endif 104d422e6f9SAndrew TurnerEND(_longjmp) 105*fd5aaf2eSAndrew Turner 106*fd5aaf2eSAndrew TurnerGNU_PROPERTY_AARCH64_FEATURE_1_NOTE(GNU_PROPERTY_AARCH64_FEATURE_1_VAL) 107